Skip to content

Commit

Permalink
Merge pull request #7908 from abpframework/cotur/cms-kit/media
Browse files Browse the repository at this point in the history
Cms Kit - MediaDescriptor EntityType Definitions
  • Loading branch information
ilkayilknur committed Mar 3, 2021
2 parents af096a7 + b7217ab commit 4115961
Show file tree
Hide file tree
Showing 34 changed files with 2,458 additions and 77 deletions.

Large diffs are not rendered by default.

Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
using Microsoft.EntityFrameworkCore.Migrations;

namespace Volo.CmsKit.Migrations
{
public partial class Added_EntityType_to_Media : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<string>(
name: "EntityType",
table: "CmsMediaDescriptors",
type: "nvarchar(64)",
maxLength: 64,
nullable: false,
defaultValue: "");
}

protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "EntityType",
table: "CmsMediaDescriptors");
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -1475,6 +1475,11 @@ protected override void BuildModel(ModelBuilder modelBuilder)
.HasColumnType("datetime2")
.HasColumnName("DeletionTime");
b.Property<string>("EntityType")
.IsRequired()
.HasMaxLength(64)
.HasColumnType("nvarchar(64)");
b.Property<string>("ExtraProperties")
.HasColumnType("nvarchar(max)")
.HasColumnName("ExtraProperties");
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,10 @@ namespace Volo.CmsKit.Admin.MediaDescriptors
{
public class CreateMediaInputStream : RemoteStreamContent
{
[Required]
[DynamicStringLength(typeof(MediaDescriptorConsts), nameof(MediaDescriptorConsts.MaxEntityTypeLength))]
public string EntityType { get; set; }

[Required]
[DynamicStringLength(typeof(MediaDescriptorConsts), nameof(MediaDescriptorConsts.MaxNameLength))]
public string Name { get; set; }
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,13 +56,6 @@ public override void Define(IPermissionDefinitionContext context)
blogManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Update, L("Permission:BlogPostManagement.Update"));
blogManagement.AddChild(CmsKitAdminPermissions.BlogPosts.Delete, L("Permission:BlogPostManagement.Delete"));
}

if (GlobalFeatureManager.Instance.IsEnabled<MediaFeature>())
{
var mediaDescriptorManagement = cmsGroup.AddPermission(CmsKitAdminPermissions.MediaDescriptors.Default, L("Permission:MediaDescriptorManagement"));
mediaDescriptorManagement.AddChild(CmsKitAdminPermissions.MediaDescriptors.Create, L("Permission:MediaDescriptorManagement:Create"));
mediaDescriptorManagement.AddChild(CmsKitAdminPermissions.MediaDescriptors.Delete, L("Permission:MediaDescriptorManagement:Delete"));
}
}

private static LocalizableString L(string name)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,21 +5,21 @@ namespace Volo.CmsKit.Permissions
public class CmsKitAdminPermissions
{
public const string GroupName = "CmsKit";

public static class Comments
{
public const string Default = GroupName + ".Comments";
public const string Delete = Default + ".Delete";
}

public static class Tags
{
public const string Default = GroupName + ".Tags";
public const string Create = Default + ".Create";
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}

public static class Contents
{
public const string Default = GroupName + ".Contents";
Expand Down Expand Up @@ -52,12 +52,5 @@ public static class BlogPosts
public const string Update = Default + ".Update";
public const string Delete = Default + ".Delete";
}

public static class MediaDescriptors
{
public const string Default = GroupName + ".MediaDescriptors";
public const string Create = Default + ".Create";
public const string Delete = Default + ".Delete";
}
}
}
Original file line number Diff line number Diff line change
@@ -1,10 +1,39 @@
namespace Volo.CmsKit.Admin
using JetBrains.Annotations;
using Microsoft.AspNetCore.Authorization;
using System.Collections;
using System.Collections.Generic;
using System.Runtime.InteropServices.ComTypes;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Authorization;

namespace Volo.CmsKit.Admin
{
public abstract class CmsKitAdminAppServiceBase : CmsKitAppServiceBase
{
protected CmsKitAdminAppServiceBase()
{
ObjectMapperContext = typeof(CmsKitAdminApplicationModule);
}

/// <summary>
/// Checks given policies until finding granted policy. If none of them is granted, throws <see cref="AbpAuthorizationException"/>
/// </summary>
/// <param name="policies">Policies to be checked.</param>
/// <exception cref="AbpAuthorizationException">Thrown when none of policies is granted.</exception>
protected async Task CheckAnyOfPoliciesAsync([NotNull] IEnumerable<string> policies)
{
Check.NotNull(policies, nameof(policies));

foreach (var policy in policies)
{
if (await AuthorizationService.IsGrantedAsync(policy))
{
return;
}
}

throw new AbpAuthorizationException();
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@
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;

Expand Down Expand Up @@ -44,11 +46,65 @@ private void ConfigureTagOptions()
new TagEntityTypeDefiniton(
BlogPostConsts.EntityType,
LocalizableString.Create<CmsKitResource>("BlogPost"),
CmsKitAdminPermissions.BlogPosts.Update,
CmsKitAdminPermissions.BlogPosts.Update,
CmsKitAdminPermissions.BlogPosts.Update));
createPolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
},
updatePolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
},
deletePolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
}));
}
});

