Browse Source

CmsKit - Implementation of CoverImage for Blogpost

pull/7596/head
enisn 6 years ago
parent
commit
7d2bd589bd
  1. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogAdminAppService.cs
  2. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs
  3. 36
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs
  4. 92
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs
  5. 1
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo.CmsKit.Domain.csproj
  6. 6
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs
  7. 9
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostCoverImageContainer.cs
  8. 31
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/CmsKitBlogOptions.cs
  9. 6
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogAdminAppService.cs

@ -3,7 +3,7 @@ using Volo.Abp.Application.Services;
namespace Volo.CmsKit.Admin.Blogs
{
public interface IBlogAdminAppService : ICrudAppService<BlogDto,Guid>
public interface IBlogAdminAppService : ICrudAppService<BlogDto, Guid>
{
}
}

5
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs

@ -2,6 +2,7 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace Volo.CmsKit.Admin.Blogs
{
@ -13,5 +14,9 @@ namespace Volo.CmsKit.Admin.Blogs
CreateUpdateBlogPostDto>
{
Task<BlogPostDto> GetByUrlSlugAsync(string urlSlug);
Task SetCoverImageAsync(Guid id, RemoteStreamContent streamContent);
Task<RemoteStreamContent> GetCoverImageAsync(Guid id);
}
}

36
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs

@ -6,6 +6,8 @@ using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
using Volo.Abp.BlobStoring;
using Volo.Abp.Content;
using Volo.Abp.Domain.Repositories;
using Volo.CmsKit.Blogs;
using Volo.CmsKit.Permissions;
@ -22,16 +24,17 @@ namespace Volo.CmsKit.Admin.Blogs
CreateUpdateBlogPostDto>
, IBlogPostAdminAppService
{
protected readonly IBlogPostManager _blogPostManager;
protected readonly IBlogPostRepository _blogPostRepository;
protected readonly IBlogPostManager BlogPostManager;
protected readonly IBlogPostRepository BlogPostRepository;
protected readonly IBlobContainer<BlogPostCoverImageContainer> BlobContainer;
protected BlogPostAdminAppService(
IRepository<BlogPost, Guid> repository,
IBlogPostManager blogPostManager,
IBlogPostRepository blogPostRepository) : base(repository)
{
_blogPostManager = blogPostManager;
_blogPostRepository = blogPostRepository;
BlogPostManager = blogPostManager;
BlogPostRepository = blogPostRepository;
GetListPolicyName = CmsKitAdminPermissions.BlogPosts.Default;
@ -41,9 +44,9 @@ namespace Volo.CmsKit.Admin.Blogs
DeletePolicyName = CmsKitAdminPermissions.BlogPosts.Delete;
}
public async Task<BlogPostDto> GetByUrlSlugAsync(string urlSlug)
public virtual async Task<BlogPostDto> GetByUrlSlugAsync(string urlSlug)
{
var blogPost = await _blogPostRepository.GetByUrlSlugAsync(urlSlug);
var blogPost = await BlogPostRepository.GetByUrlSlugAsync(urlSlug);
return MapToGetOutputDto(blogPost);
}
@ -51,7 +54,7 @@ namespace Volo.CmsKit.Admin.Blogs
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
public override async Task<BlogPostDto> CreateAsync(CreateUpdateBlogPostDto input)
{
var entity = await _blogPostManager
var entity = await BlogPostManager
.CreateAsync(
new BlogPost(
input.BlogId,
@ -65,7 +68,7 @@ namespace Volo.CmsKit.Admin.Blogs
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
public override async Task<BlogPostDto> UpdateAsync(Guid id, CreateUpdateBlogPostDto input)
{
var entity = await _blogPostRepository.GetAsync(id);
var entity = await BlogPostRepository.GetAsync(id);
entity.SetTitle(input.Title);
entity.SetUrlSlug(input.UrlSlug);
@ -74,5 +77,22 @@ namespace Volo.CmsKit.Admin.Blogs
return MapToGetOutputDto(entity);
}
public virtual async Task SetCoverImageAsync(Guid id, RemoteStreamContent streamContent)
{
await Repository.GetAsync(id);
using (var stream = streamContent.GetStream())
{
await BlobContainer.SaveAsync(id.ToString(), stream, overrideExisting: true);
}
}
public virtual async Task<RemoteStreamContent> GetCoverImageAsync(Guid id)
{
var stream = await BlobContainer.GetAsync(id.ToString());
return new RemoteStreamContent(stream);
}
}
}

92
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs

@ -0,0 +1,92 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Content;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Blogs
{
[RequiresGlobalFeature(typeof(BlogsFeature))]
[RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)]
[Area("cms-kit")]
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
[Route("api/cms-kit-admin/blogs/blog-posts")]
public class BlogPostAdminController : CmsKitAdminController, IBlogPostAdminAppService
{
protected readonly IBlogPostAdminAppService BlogPostAdminAppService;
public BlogPostAdminController(IBlogPostAdminAppService blogPostAdminAppService)
{
BlogPostAdminAppService = blogPostAdminAppService;
}
public virtual Task<BlogPostDto> CreateAsync(CreateUpdateBlogPostDto input)
{
return BlogPostAdminAppService.CreateAsync(input);
}
public virtual Task DeleteAsync(Guid id)
{
return BlogPostAdminAppService.DeleteAsync(id);
}
public virtual Task<BlogPostDto> GetAsync(Guid id)
{
return BlogPostAdminAppService.GetAsync(id);
}
public virtual Task<BlogPostDto> GetByUrlSlugAsync(string urlSlug)
{
return BlogPostAdminAppService.GetByUrlSlugAsync(urlSlug);
}
public virtual Task<RemoteStreamContent> GetCoverImageAsync(Guid id)
{
Response.Headers.Add("Content-Disposition", $"inline;filename=\"{id}\"");
Response.Headers.Add("Accept-Ranges", "bytes");
Response.Headers.Add("Cache-Control", "max-age=120");
Response.ContentType = "image/*";
return BlogPostAdminAppService.GetCoverImageAsync(id);
}
public virtual Task<PagedResultDto<BlogPostDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{
return BlogPostAdminAppService.GetListAsync(input);
}
public virtual Task SetCoverImageAsync(Guid id, RemoteStreamContent streamContent)
{
return BlogPostAdminAppService.SetCoverImageAsync(id, streamContent);
}
public virtual async Task<IActionResult> UploadCoverImageAsync(Guid id, IFormFile file)
{
if (file == null)
{
return BadRequest();
}
using (var stream = file.OpenReadStream())
{
await BlogPostAdminAppService.SetCoverImageAsync(id, new RemoteStreamContent(stream));
}
return StatusCode(201);
}
public virtual Task<BlogPostDto> UpdateAsync(Guid id, CreateUpdateBlogPostDto input)
{
return BlogPostAdminAppService.UpdateAsync(id, input);
}
}
}

1
modules/cms-kit/src/Volo.CmsKit.Domain/Volo.CmsKit.Domain.csproj

@ -12,6 +12,7 @@
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Domain\Volo.Abp.Ddd.Domain.csproj" />
<ProjectReference Include="..\Volo.CmsKit.Domain.Shared\Volo.CmsKit.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\..\modules\users\src\Volo.Abp.Users.Domain\Volo.Abp.Users.Domain.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.BlobStoring\Volo.Abp.BlobStoring.csproj" />
</ItemGroup>
</Project>

6
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs

@ -19,8 +19,6 @@ namespace Volo.CmsKit.Blogs
public string UrlSlug { get; protected set; }
public string CoverImageUrl { get; set; }
public Guid? TenantId { get; }
protected BlogPost()
@ -31,14 +29,12 @@ namespace Volo.CmsKit.Blogs
Guid blogId,
[NotNull] string title,
[NotNull] string urlSlug,
[CanBeNull] string shortDescription = null,
[CanBeNull] string coverImageUrl = null)
[CanBeNull] string shortDescription = null)
{
BlogId = blogId;
SetTitle(title);
SetUrlSlug(urlSlug);
ShortDescription = shortDescription;
CoverImageUrl = coverImageUrl;
}
public void SetTitle(string title)

