Browse Source

Fix after manual tests.

pull/239/head
Sebastian Stehle 8 years ago
parent
commit
bb49b1f1fd
  1. 29
      src/Squidex.Domain.Apps.Entities/Assets/Edm/EdmAssetModel.cs
  2. 2
      src/Squidex.Infrastructure.MongoDb/MongoDb/OData/PropertyBuilder.cs
  3. 29
      src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs
  4. 2
      src/Squidex/app/features/content/shared/assets-editor.component.ts
  5. 21
      src/Squidex/app/shared/services/assets.service.spec.ts
  6. 30
      src/Squidex/app/shared/services/assets.service.ts

29
src/Squidex.Domain.Apps.Entities/Assets/Edm/EdmAssetModel.cs

@ -6,6 +6,7 @@
// ========================================================================== // ==========================================================================
using Microsoft.OData.Edm; using Microsoft.OData.Edm;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Entities.Assets.Edm namespace Squidex.Domain.Apps.Entities.Assets.Edm
{ {
@ -17,20 +18,20 @@ namespace Squidex.Domain.Apps.Entities.Assets.Edm
{ {
var entityType = new EdmEntityType("Squidex", "Asset"); var entityType = new EdmEntityType("Squidex", "Asset");
entityType.AddStructuralProperty(nameof(IAssetEntity.Id), EdmPrimitiveTypeKind.Guid); entityType.AddStructuralProperty(nameof(IAssetEntity.Id).ToCamelCase(), EdmPrimitiveTypeKind.Guid);
entityType.AddStructuralProperty(nameof(IAssetEntity.AppId), EdmPrimitiveTypeKind.Guid); entityType.AddStructuralProperty(nameof(IAssetEntity.AppId).ToCamelCase(), EdmPrimitiveTypeKind.Guid);
entityType.AddStructuralProperty(nameof(IAssetEntity.Created), EdmPrimitiveTypeKind.DateTimeOffset); entityType.AddStructuralProperty(nameof(IAssetEntity.Created).ToCamelCase(), EdmPrimitiveTypeKind.DateTimeOffset);
entityType.AddStructuralProperty(nameof(IAssetEntity.CreatedBy), EdmPrimitiveTypeKind.String); entityType.AddStructuralProperty(nameof(IAssetEntity.CreatedBy).ToCamelCase(), EdmPrimitiveTypeKind.String);
entityType.AddStructuralProperty(nameof(IAssetEntity.LastModified), EdmPrimitiveTypeKind.DateTimeOffset); entityType.AddStructuralProperty(nameof(IAssetEntity.LastModified).ToCamelCase(), EdmPrimitiveTypeKind.DateTimeOffset);
entityType.AddStructuralProperty(nameof(IAssetEntity.LastModifiedBy), EdmPrimitiveTypeKind.String); entityType.AddStructuralProperty(nameof(IAssetEntity.LastModifiedBy).ToCamelCase(), EdmPrimitiveTypeKind.String);
entityType.AddStructuralProperty(nameof(IAssetEntity.Version), EdmPrimitiveTypeKind.Int64); entityType.AddStructuralProperty(nameof(IAssetEntity.Version).ToCamelCase(), EdmPrimitiveTypeKind.Int64);
entityType.AddStructuralProperty(nameof(IAssetEntity.FileName), EdmPrimitiveTypeKind.String); entityType.AddStructuralProperty(nameof(IAssetEntity.FileName).ToCamelCase(), EdmPrimitiveTypeKind.String);
entityType.AddStructuralProperty(nameof(IAssetEntity.FileSize), EdmPrimitiveTypeKind.Int64); entityType.AddStructuralProperty(nameof(IAssetEntity.FileSize).ToCamelCase(), EdmPrimitiveTypeKind.Int64);
entityType.AddStructuralProperty(nameof(IAssetEntity.FileVersion), EdmPrimitiveTypeKind.Int64); entityType.AddStructuralProperty(nameof(IAssetEntity.FileVersion).ToCamelCase(), EdmPrimitiveTypeKind.Int64);
entityType.AddStructuralProperty(nameof(IAssetEntity.IsImage), EdmPrimitiveTypeKind.Boolean); entityType.AddStructuralProperty(nameof(IAssetEntity.IsImage).ToCamelCase(), EdmPrimitiveTypeKind.Boolean);
entityType.AddStructuralProperty(nameof(IAssetEntity.MimeType), EdmPrimitiveTypeKind.String); entityType.AddStructuralProperty(nameof(IAssetEntity.MimeType).ToCamelCase(), EdmPrimitiveTypeKind.String);
entityType.AddStructuralProperty(nameof(IAssetEntity.PixelHeight), EdmPrimitiveTypeKind.Int32); entityType.AddStructuralProperty(nameof(IAssetEntity.PixelHeight).ToCamelCase(), EdmPrimitiveTypeKind.Int32);
entityType.AddStructuralProperty(nameof(IAssetEntity.PixelWidth), EdmPrimitiveTypeKind.Int32); entityType.AddStructuralProperty(nameof(IAssetEntity.PixelWidth).ToCamelCase(), EdmPrimitiveTypeKind.Int32);
var container = new EdmEntityContainer("Squidex", "Container"); var container = new EdmEntityContainer("Squidex", "Container");

2
src/Squidex.Infrastructure.MongoDb/MongoDb/OData/PropertyBuilder.cs

@ -17,7 +17,7 @@ namespace Squidex.Infrastructure.MongoDb.OData
{ {
private static readonly PropertyCalculator DefaultCalculator = parts => private static readonly PropertyCalculator DefaultCalculator = parts =>
{ {
return string.Join(".", parts); return string.Join(".", parts).ToPascalCase();
}; };
public static StringFieldDefinition<T, object> BuildFieldDefinition<T>(this QueryNode node, PropertyCalculator propertyCalculator) public static StringFieldDefinition<T, object> BuildFieldDefinition<T>(this QueryNode node, PropertyCalculator propertyCalculator)

29
src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs

@ -59,21 +59,44 @@ namespace Squidex.Areas.Api.Controllers.Assets
/// Get assets. /// Get assets.
/// </summary> /// </summary>
/// <param name="app">The name of the app.</param> /// <param name="app">The name of the app.</param>
/// <param name="ids">The optional asset ids.</param>
/// <returns> /// <returns>
/// 200 => Assets returned. /// 200 => Assets returned.
/// 404 => App not found. /// 404 => App not found.
/// </returns> /// </returns>
/// <remarks> /// <remarks>
/// Get all assets for the app. Mime types can be comma-separated, e.g. application/json,text/html. /// Get all assets for the app.
/// </remarks> /// </remarks>
[MustBeAppReader] [MustBeAppReader]
[HttpGet] [HttpGet]
[Route("apps/{app}/assets/")] [Route("apps/{app}/assets/")]
[ProducesResponseType(typeof(AssetsDto), 200)] [ProducesResponseType(typeof(AssetsDto), 200)]
[ApiCosts(1)] [ApiCosts(1)]
public async Task<IActionResult> GetAssets(string app) public async Task<IActionResult> GetAssets(string app, [FromQuery] string ids = null)
{ {
var assets = await assetRepository.QueryAsync(App.Id, Request.QueryString.ToString()); var idsList = new HashSet<Guid>();
if (!string.IsNullOrWhiteSpace(ids))
{
foreach (var id in ids.Split(','))
{
if (Guid.TryParse(id, out var guid))
{
idsList.Add(guid);
}
}
}
IResultList<IAssetEntity> assets;
if (idsList.Count > 0)
{
assets = await assetRepository.QueryAsync(App.Id, idsList);
}
else
{
assets = await assetRepository.QueryAsync(App.Id, Request.QueryString.ToString());
}
var response = new AssetsDto var response = new AssetsDto
{ {

2
src/Squidex/app/features/content/shared/assets-editor.component.ts

@ -68,7 +68,7 @@ export class AssetsEditorComponent implements ControlValueAccessor, OnDestroy, O
if (Types.isArrayOfString(value) && value.length > 0) { if (Types.isArrayOfString(value) && value.length > 0) {
const assetIds: string[] = value; const assetIds: string[] = value;
this.assetsService.getAssets(this.ctx.appName, 10000, 0, undefined, undefined, value) this.assetsService.getAssets(this.ctx.appName, 0, 0, undefined, value)
.subscribe(dtos => { .subscribe(dtos => {
this.oldAssets = ImmutableArray.of(assetIds.map(id => dtos.items.find(x => x.id === id)).filter(a => !!a).map(a => a!)); this.oldAssets = ImmutableArray.of(assetIds.map(id => dtos.items.find(x => x.id === id)).filter(a => !!a).map(a => a!));
}); });

21
src/Squidex/app/shared/services/assets.service.spec.ts

@ -219,7 +219,7 @@ describe('AssetsService', () => {
assetsService.getAssets('my-app', 17, 13, 'my-query').subscribe(); assetsService.getAssets('my-app', 17, 13, 'my-query').subscribe();
const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets?$search=my-query&$top=17&$skip=13'); const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?$filter=contains(fileName,'my-query')&$top=17&$skip=13`);
expect(req.request.method).toEqual('GET'); expect(req.request.method).toEqual('GET');
expect(req.request.headers.get('If-Match')).toBeNull(); expect(req.request.headers.get('If-Match')).toBeNull();
@ -227,25 +227,12 @@ describe('AssetsService', () => {
req.flush({ total: 10, items: [] }); req.flush({ total: 10, items: [] });
})); }));
it('should append mime types to find by types', it('should append ids query to find by ids',
inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => { inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => {
assetsService.getAssets('my-app', 17, 13, undefined, ['image/png', 'image/png']).subscribe(); assetsService.getAssets('my-app', 0, 0, undefined, ['12', '23']).subscribe();
const req = httpMock.expectOne(`http://service/p/api/apps/my-app/assets?$filter=MimeType eq 'image/png' or MimeType eq 'image/png'&$top=17&$skip=13`); const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets?ids=12,23');
expect(req.request.method).toEqual('GET');
expect(req.request.headers.get('If-Match')).toBeNull();
req.flush({ total: 10, items: [] });
}));
it('should append mime types to find by ids',
inject([AssetsService, HttpTestingController], (assetsService: AssetsService, httpMock: HttpTestingController) => {
assetsService.getAssets('my-app', 17, 13, undefined, undefined, ['12', '23']).subscribe();
const req = httpMock.expectOne('http://service/p/api/apps/my-app/assets?$filter=Id eq 12 or Id eq 23&$top=17&$skip=13');
expect(req.request.method).toEqual('GET'); expect(req.request.method).toEqual('GET');
expect(req.request.headers.get('If-Match')).toBeNull(); expect(req.request.headers.get('If-Match')).toBeNull();

30
src/Squidex/app/shared/services/assets.service.ts

@ -109,30 +109,24 @@ export class AssetsService {
) { ) {
} }
public getAssets(appName: string, take: number, skip: number, query?: string, mimeTypes?: string[], ids?: string[]): Observable<AssetsDto> { public getAssets(appName: string, take: number, skip: number, query?: string, ids?: string[]): Observable<AssetsDto> {
const queries: string[] = []; let fullQuery = '';
const filters: string[] = [];
if (mimeTypes && mimeTypes.length > 0) { if (ids) {
filters.push(mimeTypes.map(mimeType => `MimeType eq '${mimeType}'`).join(' or ')); fullQuery = `ids=${ids.join(',')}`;
} } else {
const queries: string[] = [];
if (ids && ids.length > 0) { if (query && query.length > 0) {
filters.push(ids.map(id => `Id eq ${id}`).join(' or ')); queries.push(`$filter=contains(fileName,'${encodeURIComponent(query)}')`);
} }
if (filters.length > 0) { queries.push(`$top=${take}`);
queries.push(`$filter=${filters.join(' and ')}`); queries.push(`$skip=${skip}`);
}
if (query && query.length > 0) { fullQuery = queries.join('&');
queries.push(`$search=${encodeURIComponent(query)}`);
} }
queries.push(`$top=${take}`);
queries.push(`$skip=${skip}`);
const fullQuery = queries.join('&');
const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets?${fullQuery}`); const url = this.apiUrl.buildUrl(`api/apps/${appName}/assets?${fullQuery}`);

Loading…
Cancel
Save