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 context = await CommandBus.PublishAsync(command);
var result = context.Result<EntityCreatedResult<Guid>>();
var result = context.Result<AssetCreatedResult>();
var response = AssetCreatedDto.FromCommand(command, result);
return StatusCode(201, response);

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

@ -6,10 +6,11 @@
// ==========================================================================
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Infrastructure;
using Squidex.Infrastructure.Commands;
namespace Squidex.Areas.Api.Controllers.Assets.Models
{
@ -38,6 +39,12 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
[Required]
public string MimeType { get; set; }
/// <summary>
/// The default tags.
/// </summary>
[Required]
public HashSet<string> Tags { get; set; }
/// <summary>
/// The size of the file in bytes.
/// </summary>
@ -68,7 +75,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
/// </summary>
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
{
@ -81,6 +88,7 @@ namespace Squidex.Areas.Api.Controllers.Assets.Models
IsImage = command.ImageInfo != null,
PixelWidth = command.ImageInfo?.PixelWidth,
PixelHeight = command.ImageInfo?.PixelHeight,
Tags = result.Tags,
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.Templates;
using Squidex.Domain.Apps.Entities.Assets;
using Squidex.Domain.Apps.Entities.Assets.Commands;
using Squidex.Domain.Apps.Entities.Backup;
using Squidex.Domain.Apps.Entities.Contents;
using Squidex.Domain.Apps.Entities.Contents.Commands;
@ -84,6 +85,15 @@ namespace Squidex.Config.Domain
services.AddSingletonAs<EdmModelBuilder>()
.AsSelf();
services.AddSingletonAs<GrainTagService>()
.As<ITagService>();
services.AddSingletonAs<FileTypeTagGenerator>()
.As<ITagGenerator<CreateAsset>>();
services.AddSingletonAs<ImageTagGenerator>()
.As<ITagGenerator<CreateAsset>>();
services.AddSingletonAs<InMemoryCommandBus>()
.As<ICommandBus>();
@ -108,9 +118,6 @@ namespace Squidex.Config.Domain
services.AddSingletonAs<AssetCommandMiddleware>()
.As<ICommandMiddleware>();
services.AddSingletonAs<GrainTagService>()
.As<ITagService>();
services.AddSingletonAs<GrainCommandMiddleware<AppCommand, IAppGrain>>()
.As<ICommandMiddleware>();

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

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

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

@ -232,7 +232,7 @@ export class AssetsService {
response.isImage,
response.pixelWidth,
response.pixelHeight,
[],
response.tags || [],
assetUrl,
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 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 tagsSelected = { ...s.tagsSelected };
for (let tag of asset.tags) {
if (tags[tag] === 1) {
delete tags[tag];
delete tagsSelected[tag];
} else {
tags[tag]--;
}
}
removeTags(asset, tags, tagsSelected);
return { ...s, assets, assetsPager, tags, tagsSelected };
});
@ -131,24 +128,11 @@ export class AssetsState extends State<Snapshot> {
const tagsSelected = { ...s.tagsSelected };
if (previous) {
for (let tag of previous.tags) {
if (tags[tag] === 1) {
delete tags[tag];
delete tagsSelected[tag];
} else {
tags[tag]--;
}
}
removeTags(previous, tags, tagsSelected);
}
if (asset) {
for (let tag of asset.tags) {
if (tags[tag]) {
tags[tag]++;
} else {
tags[tag] = 1;
}
}
addTags(asset, tags);
}
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 }) {
return Object.keys(tags).sort((a, b) => {
if (a < b) {

Loading…
Cancel
Save