9
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostCoverImageContainer.cs

@ -0,0 +1,9 @@
using Volo.Abp.BlobStoring;
namespace Volo.CmsKit.Blogs
{
[BlobContainerName("blog-post-cover-images")]
public class BlogPostCoverImageContainer
{
}
}

31
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/CmsKitBlogOptions.cs

@ -0,0 +1,31 @@
using System;
namespace Volo.CmsKit.Blogs
{
public class CmsKitBlogOptions
{
private string routePrefix = "blog";
/// <summary>
/// Gets or sets route prefix. Default value is 'blog'.
/// </summary>
/// <remarks>
/// This parameter will be used while presenting blogposts.
/// </remarks>
public string RoutePrefix
{
get => GetFormattedRoutePrefix();
set => routePrefix = value;
}
private string GetFormattedRoutePrefix()
{
if (string.IsNullOrWhiteSpace(routePrefix))
{
return "/";
}
return routePrefix.EnsureEndsWith('/').EnsureStartsWith('/');
}
}
}

6
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/CmsKitDomainModule.cs

@ -1,4 +1,5 @@
using Volo.Abp.Domain;
using Volo.Abp.BlobStoring;
using Volo.Abp.Domain;
using Volo.Abp.Modularity;
using Volo.Abp.Users;
using Volo.CmsKit.Reactions;
@ -8,7 +9,8 @@ namespace Volo.CmsKit
[DependsOn(
typeof(CmsKitDomainSharedModule),
typeof(AbpUsersDomainModule),
typeof(AbpDddDomainModule)
typeof(AbpDddDomainModule),
typeof(AbpBlobStoringModule)
)]
public class CmsKitDomainModule : AbpModule
{

Loading…
Cancel
Save