Browse Source

Autogenerate tags.

pull/310/head
Sebastian 8 years ago
parent
commit
f3fce1e045
  1. 2
      src/Squidex/Areas/Api/Controllers/Assets/AssetsController.cs
  2. 12
      src/Squidex/Areas/Api/Controllers/Assets/Models/AssetCreatedDto.cs
  3. 13
      src/Squidex/Config/Domain/EntitiesServices.cs
  4. 5
      src/Squidex/app/shared/services/assets.service.spec.ts
  5. 2
      src/Squidex/app/shared/services/assets.service.ts
  6. 53
      src/Squidex/app/shared/state/assets.state.ts

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

@ -169,7 +169,7 @@ namespace Squidex.Areas.Api.Controllers.Assets
var command = new CreateAsset { File = assetFile }; var command = new CreateAsset { File = assetFile };
var context = await CommandBus.PublishAsync(command); var context = await CommandBus.PublishAsync(command);
var result = context.Result<EntityCreatedResult<Guid>>(); var result = context.Result<AssetCreatedResult>();
var response = AssetCreatedDto.FromCommand(command, result); var response = AssetCreatedDto.FromCommand(command, result);
return StatusCode(201, response); return StatusCode(201, response);

12
src/Squidex/Areas/Api/Controllers/Assets/Models/AssetCreatedDto.cs

@ -6,10 +6,11 @@
// ========================================================================== // ==========================================================================
using System; using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Domain.Apps.Entities.Assets.Commands; using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Infrastructure; using Squidex.Infrastructure;
using Squidex.Infrastructure.Commands;
namespace Squidex.Areas.Api.Controllers.Assets.Models namespace Squidex.Areas.Api.Controllers.Assets.Models
{ {
@ -38,6 +39,12 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
[Required] [Required]
public string MimeType { get; set; } public string MimeType { get; set; }
/// <summary>
/// The default tags.
/// </summary>
[Required]
public HashSet<string> Tags { get; set; }
/// <summary> /// <summary>
/// The size of the file in bytes. /// The size of the file in bytes.
/// </summary> /// </summary>
@ -68,7 +75,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// </summary> /// </summary>
public long Version { get; set; } public long Version { get; set; }
public static AssetCreatedDto FromCommand(CreateAsset command, EntityCreatedResult<Guid> result) public static AssetCreatedDto FromCommand(CreateAsset command, AssetCreatedResult result)
{ {
var response = new AssetCreatedDto var response = new AssetCreatedDto
{ {
@ -81,6 +88,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
IsImage = command.ImageInfo != null, IsImage = command.ImageInfo != null,
PixelWidth = command.ImageInfo?.PixelWidth, PixelWidth = command.ImageInfo?.PixelWidth,
PixelHeight = command.ImageInfo?.PixelHeight, PixelHeight = command.ImageInfo?.PixelHeight,
Tags = result.Tags,
Version = result.Version Version = result.Version
}; };

13
src/Squidex/Config/Domain/EntitiesServices.cs

@ -21,6 +21,7 @@ using Squidex.Domain.Apps.Entities.Apps.Commands;
using Squidex.Domain.Apps.Entities.Apps.Indexes; using Squidex.Domain.Apps.Entities.Apps.Indexes;
using Squidex.Domain.Apps.Entities.Apps.Templates; using Squidex.Domain.Apps.Entities.Apps.Templates;
using Squidex.Domain.Apps.Entities.Assets; using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Domain.Apps.Entities.Backup; using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Domain.Apps.Entities.Contents; using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Contents.Commands; using Squidex.Domain.Apps.Entities.Contents.Commands;
@ -84,6 +85,15 @@ namespace Squidex.Config.Domain
services.AddSingletonAs<EdmModelBuilder>() services.AddSingletonAs<EdmModelBuilder>()
.AsSelf(); .AsSelf();
services.AddSingletonAs<GrainTagService>()
.As<ITagService>();
services.AddSingletonAs<FileTypeTagGenerator>()
.As<ITagGenerator<CreateAsset>>();
services.AddSingletonAs<ImageTagGenerator>()
.As<ITagGenerator<CreateAsset>>();
services.AddSingletonAs<InMemoryCommandBus>() services.AddSingletonAs<InMemoryCommandBus>()
.As<ICommandBus>(); .As<ICommandBus>();
@ -108,9 +118,6 @@ namespace Squidex.Config.Domain
services.AddSingletonAs<AssetCommandMiddleware>() services.AddSingletonAs<AssetCommandMiddleware>()
.As<ICommandMiddleware>(); .As<ICommandMiddleware>();
services.AddSingletonAs<GrainTagService>()
.As<ITagService>();
services.AddSingletonAs<GrainCommandMiddleware<AppCommand, IAppGrain>>() services.AddSingletonAs<GrainCommandMiddleware<AppCommand, IAppGrain>>()
.As<ICommandMiddleware>(); .As<ICommandMiddleware>();

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

@ -318,7 +318,8 @@ describe('AssetsService', () => {
mimeType: 'image/png', mimeType: 'image/png',
isImage: true, isImage: true,
pixelWidth: 1024, pixelWidth: 1024,
pixelHeight: 2048 pixelHeight: 2048,
tags: ['tag1', 'tag2']
}, { }, {
headers: { headers: {
etag: '2' etag: '2'
@ -339,7 +340,7 @@ describe('AssetsService', () => {
true, true,
1024, 1024,
2048, 2048,
[], ['tag1', 'tag2'],
'http://service/p/api/assets/id1', 'http://service/p/api/assets/id1',
new Version('2'))); new Version('2')));
})); }));

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

