diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/GetMediaRequestDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/GetMediaRequestDto.cs new file mode 100644 index 0000000000..1311b306bb --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/GetMediaRequestDto.cs @@ -0,0 +1,7 @@ +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + public class GetMediaRequestDto + { + public bool Download { get; set; } = false; + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/IMediaDescriptorAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/IMediaDescriptorAdminAppService.cs new file mode 100644 index 0000000000..2fb86ba7f5 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/IMediaDescriptorAdminAppService.cs @@ -0,0 +1,19 @@ +using System; +using System.Threading.Tasks; +using Volo.Abp.Application.Services; +using Volo.Abp.Content; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + public interface IMediaDescriptorAdminAppService + : ICrudAppService< + MediaDescriptorDto, + MediaDescriptorGetListDto, + Guid, + MediaDescriptorGetListInput, + UploadMediaStreamContent, + UpdateMediaDescriptorDto> + { + Task DownloadAsync(Guid id, GetMediaRequestDto request); + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorDto.cs new file mode 100644 index 0000000000..d82eb63992 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorDto.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + public class MediaDescriptorDto : EntityDto + { + public string Name { get; set; } + + public string MimeType { get; set; } + + public int Size { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorGetListDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorGetListDto.cs new file mode 100644 index 0000000000..2be684d894 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorGetListDto.cs @@ -0,0 +1,14 @@ +using System; +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + public class MediaDescriptorGetListDto : EntityDto + { + public string Name { get; set; } + + public string MimeType { get; set; } + + public int Size { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorGetListInput.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorGetListInput.cs new file mode 100644 index 0000000000..6d8316a749 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorGetListInput.cs @@ -0,0 +1,9 @@ +using Volo.Abp.Application.Dtos; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + public class MediaDescriptorGetListInput : PagedAndSortedResultRequestDto + { + + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/UpdateMediaDescriptorDto.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/UpdateMediaDescriptorDto.cs new file mode 100644 index 0000000000..ba3e60ba50 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/UpdateMediaDescriptorDto.cs @@ -0,0 +1,13 @@ +using System.ComponentModel.DataAnnotations; +using Volo.Abp.Validation; +using Volo.CmsKit.MediaDescriptors; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + public class UpdateMediaDescriptorDto + { + [Required] + [DynamicStringLength(typeof(MediaDescriptorConsts), nameof(MediaDescriptorConsts.MaxNameLength))] + public string Name { get; set; } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/UploadMediaStreamContent.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/UploadMediaStreamContent.cs new file mode 100644 index 0000000000..b6dcb1323d --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/MediaDescriptors/UploadMediaStreamContent.cs @@ -0,0 +1,23 @@ +using System.ComponentModel.DataAnnotations; +using System.IO; +using Volo.Abp.Content; +using Volo.Abp.Validation; +using Volo.CmsKit.MediaDescriptors; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + public class UploadMediaStreamContent : RemoteStreamContent + { + [Required] + [DynamicStringLength(typeof(MediaDescriptorConsts), nameof(MediaDescriptorConsts.MaxNameLength))] + public string Name { get; set; } + + [Required] + [DynamicStringLength(typeof(MediaDescriptorConsts), nameof(MediaDescriptorConsts.MaxMimeTypeLength))] + public string MimeType { get; set; } + + public UploadMediaStreamContent(Stream stream) : base(stream) + { + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs index 8fc2567093..7d23bbbae5 100644 --- a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs @@ -1,10 +1,12 @@ using AutoMapper; using Volo.CmsKit.Admin.Blogs; using Volo.CmsKit.Admin.Contents; +using Volo.CmsKit.Admin.MediaDescriptors; using Volo.CmsKit.Admin.Pages; using Volo.CmsKit.Blogs; using Volo.CmsKit.Admin.Tags; using Volo.CmsKit.Contents; +using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Pages; using Volo.CmsKit.Tags; @@ -30,6 +32,9 @@ namespace Volo.CmsKit.Admin CreateMap(MemberList.Destination); CreateMap(MemberList.Destination); + + CreateMap(); + CreateMap(); } } } diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs new file mode 100644 index 0000000000..84c8a9a993 --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs @@ -0,0 +1,80 @@ +using System; +using System.Collections.Generic; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Authorization; +using Volo.Abp.Application.Dtos; +using Volo.Abp.BlobStoring; +using Volo.Abp.Content; +using Volo.CmsKit.MediaDescriptors; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + [Authorize] + public class MediaDescriptorAdminAppService : CmsKitAdminAppServiceBase, IMediaDescriptorAdminAppService + { + protected readonly IBlobContainer MediaContainer; + protected readonly IMediaDescriptorRepository MediaDescriptorRepository; + + public MediaDescriptorAdminAppService(IBlobContainer mediaContainer, IMediaDescriptorRepository mediaDescriptorRepository) + { + MediaContainer = mediaContainer; + MediaDescriptorRepository = mediaDescriptorRepository; + } + + public virtual async Task GetAsync(Guid id) + { + var entity = await MediaDescriptorRepository.GetAsync(id); + + return ObjectMapper.Map(entity); + } + + public virtual async Task> GetListAsync(MediaDescriptorGetListInput input) + { + var totalCount = await MediaDescriptorRepository.GetCountAsync(); + var entites = await MediaDescriptorRepository.GetListAsync(); + + var dtos = ObjectMapper.Map, List>(entites); + + return new PagedResultDto(totalCount, dtos); + } + + public virtual async Task CreateAsync(UploadMediaStreamContent input) + { + var newId = GuidGenerator.Create(); + var newEntity = new MediaDescriptor(newId, CurrentTenant.Id, input.Name, input.MimeType, input.ContentLength ?? 0); + + await MediaDescriptorRepository.InsertAsync(newEntity); + await MediaContainer.SaveAsync(newId.ToString(), input.GetStream()); + + return ObjectMapper.Map(newEntity); + } + + public virtual async Task UpdateAsync(Guid id, UpdateMediaDescriptorDto input) + { + var entity = await MediaDescriptorRepository.GetAsync(id); + + entity.SetName(input.Name); + + await MediaDescriptorRepository.UpdateAsync(entity); + + return ObjectMapper.Map(entity); + } + + public virtual async Task DeleteAsync(Guid id) + { + await MediaContainer.DeleteAsync(id.ToString()); + await MediaDescriptorRepository.DeleteAsync(id); + } + + public virtual async Task DownloadAsync(Guid id, GetMediaRequestDto request) + { + var entity = await MediaDescriptorRepository.GetAsync(id); + var stream = await MediaContainer.GetAsync(id.ToString()); + + return new RemoteStreamContent(stream) + { + ContentType = entity.MimeType + }; + } + } +} \ No newline at end of file diff --git a/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminController.cs b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminController.cs new file mode 100644 index 0000000000..ce4325978d --- /dev/null +++ b/modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminController.cs @@ -0,0 +1,64 @@ +using System; +using System.Threading.Tasks; +using Microsoft.AspNetCore.Mvc; +using Volo.Abp; +using Volo.Abp.Application.Dtos; +using Volo.Abp.Content; +using Volo.Abp.GlobalFeatures; +using Volo.CmsKit.GlobalFeatures; + +namespace Volo.CmsKit.Admin.MediaDescriptors +{ + [RequiresGlobalFeature(typeof(MediasFeature))] + [RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)] + [Area("cms-kit")] + [Route("api/cms-kit-admin/medias")] + public class MediaDescriptorAdminController : CmsKitAdminController, IMediaDescriptorAdminAppService + { + protected readonly IMediaDescriptorAdminAppService MediaDescriptorAdminAppService; + + public MediaDescriptorAdminController(IMediaDescriptorAdminAppService mediaDescriptorAdminAppService) + { + MediaDescriptorAdminAppService = mediaDescriptorAdminAppService; + } + + [HttpGet] + [Route("{id}")] + public virtual Task GetAsync(Guid id) + { + return MediaDescriptorAdminAppService.GetAsync(id); + } + + [HttpGet] + public virtual Task> GetListAsync(MediaDescriptorGetListInput input) + { + return MediaDescriptorAdminAppService.GetListAsync(input); + } + + [HttpPost] + public virtual Task CreateAsync(UploadMediaStreamContent input) + { + return MediaDescriptorAdminAppService.CreateAsync(input); + } + + [HttpPut] + [Route("{id}")] + public virtual Task UpdateAsync(Guid id, UpdateMediaDescriptorDto input) + { + return MediaDescriptorAdminAppService.UpdateAsync(id, input); + } + + [HttpDelete] + public virtual Task DeleteAsync(Guid id) + { + return MediaDescriptorAdminAppService.DeleteAsync(id); + } + + [HttpGet] + [Route("download/{id}")] + public virtual Task DownloadAsync(Guid id, GetMediaRequestDto request) + { + return MediaDescriptorAdminAppService.DownloadAsync(id, request); + } + } +} \ No newline at end of file