Browse Source

Merge branch 'dev'

Conflicts:
	modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs
pull/7757/head
Ahmet 6 years ago
parent
commit
30c587fb8a
  1. 38
      framework/src/Volo.Abp.Ddd.Domain/Microsoft/Extensions/DependencyInjection/ServiceCollectionRepositoryExtensions.cs
  2. 3
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/AbpRepositoryConventionalRegistrar.cs
  3. 2
      framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs
  4. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/CreateBlogPostDto.cs
  5. 3
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs
  6. 24
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs
  7. 7
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs
  8. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs
  9. 4
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs
  10. 29
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs

38
framework/src/Volo.Abp.Ddd.Domain/Microsoft/Extensions/DependencyInjection/ServiceCollectionRepositoryExtensions.cs

@ -7,32 +7,36 @@ namespace Microsoft.Extensions.DependencyInjection
{ {
public static class ServiceCollectionRepositoryExtensions public static class ServiceCollectionRepositoryExtensions
{ {
public static IServiceCollection AddDefaultRepository(this IServiceCollection services, Type entityType, Type repositoryImplementationType) public static IServiceCollection AddDefaultRepository(
this IServiceCollection services,
Type entityType,
Type repositoryImplementationType,
bool replaceExisting = false)
{ {
//IReadOnlyBasicRepository<TEntity> //IReadOnlyBasicRepository<TEntity>
var readOnlyBasicRepositoryInterface = typeof(IReadOnlyBasicRepository<>).MakeGenericType(entityType); var readOnlyBasicRepositoryInterface = typeof(IReadOnlyBasicRepository<>).MakeGenericType(entityType);
if (readOnlyBasicRepositoryInterface.IsAssignableFrom(repositoryImplementationType)) if (readOnlyBasicRepositoryInterface.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(readOnlyBasicRepositoryInterface, repositoryImplementationType); RegisterService(services, readOnlyBasicRepositoryInterface, repositoryImplementationType, replaceExisting);
//IReadOnlyRepository<TEntity> //IReadOnlyRepository<TEntity>
var readOnlyRepositoryInterface = typeof(IReadOnlyRepository<>).MakeGenericType(entityType); var readOnlyRepositoryInterface = typeof(IReadOnlyRepository<>).MakeGenericType(entityType);
if (readOnlyRepositoryInterface.IsAssignableFrom(repositoryImplementationType)) if (readOnlyRepositoryInterface.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(readOnlyRepositoryInterface, repositoryImplementationType); RegisterService(services, readOnlyRepositoryInterface, repositoryImplementationType, replaceExisting);
} }
//IBasicRepository<TEntity> //IBasicRepository<TEntity>
var basicRepositoryInterface = typeof(IBasicRepository<>).MakeGenericType(entityType); var basicRepositoryInterface = typeof(IBasicRepository<>).MakeGenericType(entityType);
if (basicRepositoryInterface.IsAssignableFrom(repositoryImplementationType)) if (basicRepositoryInterface.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(basicRepositoryInterface, repositoryImplementationType); RegisterService(services, basicRepositoryInterface, repositoryImplementationType, replaceExisting);
//IRepository<TEntity> //IRepository<TEntity>
var repositoryInterface = typeof(IRepository<>).MakeGenericType(entityType); var repositoryInterface = typeof(IRepository<>).MakeGenericType(entityType);
if (repositoryInterface.IsAssignableFrom(repositoryImplementationType)) if (repositoryInterface.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(repositoryInterface, repositoryImplementationType); RegisterService(services, repositoryInterface, repositoryImplementationType, replaceExisting);
} }
} }
} }
@ -44,26 +48,26 @@ namespace Microsoft.Extensions.DependencyInjection
var readOnlyBasicRepositoryInterfaceWithPk = typeof(IReadOnlyBasicRepository<,>).MakeGenericType(entityType, primaryKeyType); var readOnlyBasicRepositoryInterfaceWithPk = typeof(IReadOnlyBasicRepository<,>).MakeGenericType(entityType, primaryKeyType);
if (readOnlyBasicRepositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType)) if (readOnlyBasicRepositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(readOnlyBasicRepositoryInterfaceWithPk, repositoryImplementationType); RegisterService(services, readOnlyBasicRepositoryInterfaceWithPk, repositoryImplementationType, replaceExisting);
//IReadOnlyRepository<TEntity, TKey> //IReadOnlyRepository<TEntity, TKey>
var readOnlyRepositoryInterfaceWithPk = typeof(IReadOnlyRepository<,>).MakeGenericType(entityType, primaryKeyType); var readOnlyRepositoryInterfaceWithPk = typeof(IReadOnlyRepository<,>).MakeGenericType(entityType, primaryKeyType);
if (readOnlyRepositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType)) if (readOnlyRepositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(readOnlyRepositoryInterfaceWithPk, repositoryImplementationType); RegisterService(services, readOnlyRepositoryInterfaceWithPk, repositoryImplementationType, replaceExisting);
} }
//IBasicRepository<TEntity, TKey> //IBasicRepository<TEntity, TKey>
var basicRepositoryInterfaceWithPk = typeof(IBasicRepository<,>).MakeGenericType(entityType, primaryKeyType); var basicRepositoryInterfaceWithPk = typeof(IBasicRepository<,>).MakeGenericType(entityType, primaryKeyType);
if (basicRepositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType)) if (basicRepositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(basicRepositoryInterfaceWithPk, repositoryImplementationType); RegisterService(services, basicRepositoryInterfaceWithPk, repositoryImplementationType, replaceExisting);
//IRepository<TEntity, TKey> //IRepository<TEntity, TKey>
var repositoryInterfaceWithPk = typeof(IRepository<,>).MakeGenericType(entityType, primaryKeyType); var repositoryInterfaceWithPk = typeof(IRepository<,>).MakeGenericType(entityType, primaryKeyType);
if (repositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType)) if (repositoryInterfaceWithPk.IsAssignableFrom(repositoryImplementationType))
{ {
services.TryAddTransient(repositoryInterfaceWithPk, repositoryImplementationType); RegisterService(services, repositoryInterfaceWithPk, repositoryImplementationType, replaceExisting);
} }
} }
} }
@ -71,5 +75,21 @@ namespace Microsoft.Extensions.DependencyInjection
return services; return services;
} }
private static void RegisterService(
IServiceCollection services,
Type serviceType,
Type implementationType,
bool replaceExisting)
{
if (replaceExisting)
{
services.Replace(ServiceDescriptor.Transient(serviceType, implementationType));
}
else
{
services.TryAddTransient(serviceType, implementationType);
}
}
} }
} }