@ -232,7 +232,7 @@ export class AssetsService {
response.isImage, response.isImage,
response.pixelWidth, response.pixelWidth,
response.pixelHeight, response.pixelHeight,
[], response.tags || [],
assetUrl, assetUrl,
new Version(event.headers.get('etag')!)); new Version(event.headers.get('etag')!));

53
src/Squidex/app/shared/state/assets.state.ts

@ -94,7 +94,11 @@ export class AssetsState extends State<Snapshot> {
const assets = s.assets.pushFront(asset); const assets = s.assets.pushFront(asset);
const assetsPager = s.assetsPager.incrementCount(); const assetsPager = s.assetsPager.incrementCount();
return { ...s, assets, assetsPager }; const tags = { ...s.tags };
addTags(asset, tags);
return { ...s, assets, assetsPager, tags };
}); });
} }
@ -108,14 +112,7 @@ export class AssetsState extends State<Snapshot> {
const tags = { ...s.tags }; const tags = { ...s.tags };
const tagsSelected = { ...s.tagsSelected }; const tagsSelected = { ...s.tagsSelected };
for (let tag of asset.tags) { removeTags(asset, tags, tagsSelected);
if (tags[tag] === 1) {
delete tags[tag];
delete tagsSelected[tag];
} else {
tags[tag]--;
}
}
return { ...s, assets, assetsPager, tags, tagsSelected }; return { ...s, assets, assetsPager, tags, tagsSelected };
}); });
@ -131,24 +128,11 @@ export class AssetsState extends State<Snapshot> {
const tagsSelected = { ...s.tagsSelected }; const tagsSelected = { ...s.tagsSelected };
if (previous) { if (previous) {
for (let tag of previous.tags) { removeTags(previous, tags, tagsSelected);
if (tags[tag] === 1) {
delete tags[tag];
delete tagsSelected[tag];
} else {
tags[tag]--;
}
}
} }
if (asset) { if (asset) {
for (let tag of asset.tags) { addTags(asset, tags);
if (tags[tag]) {
tags[tag]++;
} else {
tags[tag] = 1;
}
}
} }
const assets = s.assets.replaceBy('id', asset); const assets = s.assets.replaceBy('id', asset);
@ -210,6 +194,27 @@ export class AssetsState extends State<Snapshot> {
} }
} }
function addTags(asset: AssetDto, tags: { [x: string]: number; }) {
for (let tag of asset.tags) {
if (tags[tag]) {
tags[tag]++;
} else {
tags[tag] = 1;
}
}
}
function removeTags(previous: AssetDto, tags: { [x: string]: number; }, tagsSelected: { [x: string]: boolean; }) {
for (let tag of previous.tags) {
if (tags[tag] === 1) {
delete tags[tag];
delete tagsSelected[tag];
} else {
tags[tag]--;
}
}
}
function sort(tags: { [name: string]: number }) { function sort(tags: { [name: string]: number }) {
return Object.keys(tags).sort((a, b) => { return Object.keys(tags).sort((a, b) => {
if (a < b) { if (a < b) {

Loading…
Cancel
Save