Browse Source

CmsKit - Add definitions to MediaDescriptor

pull/7908/head
enisn 5 years ago
parent
commit
f2d3f62a17
  1. 26
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationModule.cs
  2. 38
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs
  3. 5
      modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationModule.cs
  4. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs
  5. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json
  6. 1
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json
  7. 2
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs
  8. 15
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/CmsKitMediaOptions.cs
  9. 43
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/DefaultMediaDescriptorDefinitionStore.cs
  10. 21
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/EntityCantHaveMediaException.cs
  11. 12
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/IMediaDescriptorDefinitionStore.cs
  12. 4
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/MediaDescriptor.cs
  13. 18
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/MediaDescriptorDefinition.cs
  14. 36
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/MediaDescriptorManager.cs
  15. 14
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/PolicySpecifiedDefinition.cs
  16. 4
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/TagEntityTypeDefiniton.cs

26
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationModule.cs

@ -7,6 +7,8 @@ using Volo.Abp.Modularity;
using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Localization;
using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Permissions;
using Volo.CmsKit.Tags;
@ -49,6 +51,30 @@ namespace Volo.CmsKit.Admin
CmsKitAdminPermissions.BlogPosts.Update));
}
});
if (GlobalFeatureManager.Instance.IsEnabled<MediaFeature>())
{
Configure<CmsKitMediaOptions>(options =>
{
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
BlogPostConsts.EntityType,
createPolicy: CmsKitAdminPermissions.BlogPosts.Update,
deletePolicy: CmsKitAdminPermissions.BlogPosts.Delete));
}
if (GlobalFeatureManager.Instance.IsEnabled<PagesFeature>())
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
PageConsts.EntityType,
createPolicy: CmsKitAdminPermissions.Pages.Update,
deletePolicy: CmsKitAdminPermissions.Pages.Delete));
}
});
}
}
}
}

38
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs

@ -13,31 +13,51 @@ namespace Volo.CmsKit.Admin.MediaDescriptors
[Authorize(CmsKitAdminPermissions.MediaDescriptors.Default)]
public class MediaDescriptorAdminAppService : CmsKitAdminAppServiceBase, IMediaDescriptorAdminAppService
{
protected readonly IBlobContainer<MediaContainer> MediaContainer;
protected readonly IMediaDescriptorRepository MediaDescriptorRepository;
public MediaDescriptorAdminAppService(IBlobContainer<MediaContainer> mediaContainer, IMediaDescriptorRepository mediaDescriptorRepository)
protected IBlobContainer<MediaContainer> MediaContainer { get; }
protected IMediaDescriptorRepository MediaDescriptorRepository { get; }
protected MediaDescriptorManager MediaDescriptorManager { get; }
protected IMediaDescriptorDefinitionStore MediaDescriptorDefinitionStore { get; }
public MediaDescriptorAdminAppService(
IBlobContainer<MediaContainer> mediaContainer,
IMediaDescriptorRepository mediaDescriptorRepository,
MediaDescriptorManager mediaDescriptorManager,
IMediaDescriptorDefinitionStore mediaDescriptorDefinitionStore)
{
MediaContainer = mediaContainer;
MediaDescriptorRepository = mediaDescriptorRepository;
MediaDescriptorManager = mediaDescriptorManager;
MediaDescriptorDefinitionStore = mediaDescriptorDefinitionStore;
}
[Authorize(CmsKitAdminPermissions.MediaDescriptors.Create)]
public virtual async Task<MediaDescriptorDto> CreateAsync(CreateMediaInputStream inputStream)
{
var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(inputStream.EntityType);
await CheckPolicyAsync(definition.CreatePolicy);
var newId = GuidGenerator.Create();
var stream = inputStream.GetStream();
var newEntity = new MediaDescriptor(newId, inputStream.EntityType, inputStream.Name, inputStream.ContentType, stream.Length, CurrentTenant.Id);
using (var stream = inputStream.GetStream())
{
var newEntity = await MediaDescriptorManager.Create(inputStream.ContentType, inputStream.Name, inputStream.ContentType, inputStream.ContentLength ?? 0);
await MediaContainer.SaveAsync(newId.ToString(), stream);
await MediaDescriptorRepository.InsertAsync(newEntity);
await MediaContainer.SaveAsync(newId.ToString(), stream);
await MediaDescriptorRepository.InsertAsync(newEntity);
return ObjectMapper.Map<MediaDescriptor, MediaDescriptorDto>(newEntity);
return ObjectMapper.Map<MediaDescriptor, MediaDescriptorDto>(newEntity);
}
}
[Authorize(CmsKitAdminPermissions.MediaDescriptors.Delete)]
public virtual async Task DeleteAsync(Guid id)
{
var mediaDescriptor = await MediaDescriptorRepository.GetAsync(id);
var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(mediaDescriptor.EntityType);
await CheckPolicyAsync(definition.DeletePolicy);
await MediaContainer.DeleteAsync(id.ToString());
await MediaDescriptorRepository.DeleteAsync(id);
}

5
modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationModule.cs

@ -1,6 +1,11 @@
using Volo.Abp.Application;
using Volo.Abp.AutoMapper;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.Modularity;
using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit
{

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs

@ -28,6 +28,7 @@
public static class MediaDescriptors
{
public const string InvalidName = "CmsKit:Media:0001";
public const string EntityTypeDoesntExist = "CmsKit:Media:0002";
}
}
}

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json