if (GlobalFeatureManager.Instance.IsEnabled<MediaFeature>())
{
Configure<CmsKitMediaOptions>(options =>
{
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
BlogPostConsts.EntityType,
createPolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update
},
deletePolicies: new[]
{
CmsKitAdminPermissions.BlogPosts.Create,
CmsKitAdminPermissions.BlogPosts.Update,
CmsKitAdminPermissions.BlogPosts.Delete
}));
}
if (GlobalFeatureManager.Instance.IsEnabled<PagesFeature>())
{
options.EntityTypes.AddIfNotContains(
new MediaDescriptorDefinition(
PageConsts.EntityType,
createPolicies: new[]
{
CmsKitAdminPermissions.Pages.Create,
CmsKitAdminPermissions.Pages.Update
},
deletePolicies: new[]
{
CmsKitAdminPermissions.Pages.Create,
CmsKitAdminPermissions.Pages.Update,
CmsKitAdminPermissions.Pages.Delete
}));
}
});
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,34 +10,51 @@
namespace Volo.CmsKit.Admin.MediaDescriptors
{
[RequiresGlobalFeature(typeof(MediaFeature))]
[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 CheckAnyOfPoliciesAsync(definition.CreatePolicies);

var newId = GuidGenerator.Create();
var stream = inputStream.GetStream();
var newEntity = new MediaDescriptor(newId, inputStream.Name, inputStream.ContentType, stream.Length, CurrentTenant.Id);
using (var stream = inputStream.GetStream())
{
var newEntity = await MediaDescriptorManager.CreateAsync(inputStream.EntityType, 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 CheckAnyOfPoliciesAsync(definition.DeletePolicies);

await MediaContainer.DeleteAsync(id.ToString());
await MediaDescriptorRepository.DeleteAsync(id);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public virtual async Task AddTagToEntityAsync(EntityTagCreateDto input)
{
var definition = await TagDefinitionStore.GetTagEntityTypeDefinitionAsync(input.EntityType);

await CheckPolicyAsync(definition.CreatePolicy);
await CheckAnyOfPoliciesAsync(definition.CreatePolicies);

var tag = await TagManager.GetOrAddAsync(input.EntityType, input.TagName);

Expand All @@ -46,7 +46,7 @@ public virtual async Task RemoveTagFromEntityAsync(EntityTagRemoveDto input)
{
var definition = await TagDefinitionStore.GetTagEntityTypeDefinitionAsync(input.EntityType);

await CheckPolicyAsync(definition.DeletePolicy);
await CheckAnyOfPoliciesAsync(definition.DeletePolicies);

await EntityTagManager.RemoveTagFromEntityAsync(
input.TagId,
Expand All @@ -59,7 +59,7 @@ public virtual async Task SetEntityTagsAsync(EntityTagSetDto input)
{
var definition = await TagDefinitionStore.GetTagEntityTypeDefinitionAsync(input.EntityType);

await CheckPolicyAsync(definition.UpdatePolicy);
await CheckAnyOfPoliciesAsync(definition.UpdatePolicies);

await EntityTagManager.SetEntityTagsAsync(input.EntityType, input.EntityId, input.Tags);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,6 @@ namespace Volo.CmsKit.Admin.MediaDescriptors
{
[RequiresGlobalFeature(typeof(MediaFeature))]
[RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)]
[Authorize(CmsKitAdminPermissions.MediaDescriptors.Default)]
[Area("cms-kit")]
[Route("api/cms-kit-admin/media")]
public class MediaDescriptorAdminController : CmsKitAdminController, IMediaDescriptorAdminAppService
Expand All @@ -26,7 +25,6 @@ public MediaDescriptorAdminController(IMediaDescriptorAdminAppService mediaDescr
}

[HttpPost]
[Authorize(CmsKitAdminPermissions.MediaDescriptors.Create)]
[NonAction]
public virtual Task<MediaDescriptorDto> CreateAsync(CreateMediaInputStream inputStream)
{
Expand All @@ -35,15 +33,14 @@ public virtual Task<MediaDescriptorDto> CreateAsync(CreateMediaInputStream input

[HttpDelete]
[Route("{id}")]
[Authorize(CmsKitAdminPermissions.MediaDescriptors.Delete)]
public virtual Task DeleteAsync(Guid id)
{
return MediaDescriptorAdminAppService.DeleteAsync(id);
}

[HttpPost]
[Authorize(CmsKitAdminPermissions.MediaDescriptors.Create)]
public virtual async Task<IActionResult> UploadAsync(IFormFile file)
[Route("{entityType}")]
public virtual async Task<IActionResult> UploadAsync(string entityType, IFormFile file)
{
if (file == null)
{
Expand All @@ -52,6 +49,7 @@ public virtual async Task<IActionResult> UploadAsync(IFormFile file)

var inputStream = new CreateMediaInputStream(file.OpenReadStream())
{
EntityType = entityType,
ContentType = file.ContentType,
Name = file.FileName
};
Expand Down
Original file line number Diff line number Diff line change
@@ -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
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ public static class BlogPosts
public static class MediaDescriptors
{
public const string InvalidName = "CmsKit:Media:0001";
public const string EntityTypeDoesntExist = "CmsKit:Media:0002";
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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",
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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.",
Expand Down

0 comments on commit 4115961

Please sign in to comment.