3
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/AbpRepositoryConventionalRegistrar.cs

@ -6,6 +6,9 @@ using Volo.Abp.DependencyInjection;
namespace Volo.Abp.Domain.Repositories namespace Volo.Abp.Domain.Repositories
{ {
/* Repositories are not injected by class by default.
* This class specializes repository registration to apply this rule.
*/
public class AbpRepositoryConventionalRegistrar : DefaultConventionalRegistrar public class AbpRepositoryConventionalRegistrar : DefaultConventionalRegistrar
{ {
public static bool ExposeRepositoryClasses { get; set; } public static bool ExposeRepositoryClasses { get; set; }

2
framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/RepositoryRegistrarBase.cs

@ -20,7 +20,7 @@ namespace Volo.Abp.Domain.Repositories
{ {
foreach (var customRepository in Options.CustomRepositories) foreach (var customRepository in Options.CustomRepositories)
{ {
Options.Services.AddDefaultRepository(customRepository.Key, customRepository.Value); Options.Services.AddDefaultRepository(customRepository.Key, customRepository.Value, replaceExisting: true);
} }
if (Options.RegisterDefaultRepositories) if (Options.RegisterDefaultRepositories)

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/CreateUpdateBlogPostDto.cs → modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/CreateBlogPostDto.cs

@ -5,7 +5,7 @@ using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
public class CreateUpdateBlogPostDto public class CreateBlogPostDto
{ {
[Required] [Required]
public Guid BlogId { get; set; } public Guid BlogId { get; set; }

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

@ -11,7 +11,8 @@ namespace Volo.CmsKit.Admin.Blogs
BlogPostDto, BlogPostDto,
Guid, Guid,
PagedAndSortedResultRequestDto, PagedAndSortedResultRequestDto,
CreateUpdateBlogPostDto> CreateBlogPostDto,
UpdateBlogPostDto>
{ {
Task<BlogPostDto> GetBySlugAsync(string blogSlug, string slug); Task<BlogPostDto> GetBySlugAsync(string blogSlug, string slug);

24
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/UpdateBlogPostDto.cs

@ -0,0 +1,24 @@
using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation;
using Volo.CmsKit.Blogs;
namespace Volo.CmsKit.Admin.Blogs
{
public class UpdateBlogPostDto
{
[Required]
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxTitleLength))]
public string Title { get; set; }
[Required]
[DynamicStringLength(
typeof(BlogPostConsts),
nameof(BlogPostConsts.MaxSlugLength),
nameof(BlogPostConsts.MinSlugLength))]
public string Slug { get; set; }
[DynamicMaxLength(typeof(BlogPostConsts), nameof(BlogPostConsts.MaxShortDescriptionLength))]
public string ShortDescription { get; set; }
}
}

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

@ -23,7 +23,8 @@ namespace Volo.CmsKit.Admin.Blogs
BlogPostDto, BlogPostDto,
Guid, Guid,
PagedAndSortedResultRequestDto, PagedAndSortedResultRequestDto,
CreateUpdateBlogPostDto> CreateBlogPostDto,
UpdateBlogPostDto>
, IBlogPostAdminAppService , IBlogPostAdminAppService
{ {
protected readonly IBlogPostManager BlogPostManager; protected readonly IBlogPostManager BlogPostManager;
@ -63,7 +64,7 @@ namespace Volo.CmsKit.Admin.Blogs
} }
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
public override async Task<BlogPostDto> CreateAsync(CreateUpdateBlogPostDto input) public override async Task<BlogPostDto> CreateAsync(CreateBlogPostDto input)
{ {
_ = await UserLookupService.GetByIdAsync(CurrentUser.GetId()); _ = await UserLookupService.GetByIdAsync(CurrentUser.GetId());
@ -80,7 +81,7 @@ namespace Volo.CmsKit.Admin.Blogs
} }
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)] [Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
public override async Task<BlogPostDto> UpdateAsync(Guid id, CreateUpdateBlogPostDto input) public override async Task<BlogPostDto> UpdateAsync(Guid id, UpdateBlogPostDto input)
{ {
var blogPost = await BlogPostRepository.GetAsync(id); var blogPost = await BlogPostRepository.GetAsync(id);

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationAutoMapperProfile.cs

@ -34,6 +34,8 @@ namespace Volo.CmsKit.Admin
CreateMap<ContentUpdateDto, Content>(MemberList.Source); CreateMap<ContentUpdateDto, Content>(MemberList.Source);
CreateMap<BlogPost, BlogPostDto>(MemberList.Destination); CreateMap<BlogPost, BlogPostDto>(MemberList.Destination);
CreateMap<CreateBlogPostDto, BlogPost>(MemberList.Source);
CreateMap<UpdateBlogPostDto, BlogPost>(MemberList.Source);
CreateMap<Blog, BlogDto>(MemberList.Destination) CreateMap<Blog, BlogDto>(MemberList.Destination)
.ReverseMap(); .ReverseMap();

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

@ -31,7 +31,7 @@ namespace Volo.CmsKit.Admin.Blogs
[HttpPost] [HttpPost]
[Authorize(CmsKitAdminPermissions.BlogPosts.Create)] [Authorize(CmsKitAdminPermissions.BlogPosts.Create)]
public virtual Task<BlogPostDto> CreateAsync(CreateUpdateBlogPostDto input) public virtual Task<BlogPostDto> CreateAsync(CreateBlogPostDto input)
{ {
return BlogPostAdminAppService.CreateAsync(input); return BlogPostAdminAppService.CreateAsync(input);
} }
@ -107,7 +107,7 @@ namespace Volo.CmsKit.Admin.Blogs
[HttpPut] [HttpPut]
[Route("{id}")] [Route("{id}")]
[Authorize(CmsKitAdminPermissions.BlogPosts.Update)] [Authorize(CmsKitAdminPermissions.BlogPosts.Update)]
public virtual Task<BlogPostDto> UpdateAsync(Guid id, CreateUpdateBlogPostDto input) public virtual Task<BlogPostDto> UpdateAsync(Guid id, UpdateBlogPostDto input)
{ {
return BlogPostAdminAppService.UpdateAsync(id, input); return BlogPostAdminAppService.UpdateAsync(id, input);
} }

29
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs

@ -31,7 +31,7 @@ namespace Volo.CmsKit.Blogs
var slug = "my-awesome-new-post"; var slug = "my-awesome-new-post";
var shortDescription = "This blog is all about awesomeness 🤗!"; var shortDescription = "This blog is all about awesomeness 🤗!";
var created = await blogPostAdminAppService.CreateAsync(new CreateUpdateBlogPostDto var created = await blogPostAdminAppService.CreateAsync(new CreateBlogPostDto
{ {
BlogId = cmsKitTestData.Blog_Id, BlogId = cmsKitTestData.Blog_Id,
Title = title, Title = title,
@ -55,7 +55,7 @@ namespace Volo.CmsKit.Blogs
var slug = "another-my-awesome-new-post"; var slug = "another-my-awesome-new-post";
var shortDescription = "This blog is all about awesomeness 🤗!"; var shortDescription = "This blog is all about awesomeness 🤗!";
var dto = new CreateUpdateBlogPostDto var dto = new CreateBlogPostDto
{ {
// Non-existing Id // Non-existing Id
BlogId = Guid.NewGuid(), BlogId = Guid.NewGuid(),
@ -137,9 +137,8 @@ namespace Volo.CmsKit.Blogs
var title = "[Solved] Another Blog Post"; var title = "[Solved] Another Blog Post";
var slug = "another-short-blog-post"; var slug = "another-short-blog-post";
await blogPostAdminAppService.UpdateAsync(cmsKitTestData.BlogPost_2_Id, new CreateUpdateBlogPostDto await blogPostAdminAppService.UpdateAsync(cmsKitTestData.BlogPost_2_Id, new UpdateBlogPostDto
{ {
BlogId = cmsKitTestData.Blog_Id,
ShortDescription = shortDescription, ShortDescription = shortDescription,
Title = title, Title = title,
Slug = slug, Slug = slug,
@ -152,31 +151,11 @@ namespace Volo.CmsKit.Blogs
blogPost.Slug.ShouldBe(slug); blogPost.Slug.ShouldBe(slug);
} }
[Fact]
public async Task UpdateAsync_ShouldThrowException_WhileChangingWithNonExistingBlogId()
{
var nonExistingId = Guid.NewGuid();
var dto = new CreateUpdateBlogPostDto
{
BlogId = nonExistingId,
Title = cmsKitTestData.Page_2_Title,
Slug = cmsKitTestData.BlogPost_2_Slug
};
var exception = await Should.ThrowAsync<EntityNotFoundException>(async () =>
await blogPostAdminAppService.UpdateAsync(cmsKitTestData.BlogPost_2_Id, dto));
exception.EntityType.ShouldBe(typeof(Blog));
exception.Id.ShouldBe(nonExistingId);
}
[Fact] [Fact]
public async Task UpdateAsync_ShouldThrowException_WhileUpdatingWithAlreadyExistingSlug() public async Task UpdateAsync_ShouldThrowException_WhileUpdatingWithAlreadyExistingSlug()
{ {
var dto = new CreateUpdateBlogPostDto var dto = new UpdateBlogPostDto
{ {
BlogId = cmsKitTestData.Blog_Id,
Title = "Some new title", Title = "Some new title",
Slug = cmsKitTestData.BlogPost_1_Slug Slug = cmsKitTestData.BlogPost_1_Slug
}; };

Loading…
Cancel
Save