@ -20,6 +20,7 @@
"CmsKit:Media:0001": "'{Name}' is not a valid media name.",
"CmsKit:Page:0001": "The given url ({0}) already exists.",
"CmsKit:Tag:0002": "The entity is not taggable!",
"CmsKit:Media:0002": "The entity can't have media.",
"CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.",
"CommentDeletionConfirmationMessage": "This comment and all replies will be deleted!",
"Comments": "Comments",

1
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json

@ -16,6 +16,7 @@
"CmsKit:0002": "İçerik zaten mevcut!",
"CmsKit:0003": "{0} ögesi etiketlenebilir değil.",
"CmsKit:BlogPost:0001": "Aynı url etiketi zaten mevcut.",
"CmsKit:Media:0002": "Bu öge için medya eklenemez.",
"CmsKit:Page:0001": "Girilen url ({0}) kullanımdadır.",
"CmsKit:Tag:0002": "Bu öge etiketlenebilir değil.",
"CommentAuthorizationExceptionMessage": "Bu yorumları görebilmek için yetki gerekir.",

2
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Pages/PageConsts.cs

@ -2,6 +2,8 @@
{
public class PageConsts
{
public const string EntityType = "Page";
public static int MaxTitleLength { get; set; } = 256;
public static int MaxSlugLength { get; set; } = 256;

15
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/CmsKitMediaOptions.cs

@ -0,0 +1,15 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.MediaDescriptors
{
public class CmsKitMediaOptions
{
[NotNull]
public List<MediaDescriptorDefinition> EntityTypes { get; } = new();
}
}

43
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/DefaultMediaDescriptorDefinitionStore.cs

@ -0,0 +1,43 @@
using JetBrains.Annotations;
using Microsoft.Extensions.Options;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.DependencyInjection;
namespace Volo.CmsKit.MediaDescriptors
{
public class DefaultMediaDescriptorDefinitionStore : IMediaDescriptorDefinitionStore, ITransientDependency
{
protected CmsKitMediaOptions Options { get; }
public DefaultMediaDescriptorDefinitionStore(IOptions<CmsKitMediaOptions> options)
{
Options = options.Value;
}
/// <summary>
/// Gets single <see cref="MediaDescriptorDefinition"/> by entityType.
/// </summary>
/// <param name="entityType">EntityType to get definition.</param>
/// <exception cref="EntityCantHaveMediaException">Thrown when EntityType is not configured as taggable.</exception>
/// <exception cref="InvalidOperationException">More than one element satisfies the condition in predicate.</exception>
public Task<MediaDescriptorDefinition> GetDefinitionAsync([NotNull] string entityType)
{
Check.NotNullOrWhiteSpace(entityType, nameof(entityType));
var result = Options.EntityTypes.SingleOrDefault(x => x.EntityType == entityType) ??
throw new EntityCantHaveMediaException(entityType);
return Task.FromResult(result);
}
public Task<bool> IsDefinedAsync([NotNull] string entityType)
{
return Task.Run(() => Options.EntityTypes.Any(a => a.EntityType == entityType));
}
}
}

21
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/EntityCantHaveMediaException.cs

@ -0,0 +1,21 @@
using System.Runtime.Serialization;
using Volo.Abp;
namespace Volo.CmsKit.MediaDescriptors
{
public class EntityCantHaveMediaException : BusinessException
{
public EntityCantHaveMediaException(SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context)
{
}
public EntityCantHaveMediaException(string entityType)
{
EntityType = entityType;
Code = CmsKitErrorCodes.MediaDescriptors.EntityTypeDoesntExist;
WithData(nameof(entityType), EntityType);
}
public string EntityType { get; }
}
}

12
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/IMediaDescriptorDefinitionStore.cs

@ -0,0 +1,12 @@
using JetBrains.Annotations;
using System.Threading.Tasks;
namespace Volo.CmsKit.MediaDescriptors
{
public interface IMediaDescriptorDefinitionStore
{
Task<bool> IsDefinedAsync([NotNull] string entityType);
Task<MediaDescriptorDefinition> GetDefinitionAsync([NotNull] string entityType);
}
}

4
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/MediaDescriptor.cs

@ -9,7 +9,7 @@ namespace Volo.CmsKit.MediaDescriptors
{
public Guid? TenantId { get; protected set; }
public string EntityType { get; set; }
public string EntityType { get; protected set; }
public string Name { get; protected set; }
@ -22,7 +22,7 @@ namespace Volo.CmsKit.MediaDescriptors
}
public MediaDescriptor(Guid id, string entityType, string name, string mimeType, long size, Guid? tenantId = null) : base(id)
internal MediaDescriptor(Guid id, string entityType, string name, string mimeType, long size, Guid? tenantId = null) : base(id)
{
TenantId = tenantId;

18
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/MediaDescriptorDefinition.cs

@ -0,0 +1,18 @@
using JetBrains.Annotations;
namespace Volo.CmsKit.MediaDescriptors
{
public class MediaDescriptorDefinition : PolicySpecifiedDefinition
{
public MediaDescriptorDefinition(
[NotNull] string entityType,
[CanBeNull] string createPolicy = null,
[CanBeNull] string updatePolicy = null,
[CanBeNull] string deletePolicy = null) : base(entityType,
createPolicy,
updatePolicy,
deletePolicy)
{
}
}
}

36
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/MediaDescriptorManager.cs

@ -0,0 +1,36 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Domain.Services;
using Volo.CmsKit.MediaDescriptors;
namespace Volo.CmsKit.MediaDescriptors
{
public class MediaDescriptorManager : DomainService
{
protected IMediaDescriptorDefinitionStore MediaDescriptorDefinitionStore { get; }
public MediaDescriptorManager(IMediaDescriptorDefinitionStore mediaDescriptorDefinitionStore)
{
MediaDescriptorDefinitionStore = mediaDescriptorDefinitionStore;
}
public virtual async Task<MediaDescriptor> Create(string entityType, string name, string mimeType, long size)
{
if(!await MediaDescriptorDefinitionStore.IsDefinedAsync(entityType))
{
throw new EntityCantHaveMediaException(entityType);
}
return new MediaDescriptor(
GuidGenerator.Create(),
entityType,
name,
mimeType,
size,
CurrentTenant.Id);
}
}
}

14
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/PolicySpecifiedDefinition.cs

@ -1,23 +1,30 @@
using JetBrains.Annotations;
using System;
using Volo.Abp;
namespace Volo.CmsKit
{
public abstract class PolicySpecifiedDefinition
public abstract class PolicySpecifiedDefinition : IEquatable<PolicySpecifiedDefinition>
{
protected PolicySpecifiedDefinition()
{
}
public PolicySpecifiedDefinition(
[NotNull] string entityType,
[CanBeNull] string createPolicy = null,
[CanBeNull] string updatePolicy = null,
[CanBeNull] string deletePolicy = null)
{
EntityType = Check.NotNullOrEmpty(entityType, nameof(entityType));
CreatePolicy = createPolicy;
DeletePolicy = deletePolicy;
UpdatePolicy = updatePolicy;
}
[NotNull]
public string EntityType { get; set; }
[CanBeNull]
public virtual string CreatePolicy { get; set; }
@ -26,5 +33,10 @@ namespace Volo.CmsKit
[CanBeNull]
public virtual string DeletePolicy { get; set; }
public bool Equals(PolicySpecifiedDefinition other)
{
return other?.EntityType == EntityType;
}
}
}

4
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/TagEntityTypeDefiniton.cs

@ -7,8 +7,6 @@ namespace Volo.CmsKit.Tags
{
public class TagEntityTypeDefiniton : PolicySpecifiedDefinition, IEquatable<TagEntityTypeDefiniton>
{
public string EntityType { get; }
[CanBeNull]
public virtual ILocalizableString DisplayName { get; }
@ -21,7 +19,7 @@ namespace Volo.CmsKit.Tags
[CanBeNull] ILocalizableString displayName = null,
[CanBeNull] string createPolicy = null,
[CanBeNull] string updatePolicy = null,
[CanBeNull] string deletePolicy = null) : base(createPolicy, updatePolicy, deletePolicy)
[CanBeNull] string deletePolicy = null) : base(entityType, createPolicy, updatePolicy, deletePolicy)
{
EntityType = Check.NotNullOrWhiteSpace(entityType, nameof(entityType));
DisplayName = displayName;

Loading…
Cancel
Save