Browse Source

Merge branch 'dev' into cms-kit/reaction-definitions

pull/7500/head
Ilkay Ilknur 6 years ago
parent
commit
60f7aacc5d
  1. 17
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json
  2. 16
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json
  3. 17
      abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json
  4. 12
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs
  5. 5
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/IBlogPostAdminAppService.cs
  6. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs
  7. 1
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs
  8. 15
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs
  9. 8
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs
  10. 21
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogPostAdminAppService.cs
  11. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/MediaDescriptors/MediaDescriptorAdminAppService.cs
  12. 27
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs
  13. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Blogs/BlogPostAdminController.cs
  14. 9
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml
  15. 15
      modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js
  16. 2
      modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationAutoMapperProfile.cs
  17. 2
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/CmsKitErrorCodes.cs
  18. 15
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Contents/ContentConsts.cs
  19. 10
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs
  20. 9
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeature.cs
  21. 25
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs
  22. 3
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPost.cs
  23. 8
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs
  24. 7
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs
  25. 7
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.cs
  26. 17
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs
  27. 11
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/DefaultMediaDescriptorDefinitionStore.cs
  28. 4
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/MediaDescriptors/EntityCantHaveMediaException.cs
  29. 4
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs
  30. 56
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs
  31. 6
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/SlugNormalizer.cs
  32. 60
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs
  33. 1
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs
  34. 42
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs
  35. 3
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs
  36. 3
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs
  37. 3
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs
  38. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs
  39. 5
      modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs
  40. 2
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs
  41. 2
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogPostAdminAppService_Tests.cs
  42. 6
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs
  43. 27
      modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/SlugExtensions_Tests.cs
  44. 70
      modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs
  45. 10
      modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs
  46. 5
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Scripts/vs.js
  47. 13156
      npm/ng-packs/packages/schematics/src/mocks/api-definition.json
  48. 2
      npm/ng-packs/packages/schematics/src/models/api-definition.ts
  49. 9
      npm/ng-packs/packages/schematics/src/models/method.ts
  50. 2
      npm/ng-packs/packages/schematics/src/utils/model.ts

17
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/en.json

@ -207,7 +207,7 @@
"DeleteCoverImageConfirmationMessage": "Are you sure you want to delete the cover image for \"{0}\"?", "DeleteCoverImageConfirmationMessage": "Are you sure you want to delete the cover image for \"{0}\"?",
"DeleteCoverImageSuccessMessage": "Cover image successfully deleted", "DeleteCoverImageSuccessMessage": "Cover image successfully deleted",
"PaymentsOf": "Payments of", "PaymentsOf": "Payments of",
"ShowPaymentsOfOrganization": "Show payments", "ShowPaymentsOfOrganization": "Payments",
"Date": "Date", "Date": "Date",
"Products": "Products", "Products": "Products",
"TotalAmount": "Total amount", "TotalAmount": "Total amount",
@ -234,6 +234,19 @@
"Permission:CliAnalyticses": "Cli Analyticses", "Permission:CliAnalyticses": "Cli Analyticses",
"Permission:CliAnalytics": "Cli Analytics", "Permission:CliAnalytics": "Cli Analytics",
"Search": "Search", "Search": "Search",
"ClearFilter": "Clear filter" "ClearFilter": "Clear filter",
"LicensePrivateKey": "License private key",
"LicensePublicKey": "License public key",
"ApiKey": "NuGet API key",
"ShowInvoiceRequestsOfOrganization": "Invoice requests",
"ShowQuestionsOfOrganization": "Questions",
"Question": "Question",
"Open": "Open",
"Questions": "Questions",
"InvoiceRequests": "Invoice Requests",
"Address": "Address",
"TaxNo": "Tax No",
"Permission:InvoiceRequest": "Invoice Request",
"Permission:Question": "Question"
} }
} }

16
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/tr.json

@ -182,6 +182,20 @@
"Permission:CliAnalyticses": "Cli Analitikleri", "Permission:CliAnalyticses": "Cli Analitikleri",
"Permission:CliAnalytics": "Cli Analitik", "Permission:CliAnalytics": "Cli Analitik",
"Search": "Ara", "Search": "Ara",
"ClearFilter": "Filtreyi temizle" "ShowPaymentsOfOrganization": "Ödemeler",
"ClearFilter": "Filtreyi temizle",
"LicensePrivateKey": "Lisans özel anahtar",
"LicensePublicKey": "Lisans genel key",
"ApiKey": "NuGet API anahatar",
"ShowInvoiceRequestsOfOrganization": "Fatura talepleri",
"ShowQuestionsOfOrganization": "Sorular",
"Question": "Soru",
"Open": "Aç",
"Questions": "Sorular",
"InvoiceRequests": "Fatura talepleri",
"Address": "Adres",
"TaxNo": "Vergi no",
"Permission:InvoiceRequest": "Fatura Talebi",
"Permission:Question": "Soru"
} }
} }

17
abp_io/AbpIoLocalization/AbpIoLocalization/Admin/Localization/Resources/zh-Hans.json

@ -217,6 +217,21 @@
"FailReason": "失败原因", "FailReason": "失败原因",
"ReIndexAllPosts": "重新索引所有帖子", "ReIndexAllPosts": "重新索引所有帖子",
"ReIndexAllPostsConfirmationMessage": "你确定要重新索引所有的帖子吗", "ReIndexAllPostsConfirmationMessage": "你确定要重新索引所有的帖子吗",
"SuccessfullyReIndexAllPosts": "成功索引所有的帖子" "SuccessfullyReIndexAllPosts": "成功索引所有的帖子",
"ClearFilter": "清除过滤",
"LicensePrivateKey": "许可私有密钥",
"LicensePublicKey": "许可公有密钥",
"ApiKey": "NuGet API密钥",
"ShowInvoiceRequestsOfOrganization": "发票请求",
"ShowQuestionsOfOrganization": "问题",
"Question": "问题",
"Open": "打开",
"Questions": "问题",
"InvoiceRequests": "发票请求",
"Address": "地址",
"TaxNo": "税号",
"Permission:InvoiceRequest": "发票请求",
"Permission:Question": "问题"
} }
} }

12
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Blogs/BlogPostGetListInput.cs

@ -0,0 +1,12 @@
using System;
using Volo.Abp.Application.Dtos;
namespace Volo.CmsKit.Admin.Blogs
{
public class BlogPostGetListInput : PagedAndSortedResultRequestDto
{
public string Filter { get; set; }
public Guid? BlogId { get; set; }
}
}

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

@ -1,8 +1,5 @@
using System; using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
@ -10,7 +7,7 @@ namespace Volo.CmsKit.Admin.Blogs
: ICrudAppService< : ICrudAppService<
BlogPostDto, BlogPostDto,
Guid, Guid,
PagedAndSortedResultRequestDto, BlogPostGetListInput,
CreateBlogPostDto, CreateBlogPostDto,
UpdateBlogPostDto> UpdateBlogPostDto>
{ {

1
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/CreatePageInputDto.cs

@ -1,7 +1,6 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Contents;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
namespace Volo.CmsKit.Admin.Pages namespace Volo.CmsKit.Admin.Pages

1
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Pages/UpdatePageInputDto.cs

@ -1,7 +1,6 @@
using System; using System;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using Volo.Abp.Validation; using Volo.Abp.Validation;
using Volo.CmsKit.Contents;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
namespace Volo.CmsKit.Admin.Pages namespace Volo.CmsKit.Admin.Pages

15
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogAdminAppService.cs

@ -16,13 +16,18 @@ namespace Volo.CmsKit.Admin.Blogs
{ {
protected IBlogRepository BlogRepository { get; } protected IBlogRepository BlogRepository { get; }
protected BlogManager BlogManager { get; } protected BlogManager BlogManager { get; }
protected BlogFeatureManager BlogFeatureManager{ get; }
public BlogAdminAppService(IBlogRepository blogRepository, BlogManager blogManager)
public BlogAdminAppService(
IBlogRepository blogRepository,
BlogManager blogManager,
BlogFeatureManager blogFeatureManager = null)
{ {
BlogRepository = blogRepository; BlogRepository = blogRepository;
BlogManager = blogManager; BlogManager = blogManager;
BlogFeatureManager = blogFeatureManager;
} }
public virtual async Task<BlogDto> GetAsync(Guid id) public virtual async Task<BlogDto> GetAsync(Guid id)
{ {
var blog = await BlogRepository.GetAsync(id); var blog = await BlogRepository.GetAsync(id);
@ -48,7 +53,9 @@ namespace Volo.CmsKit.Admin.Blogs
{ {
var blog = await BlogManager.CreateAsync(input.Name, input.Slug); var blog = await BlogManager.CreateAsync(input.Name, input.Slug);
await BlogRepository.InsertAsync(blog); await BlogRepository.InsertAsync(blog, autoSave: true);
await BlogFeatureManager.SetDefaultsAsync(blog.Id);
return ObjectMapper.Map<Blog, BlogDto>(blog); return ObjectMapper.Map<Blog, BlogDto>(blog);
} }

8
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Blogs/BlogFeatureAdminAppService.cs

@ -1,12 +1,9 @@
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Authorization;
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.Admin.Blogs;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures; using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions; using Volo.CmsKit.Permissions;
@ -14,6 +11,7 @@ using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Blogs namespace Volo.CmsKit.Admin.Blogs
{ {
[RequiresGlobalFeature(typeof(BlogsFeature))] [RequiresGlobalFeature(typeof(BlogsFeature))]
[Authorize(CmsKitAdminPermissions.Blogs.Features)]
public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService public class BlogFeatureAdminAppService : CmsKitAdminAppServiceBase, IBlogFeatureAdminAppService
{ {
protected IBlogFeatureRepository BlogFeatureRepository { get; } protected IBlogFeatureRepository BlogFeatureRepository { get; }
@ -32,15 +30,13 @@ namespace Volo.CmsKit.Admin.Blogs
EventBus = eventBus; EventBus = eventBus;
} }
[Authorize(CmsKitAdminPermissions.Blogs.Features)]
public virtual async Task<List<BlogFeatureDto>> GetListAsync(Guid blogId) public virtual async Task<List<BlogFeatureDto>> GetListAsync(Guid blogId)
{ {
var blogFeatures = await BlogFeatureManager.GetListAsync(blogId); var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId);
return ObjectMapper.Map<List<BlogFeature>, List<BlogFeatureDto>>(blogFeatures); return ObjectMapper.Map<List<BlogFeature>, List<BlogFeatureDto>>(blogFeatures);
} }
[Authorize(CmsKitAdminPermissions.Blogs.Features)]
public virtual Task SetAsync(Guid blogId, BlogFeatureInputDto dto) public virtual Task SetAsync(Guid blogId, BlogFeatureInputDto dto)
{ {
return BlogFeatureManager.SetAsync(blogId, dto.FeatureName, dto.IsEnabled); return BlogFeatureManager.SetAsync(blogId, dto.FeatureName, dto.IsEnabled);

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

@ -3,10 +3,6 @@ using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; 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.Abp.GlobalFeatures; using Volo.Abp.GlobalFeatures;
using Volo.Abp.Users; using Volo.Abp.Users;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
@ -87,20 +83,15 @@ namespace Volo.CmsKit.Admin.Blogs
} }
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)] [Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual async Task<PagedResultDto<BlogPostDto>> GetListAsync(PagedAndSortedResultRequestDto input) public virtual async Task<PagedResultDto<BlogPostDto>> GetListAsync(BlogPostGetListInput input)
{ {
if (input.Sorting.IsNullOrEmpty()) var blogPosts = await BlogPostRepository.GetListAsync(input.Filter, input.BlogId, input.MaxResultCount, input.SkipCount, input.Sorting);
{
input.Sorting = nameof(BlogPost.CreationTime) + " desc";
}
var blogPosts = await BlogPostRepository.GetPagedListAsync(input.SkipCount, input.MaxResultCount, input.Sorting, includeDetails: true);
var count = await BlogPostRepository.GetCountAsync(); var count = await BlogPostRepository.GetCountAsync(input.Filter);
return new PagedResultDto<BlogPostDto>( var dtoList = ObjectMapper.Map<List<BlogPost>, List<BlogPostDto>>(blogPosts);
count,
ObjectMapper.Map<List<BlogPost>, List<BlogPostDto>>(blogPosts)); return new PagedResultDto<BlogPostDto>(count, dtoList);
} }
[Authorize(CmsKitAdminPermissions.BlogPosts.Delete)] [Authorize(CmsKitAdminPermissions.BlogPosts.Delete)]

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

@ -33,6 +33,7 @@ namespace Volo.CmsKit.Admin.MediaDescriptors
{ {
var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(inputStream.EntityType); var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(inputStream.EntityType);
/* TODO: Shouldn't CreatePolicies be a dictionary and we check for inputStream.EntityType? */
await CheckAnyOfPoliciesAsync(definition.CreatePolicies); await CheckAnyOfPoliciesAsync(definition.CreatePolicies);
using (var stream = inputStream.GetStream()) using (var stream = inputStream.GetStream())
@ -52,6 +53,7 @@ namespace Volo.CmsKit.Admin.MediaDescriptors
var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(mediaDescriptor.EntityType); var definition = await MediaDescriptorDefinitionStore.GetDefinitionAsync(mediaDescriptor.EntityType);
/* TODO: Shouldn't DeletePolicies be a dictionary and we check for inputStream.EntityType? */
await CheckAnyOfPoliciesAsync(definition.DeletePolicies); await CheckAnyOfPoliciesAsync(definition.DeletePolicies);
await MediaContainer.DeleteAsync(id.ToString()); await MediaContainer.DeleteAsync(id.ToString());

27
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Pages/PageAdminAppService.cs

@ -16,10 +16,15 @@ namespace Volo.CmsKit.Admin.Pages
public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppService public class PageAdminAppService : CmsKitAdminAppServiceBase, IPageAdminAppService
{ {
protected IPageRepository PageRepository { get; } protected IPageRepository PageRepository { get; }
public PageAdminAppService(IPageRepository pageRepository) protected PageManager PageManager { get; }
public PageAdminAppService(
IPageRepository pageRepository,
PageManager pageManager)
{ {
PageRepository = pageRepository; PageRepository = pageRepository;
PageManager = pageManager;
} }
public virtual async Task<PageDto> GetAsync(Guid id) public virtual async Task<PageDto> GetAsync(Guid id)
@ -48,9 +53,7 @@ namespace Volo.CmsKit.Admin.Pages
[Authorize(CmsKitAdminPermissions.Pages.Create)] [Authorize(CmsKitAdminPermissions.Pages.Create)]
public virtual async Task<PageDto> CreateAsync(CreatePageInputDto input) public virtual async Task<PageDto> CreateAsync(CreatePageInputDto input)
{ {
await CheckPageSlugAsync(input.Slug); var page = await PageManager.CreateAsync(input.Title, input.Slug, input.Content);
var page = new Page(GuidGenerator.Create(), input.Title, input.Slug, input.Content, CurrentTenant.Id);
await PageRepository.InsertAsync(page); await PageRepository.InsertAsync(page);
@ -62,13 +65,9 @@ namespace Volo.CmsKit.Admin.Pages
{ {
var page = await PageRepository.GetAsync(id); var page = await PageRepository.GetAsync(id);
if (page.Slug != input.Slug) await PageManager.SetSlugAsync(page, input.Slug);
{
await CheckPageSlugAsync(input.Slug);
}
page.SetTitle(input.Title); page.SetTitle(input.Title);
page.SetSlug(input.Slug);
page.SetContent(input.Content); page.SetContent(input.Content);
await PageRepository.UpdateAsync(page); await PageRepository.UpdateAsync(page);
@ -81,13 +80,5 @@ namespace Volo.CmsKit.Admin.Pages
{ {
await PageRepository.DeleteAsync(id); await PageRepository.DeleteAsync(id);
} }
protected virtual async Task CheckPageSlugAsync(string slug)
{
if (await PageRepository.ExistsAsync(slug))
{
throw new PageSlugAlreadyExistsException(slug);
}
}
} }
} }

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

@ -49,7 +49,7 @@ namespace Volo.CmsKit.Admin.Blogs
[HttpGet] [HttpGet]
[Authorize(CmsKitAdminPermissions.BlogPosts.Default)] [Authorize(CmsKitAdminPermissions.BlogPosts.Default)]
public virtual Task<PagedResultDto<BlogPostDto>> GetListAsync(PagedAndSortedResultRequestDto input) public virtual Task<PagedResultDto<BlogPostDto>> GetListAsync(BlogPostGetListInput input)
{ {
return BlogPostAdminAppService.GetListAsync(input); return BlogPostAdminAppService.GetListAsync(input);
} }

9
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/Index.cshtml

@ -1,5 +1,6 @@
@page @page
@using Volo.Abp.AspNetCore.Mvc.UI.Theme.Shared.Pages.Shared.Components.AbpPageSearchBox
@using Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts @using Volo.CmsKit.Admin.Web.Pages.CmsKit.BlogPosts
@using Volo.CmsKit.Admin.Web.Pages @using Volo.CmsKit.Admin.Web.Pages
@using Volo.CmsKit.Admin.Web.Menus @using Volo.CmsKit.Admin.Web.Menus
@ -27,7 +28,13 @@
<div id="CmsKitBlogPostsWrapper"> <div id="CmsKitBlogPostsWrapper">
<abp-card> <abp-card>
<abp-card-body> <abp-card-body>
<abp-table striped-rows="true" id="BlogPostsTable" class="nowrap"></abp-table> <abp-row>
<abp-column>
@await Component.InvokeAsync(typeof(AbpPageSearchBoxViewComponent))
</abp-column>
</abp-row>
</abp-card-body> </abp-card-body>
</abp-card> </abp-card>
<abp-table striped-rows="true" id="BlogPostsTable" class="nowrap"></abp-table>
</div> </div>

15
modules/cms-kit/src/Volo.CmsKit.Admin.Web/Pages/CmsKit/BlogPosts/index.js

@ -4,8 +4,12 @@ $(function () {
var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin; var blogsService = volo.cmsKit.admin.blogs.blogPostAdmin;
var $blogPostWrapper = $('#CmsKitBlogPostsWrapper'); var getFilter = function () {
return {
filter: $('#CmsKitBlogPostsWrapper input.page-search-filter-text').val()
};
};
var dataTable = $("#BlogPostsTable").DataTable(abp.libs.datatables.normalizeConfiguration({ var dataTable = $("#BlogPostsTable").DataTable(abp.libs.datatables.normalizeConfiguration({
processing: true, processing: true,
serverSide: true, serverSide: true,
@ -16,7 +20,7 @@ $(function () {
scrollX: true, scrollX: true,
ordering: true, ordering: true,
order: [[1, "desc"]], order: [[1, "desc"]],
ajax: abp.libs.datatables.createAjax(blogsService.getList), ajax: abp.libs.datatables.createAjax(blogsService.getList, getFilter),
columnDefs: [ columnDefs: [
{ {
title: l("Details"), title: l("Details"),
@ -61,6 +65,11 @@ $(function () {
] ]
})); }));
$('#CmsKitBlogPostsWrapper form.page-search-form').submit(function (e) {
e.preventDefault();
dataTable.ajax.reload();
});
$('#AbpContentToolbar button[name=CreateBlogPost]').on('click', function (e) { $('#AbpContentToolbar button[name=CreateBlogPost]').on('click', function (e) {
e.preventDefault(); e.preventDefault();
window.location.href = "BlogPosts/Create" window.location.href = "BlogPosts/Create"

2
modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/CmsKitCommonApplicationAutoMapperProfile.cs

@ -1,7 +1,5 @@
using AutoMapper; using AutoMapper;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.Contents;
using Volo.CmsKit.Pages;
using Volo.CmsKit.Tags; using Volo.CmsKit.Tags;
using Volo.CmsKit.Users; using Volo.CmsKit.Users;

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

@ -8,8 +8,6 @@
public const string EntityNotTaggable = "CmsKit:Tag:0002"; public const string EntityNotTaggable = "CmsKit:Tag:0002";
} }
public const string ContentAlreadyExist = "CmsKit:0002";
public static class Pages public static class Pages
{ {
public const string SlugAlreadyExist = "CmsKit:Page:0001"; public const string SlugAlreadyExist = "CmsKit:Page:0001";

15
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Contents/ContentConsts.cs

@ -1,15 +0,0 @@
using System;
using Volo.CmsKit.Entities;
namespace Volo.CmsKit.Contents
{
public static class ContentConsts
{
public static int MaxEntityTypeLength { get; set; } = CmsEntityConsts.MaxEntityTypeLength;
public static int MaxEntityIdLength { get; set; } = CmsEntityConsts.MaxEntityIdLength;
// TODO: consider
public static int MaxValueLength { get; set; } = int.MaxValue;
}
}

10
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Blog.cs

@ -3,7 +3,6 @@ using System;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.CmsKit.Blogs.Extensions;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
@ -17,7 +16,12 @@ namespace Volo.CmsKit.Blogs
public virtual Guid? TenantId { get; protected set; } public virtual Guid? TenantId { get; protected set; }
protected internal Blog(Guid id, [NotNull] string name, [NotNull] string slug, [CanBeNull] Guid? tenantId = null) : base(id) protected internal Blog(
Guid id,
[NotNull] string name,
[NotNull] string slug,
[CanBeNull] Guid? tenantId = null
) : base(id)
{ {
SetName(name); SetName(name);
SetSlug(slug); SetSlug(slug);
@ -33,7 +37,7 @@ namespace Volo.CmsKit.Blogs
{ {
Check.NotNullOrWhiteSpace(slug, nameof(slug), BlogConsts.MaxNameLength); Check.NotNullOrWhiteSpace(slug, nameof(slug), BlogConsts.MaxNameLength);
Slug = slug.NormalizeSlug(); Slug = SlugNormalizer.Normalize(slug);
} }
} }
} }

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

@ -5,13 +5,13 @@ using Volo.Abp.Domain.Entities.Auditing;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
public class BlogFeature : FullAuditedAggregateRoot<Guid>, IEquatable<BlogFeature> public class BlogFeature : FullAuditedAggregateRoot<Guid>
{ {
public Guid BlogId { get; protected set; } public Guid BlogId { get; protected set; }
public string FeatureName { get; protected set; } public string FeatureName { get; protected set; }
public bool IsEnabled { get; set; } = true; public bool IsEnabled { get; protected internal set; }
public BlogFeature(Guid blogId, [NotNull] string featureName, bool isEnabled = true) public BlogFeature(Guid blogId, [NotNull] string featureName, bool isEnabled = true)
{ {
@ -19,10 +19,5 @@ namespace Volo.CmsKit.Blogs
FeatureName = Check.NotNullOrWhiteSpace(featureName, nameof(featureName)); FeatureName = Check.NotNullOrWhiteSpace(featureName, nameof(featureName));
IsEnabled = isEnabled; IsEnabled = isEnabled;
} }
public bool Equals(BlogFeature other)
{
return BlogId == other?.BlogId && FeatureName == other?.FeatureName;
}
} }
} }

25
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogFeatureManager.cs

@ -1,10 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Volo.Abp.Domain.Services; using Volo.Abp.Domain.Services;
using Volo.Abp.EventBus.Distributed;
using Volo.Abp.EventBus.Local;
using Volo.Abp.Uow;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
@ -22,17 +20,6 @@ namespace Volo.CmsKit.Blogs
DefaultBlogFeatureProvider = defaultBlogFeatureProvider; DefaultBlogFeatureProvider = defaultBlogFeatureProvider;
} }
public async Task<List<BlogFeature>> GetListAsync(Guid blogId)
{
var blogFeatures = await BlogFeatureRepository.GetListAsync(blogId);
var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId);
defaultFeatures.ForEach(x => blogFeatures.AddIfNotContains(x));
return blogFeatures;
}
public async Task SetAsync(Guid blogId, string featureName, bool isEnabled) public async Task SetAsync(Guid blogId, string featureName, bool isEnabled)
{ {
var blogFeature = await BlogFeatureRepository.FindAsync(blogId, featureName); var blogFeature = await BlogFeatureRepository.FindAsync(blogId, featureName);
@ -47,5 +34,15 @@ namespace Volo.CmsKit.Blogs
await BlogFeatureRepository.UpdateAsync(blogFeature); await BlogFeatureRepository.UpdateAsync(blogFeature);
} }
} }
public async Task SetDefaultsAsync(Guid blogId)
{
var defaultFeatures = await DefaultBlogFeatureProvider.GetDefaultFeaturesAsync(blogId);
foreach (var feature in defaultFeatures)
{
await SetAsync(blogId, feature.FeatureName, isEnabled: true);
}
}
} }
} }

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

@ -3,7 +3,6 @@ using System;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Domain.Entities.Auditing; using Volo.Abp.Domain.Entities.Auditing;
using Volo.Abp.MultiTenancy; using Volo.Abp.MultiTenancy;
using Volo.CmsKit.Blogs.Extensions;
using Volo.CmsKit.Users; using Volo.CmsKit.Users;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
@ -65,7 +64,7 @@ namespace Volo.CmsKit.Blogs
{ {
Check.NotNullOrWhiteSpace(slug, nameof(slug), BlogPostConsts.MaxSlugLength, BlogPostConsts.MinSlugLength); Check.NotNullOrWhiteSpace(slug, nameof(slug), BlogPostConsts.MaxSlugLength, BlogPostConsts.MinSlugLength);
Slug = slug.NormalizeSlug(); Slug = SlugNormalizer.Normalize(slug);
} }
public virtual void SetShortDescription(string shortDescription) public virtual void SetShortDescription(string shortDescription)

8
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostManager.cs

@ -12,13 +12,17 @@ namespace Volo.CmsKit.Blogs
{ {
protected IBlogPostRepository BlogPostRepository { get; } protected IBlogPostRepository BlogPostRepository { get; }
protected IBlogRepository BlogRepository { get; } protected IBlogRepository BlogRepository { get; }
protected IDefaultBlogFeatureProvider BlogFeatureProvider { get; }
public BlogPostManager( public BlogPostManager(
IBlogPostRepository blogPostRepository, IBlogPostRepository blogPostRepository,
IBlogRepository blogRepository) IBlogRepository blogRepository,
IDefaultBlogFeatureProvider blogFeatureProvider)
{ {
BlogPostRepository = blogPostRepository; BlogPostRepository = blogPostRepository;
BlogRepository = blogRepository; BlogRepository = blogRepository;
BlogFeatureProvider = blogFeatureProvider;
} }
public virtual async Task<BlogPost> CreateAsync( public virtual async Task<BlogPost> CreateAsync(
@ -35,8 +39,6 @@ namespace Volo.CmsKit.Blogs
Check.NotNullOrEmpty(title, nameof(title)); Check.NotNullOrEmpty(title, nameof(title));
Check.NotNullOrEmpty(slug, nameof(slug)); Check.NotNullOrEmpty(slug, nameof(slug));
await CheckBlogExistenceAsync(blog.Id);
var blogPost = new BlogPost( var blogPost = new BlogPost(
GuidGenerator.Create(), GuidGenerator.Create(),
blog.Id, blog.Id,

7
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogPostSlugAlreadyExistException.cs

@ -6,11 +6,8 @@ namespace Volo.CmsKit.Blogs
{ {
public class BlogPostSlugAlreadyExistException : BusinessException public class BlogPostSlugAlreadyExistException : BusinessException
{ {
internal BlogPostSlugAlreadyExistException(string code = null, string message = null, string details = null, Exception innerException = null, Microsoft.Extensions.Logging.LogLevel logLevel = Microsoft.Extensions.Logging.LogLevel.Warning) : base(code, message, details, innerException, logLevel) public BlogPostSlugAlreadyExistException(SerializationInfo serializationInfo, StreamingContext context)
{ : base(serializationInfo, context)
}
internal BlogPostSlugAlreadyExistException(SerializationInfo serializationInfo, System.Runtime.Serialization.StreamingContext context) : base(serializationInfo, context)
{ {
} }

7
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/BlogSlugAlreadyExistException.cs

@ -8,14 +8,13 @@ namespace Volo.CmsKit.Blogs
public class BlogSlugAlreadyExistException : BusinessException public class BlogSlugAlreadyExistException : BusinessException
{ {
public BlogSlugAlreadyExistException(string slug) public BlogSlugAlreadyExistException(string slug)
: base(code: CmsKitErrorCodes.Blogs.SlugAlreadyExists)
{ {
Code = CmsKitErrorCodes.Blogs.SlugAlreadyExists;
WithData(nameof(Blog.Slug), slug); WithData(nameof(Blog.Slug), slug);
} }
public BlogSlugAlreadyExistException( public BlogSlugAlreadyExistException(SerializationInfo serializationInfo, StreamingContext context)
SerializationInfo serializationInfo, StreamingContext context) : base(serializationInfo, context) : base(serializationInfo, context)
{ {
} }
} }

17
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/IBlogPostRepository.cs

@ -8,12 +8,21 @@ namespace Volo.CmsKit.Blogs
{ {
public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid> public interface IBlogPostRepository : IBasicRepository<BlogPost, Guid>
{ {
Task<int> GetCountAsync(
string filter = null,
Guid? blogId = null,
CancellationToken cancellationToken = default);
Task<List<BlogPost>> GetListAsync(
string filter = null,
Guid? blogId = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
CancellationToken cancellationToken = default);
Task<bool> SlugExistsAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task<bool> SlugExistsAsync(Guid blogId, string slug, CancellationToken cancellationToken = default);
Task<BlogPost> GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default); Task<BlogPost> GetBySlugAsync(Guid blogId, string slug, CancellationToken cancellationToken = default);
Task<List<BlogPost>> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, string sorting, bool includeDetails = false, CancellationToken cancellationToken = default);
Task<int> GetCountAsync(Guid blogId, CancellationToken cancellationToken = default);
} }
} }

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

@ -29,17 +29,20 @@ namespace Volo.CmsKit.MediaDescriptors
{ {
Check.NotNullOrWhiteSpace(entityType, nameof(entityType)); Check.NotNullOrWhiteSpace(entityType, nameof(entityType));
var result = Options.EntityTypes.SingleOrDefault(x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)) ?? var definition = Options.EntityTypes.SingleOrDefault(
throw new EntityCantHaveMediaException(entityType); x => x.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)
) ?? throw new EntityCantHaveMediaException(entityType);
return Task.FromResult(result); return Task.FromResult(definition);
} }
public virtual Task<bool> IsDefinedAsync([NotNull] string entityType) public virtual Task<bool> IsDefinedAsync([NotNull] string entityType)
{ {
Check.NotNullOrEmpty(entityType, nameof(entityType)); Check.NotNullOrEmpty(entityType, nameof(entityType));
var isDefined = Options.EntityTypes.Any(a => a.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)); var isDefined = Options.EntityTypes.Any(
a => a.EntityType.Equals(entityType, StringComparison.InvariantCultureIgnoreCase)
);
return Task.FromResult(isDefined); return Task.FromResult(isDefined);
} }

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

@ -9,10 +9,10 @@ namespace Volo.CmsKit.MediaDescriptors
{ {
} }
public EntityCantHaveMediaException(string entityType) public EntityCantHaveMediaException(string entityType)
: base(code: CmsKitErrorCodes.MediaDescriptors.EntityTypeDoesntExist)
{ {
EntityType = entityType; EntityType = entityType;
Code = CmsKitErrorCodes.MediaDescriptors.EntityTypeDoesntExist;
WithData(nameof(entityType), EntityType); WithData(nameof(entityType), EntityType);
} }

4
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/Page.cs

@ -20,7 +20,7 @@ namespace Volo.CmsKit.Pages
{ {
} }
public Page(Guid id, [NotNull] string title, [NotNull] string slug, string content = null, Guid? tenantId = null) : base(id) internal Page(Guid id, [NotNull] string title, [NotNull] string slug, string content = null, Guid? tenantId = null) : base(id)
{ {
TenantId = tenantId; TenantId = tenantId;
@ -34,7 +34,7 @@ namespace Volo.CmsKit.Pages
Title = Check.NotNullOrEmpty(title, nameof(title), PageConsts.MaxTitleLength); Title = Check.NotNullOrEmpty(title, nameof(title), PageConsts.MaxTitleLength);
} }
public virtual void SetSlug(string slug) internal virtual void SetSlug(string slug)
{ {
Slug = Check.NotNullOrEmpty(slug, nameof(slug), PageConsts.MaxSlugLength); Slug = Check.NotNullOrEmpty(slug, nameof(slug), PageConsts.MaxSlugLength);
} }

56
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Pages/PageManager.cs

@ -0,0 +1,56 @@
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Domain.Services;
namespace Volo.CmsKit.Pages
{
public class PageManager : DomainService
{
protected IPageRepository PageRepository { get; }
public PageManager(IPageRepository pageRepository)
{
PageRepository = pageRepository;
}
public virtual async Task<Page> CreateAsync(
[NotNull] string title,
[NotNull] string slug,
[CanBeNull] string content = null)
{
Check.NotNullOrEmpty(title, nameof(title));
Check.NotNullOrEmpty(slug, nameof(slug));
await CheckPageSlugAsync(slug);
return new Page(
GuidGenerator.Create(),
title,
slug,
content,
CurrentTenant.Id);
}
public virtual async Task SetSlugAsync(Page page, string newSlug)
{
if (page.Slug != newSlug)
{
await CheckPageSlugAsync(newSlug);
page.SetSlug(newSlug);
}
}
protected virtual async Task CheckPageSlugAsync(string slug)
{
if (await PageRepository.ExistsAsync(slug))
{
throw new PageSlugAlreadyExistsException(slug);
}
}
}
}

6
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Blogs/Extensions/SlugExtensions.cs → modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/SlugNormalizer.cs

@ -1,12 +1,12 @@
using Slugify; using Slugify;
using Unidecode.NET; using Unidecode.NET;
namespace Volo.CmsKit.Blogs.Extensions namespace Volo.CmsKit
{ {
public static class SlugExtensions public static class SlugNormalizer
{ {
static readonly SlugHelper SlugHelper = new (); static readonly SlugHelper SlugHelper = new ();
public static string NormalizeSlug(this string value) public static string Normalize(string value)
{ {
return SlugHelper.GenerateSlug(value?.Unidecode()); return SlugHelper.GenerateSlug(value?.Unidecode());
} }

60
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Blogs/EfCoreBlogPostRepository.cs

@ -33,48 +33,58 @@ namespace Volo.CmsKit.Blogs
blogPost.Author = await (await GetDbContextAsync()) blogPost.Author = await (await GetDbContextAsync())
.Set<CmsUser>() .Set<CmsUser>()
.FirstOrDefaultAsync(x =>x.Id == blogPost.AuthorId); .FirstOrDefaultAsync(x =>x.Id == blogPost.AuthorId, GetCancellationToken(cancellationToken));
return blogPost; return blogPost;
} }
public async Task<int> GetCountAsync(Guid blogId, CancellationToken cancellationToken = default) public virtual async Task<int> GetCountAsync(
string filter = null,
Guid? blogId = null,
CancellationToken cancellationToken = default)
{ {
return await (await GetQueryableAsync()).CountAsync( var queryable = (await GetDbSetAsync())
x => x.BlogId == blogId, .WhereIf(blogId.HasValue, x => x.BlogId == blogId)
GetCancellationToken(cancellationToken)); .WhereIf(!string.IsNullOrEmpty(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
var count = await queryable.CountAsync(GetCancellationToken(cancellationToken));
return count;
} }
public async Task<List<BlogPost>> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, public virtual async Task<List<BlogPost>> GetListAsync(
string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) string filter = null,
Guid? blogId = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
CancellationToken cancellationToken = default)
{ {
var dbContext = await GetDbContextAsync(); var dbContext = await GetDbContextAsync();
var blogPostsDbSet = dbContext.Set<BlogPost>(); var blogPostsDbSet = dbContext.Set<BlogPost>();
var usersDbSet = dbContext.Set<CmsUser>(); var usersDbSet = dbContext.Set<CmsUser>();
var queryable = blogPostsDbSet var queryable = blogPostsDbSet
.Where(x => x.BlogId == blogId); .WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
if (!sorting.IsNullOrWhiteSpace())
{
queryable = queryable.OrderBy(sorting);
}
queryable = queryable.OrderBy(sorting ?? $"{nameof(BlogPost.CreationTime)} desc");
var combinedResult = await queryable var combinedResult = await queryable
.Join( .Join(
usersDbSet, usersDbSet,
o => o.AuthorId, o => o.AuthorId,
i => i.Id, i => i.Id,
(blogPost,user) => new { blogPost, user }) (blogPost,user) => new { blogPost, user })
.Skip(skipCount) .Skip(skipCount)
.Take(maxResultCount) .Take(maxResultCount)
.ToListAsync(GetCancellationToken(cancellationToken)); .ToListAsync(GetCancellationToken(cancellationToken));
return combinedResult.Select(s => return combinedResult.Select(s =>
{ {
s.blogPost.Author = s.user; s.blogPost.Author = s.user;
return s.blogPost; return s.blogPost;
}).ToList(); }).ToList();
} }
public async Task<bool> SlugExistsAsync(Guid blogId, [NotNull] string slug, public async Task<bool> SlugExistsAsync(Guid blogId, [NotNull] string slug,

1
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/EntityFrameworkCore/CmsKitEntityFrameworkCoreModule.cs

@ -4,7 +4,6 @@ using Volo.Abp.Modularity;
using Volo.Abp.Users.EntityFrameworkCore; using Volo.Abp.Users.EntityFrameworkCore;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.Comments; using Volo.CmsKit.Comments;
using Volo.CmsKit.Contents;
using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
using Volo.CmsKit.Ratings; using Volo.CmsKit.Ratings;

42
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Blogs/MongoBlogPostRepository.cs

@ -27,41 +27,51 @@ namespace Volo.CmsKit.MongoDB.Blogs
{ {
Check.NotNullOrEmpty(slug, nameof(slug)); Check.NotNullOrEmpty(slug, nameof(slug));
var token = GetCancellationToken(cancellationToken);
var blogPost = await GetAsync(x => var blogPost = await GetAsync(x =>
x.BlogId == blogId && x.BlogId == blogId &&
x.Slug.ToLower() == slug, x.Slug.ToLower() == slug,
cancellationToken: GetCancellationToken(cancellationToken)); cancellationToken: token);
var dbContext = await GetDbContextAsync(); var dbContext = await GetDbContextAsync(token);
blogPost.Author = await dbContext.Collection<CmsUser>().AsQueryable().FirstOrDefaultAsync(x => x.Id == blogPost.AuthorId); blogPost.Author = await dbContext.Collection<CmsUser>().AsQueryable().FirstOrDefaultAsync(x => x.Id == blogPost.AuthorId, token);
return blogPost; return blogPost;
} }
public async Task<int> GetCountAsync(Guid blogId, CancellationToken cancellationToken = default) public async Task<int> GetCountAsync(
string filter = null,
Guid? blogId = null,
CancellationToken cancellationToken = default)
{ {
return await AsyncExecuter.CountAsync( var token = GetCancellationToken(cancellationToken);
await WithDetailsAsync(),
x => x.BlogId == blogId, return await (await GetMongoQueryableAsync(token))
GetCancellationToken(cancellationToken)); .WhereIf<BlogPost, IMongoQueryable<BlogPost>>(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter))
.WhereIf<BlogPost, IMongoQueryable<BlogPost>>(blogId.HasValue, x => x.BlogId == blogId)
.CountAsync(GetCancellationToken(cancellationToken));
} }
public async Task<List<BlogPost>> GetPagedListAsync(Guid blogId, int skipCount, int maxResultCount, public async Task<List<BlogPost>> GetListAsync(
string sorting, bool includeDetails = false, CancellationToken cancellationToken = default) string filter = null,
Guid? blogId = null,
int maxResultCount = int.MaxValue,
int skipCount = 0,
string sorting = null,
CancellationToken cancellationToken = default)
{ {
var token = GetCancellationToken(cancellationToken); var token = GetCancellationToken(cancellationToken);
var dbContext = await GetDbContextAsync(token); var dbContext = await GetDbContextAsync(token);
var blogPostQueryable = dbContext.Collection<BlogPost>().AsQueryable(); var blogPostQueryable = dbContext.Collection<BlogPost>().AsQueryable();
var usersQueryable = dbContext.Collection<CmsUser>().AsQueryable(); var usersQueryable = dbContext.Collection<CmsUser>().AsQueryable();
IQueryable<BlogPost> queryable = blogPostQueryable var queryable = blogPostQueryable
.Where(x => x.BlogId == blogId); .WhereIf(blogId.HasValue, x => x.BlogId == blogId)
.WhereIf(!string.IsNullOrWhiteSpace(filter), x => x.Title.Contains(filter) || x.Slug.Contains(filter));
if (!sorting.IsNullOrWhiteSpace()) queryable = queryable.OrderBy(sorting ?? $"{nameof(BlogPost.CreationTime)} desc");
{
queryable = queryable.OrderBy(sorting);
}
var combinedQueryable = queryable var combinedQueryable = queryable
.Join( .Join(

3
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContext.cs

@ -1,9 +1,8 @@
using MongoDB.Driver; using MongoDB.Driver;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
using Volo.CmsKit.Comments;
using Volo.CmsKit.Contents;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.Comments;
using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
using Volo.CmsKit.Ratings; using Volo.CmsKit.Ratings;

3
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/CmsKitMongoDbContextExtensions.cs

@ -1,9 +1,8 @@
using System; using System;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
using Volo.CmsKit.Comments;
using Volo.CmsKit.Contents;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.Comments;
using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
using Volo.CmsKit.Ratings; using Volo.CmsKit.Ratings;

3
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/ICmsKitMongoDbContext.cs

@ -1,9 +1,8 @@
using MongoDB.Driver; using MongoDB.Driver;
using Volo.Abp.Data; using Volo.Abp.Data;
using Volo.Abp.MongoDB; using Volo.Abp.MongoDB;
using Volo.CmsKit.Comments;
using Volo.CmsKit.Contents;
using Volo.CmsKit.Blogs; using Volo.CmsKit.Blogs;
using Volo.CmsKit.Comments;
using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.MediaDescriptors;
using Volo.CmsKit.Pages; using Volo.CmsKit.Pages;
using Volo.CmsKit.Ratings; using Volo.CmsKit.Ratings;

4
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Blogs/BlogPostPublicAppService.cs

@ -36,10 +36,10 @@ namespace Volo.CmsKit.Public.Blogs
{ {
var blog = await BlogRepository.GetBySlugAsync(blogSlug); var blog = await BlogRepository.GetBySlugAsync(blogSlug);
var blogPosts = await BlogPostRepository.GetPagedListAsync(blog.Id, input.SkipCount, input.MaxResultCount, input.Sorting); var blogPosts = await BlogPostRepository.GetListAsync(null, blog.Id,input.MaxResultCount, input.SkipCount, input.Sorting);
return new PagedResultDto<BlogPostPublicDto>( return new PagedResultDto<BlogPostPublicDto>(
await BlogPostRepository.GetCountAsync(blog.Id), await BlogPostRepository.GetCountAsync(blogId: blog.Id),
ObjectMapper.Map<List<BlogPost>, List<BlogPostPublicDto>>(blogPosts)); ObjectMapper.Map<List<BlogPost>, List<BlogPostPublicDto>>(blogPosts));
} }
} }

5
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Comments/CommentPublicAppService.cs

@ -7,6 +7,7 @@ using Microsoft.Extensions.Options;
using Volo.Abp; using Volo.Abp;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
using Volo.Abp.Authorization;
using Volo.Abp.EventBus.Distributed; using Volo.Abp.EventBus.Distributed;
using Volo.Abp.Uow; using Volo.Abp.Uow;
using Volo.Abp.Users; using Volo.Abp.Users;
@ -82,7 +83,7 @@ namespace Volo.CmsKit.Public.Comments
if (comment.CreatorId != CurrentUser.GetId()) if (comment.CreatorId != CurrentUser.GetId())
{ {
throw new BusinessException(); //TODO: AbpAuthorizationException! throw new AbpAuthorizationException();
} }
comment.SetText(input.Text); comment.SetText(input.Text);
@ -99,7 +100,7 @@ namespace Volo.CmsKit.Public.Comments
if (comment.CreatorId != CurrentUser.GetId()) if (comment.CreatorId != CurrentUser.GetId())
{ {
throw new BusinessException(); //TODO: AbpAuthorizationException! throw new AbpAuthorizationException();
} }
await CommentRepository.DeleteWithRepliesAsync(comment); await CommentRepository.DeleteWithRepliesAsync(comment);

2
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Blogs/BlogFeatureAdminAppService_Test.cs

@ -61,7 +61,7 @@ namespace Volo.CmsKit.Blogs
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
result.Count.ShouldBeGreaterThan(2); // 2 are seeded and there are built-in Features. result.Count.ShouldBeGreaterThanOrEqualTo(2); // 2 are seeded and there are built-in Features.
} }
} }
} }

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

@ -98,7 +98,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetListAsync_ShouldWorkProperly_WithDefaultParameters() public async Task GetListAsync_ShouldWorkProperly_WithDefaultParameters()
{ {
var list = await blogPostAdminAppService.GetListAsync(new PagedAndSortedResultRequestDto()); var list = await blogPostAdminAppService.GetListAsync(new BlogPostGetListInput());
list.ShouldNotBeNull(); list.ShouldNotBeNull();
list.TotalCount.ShouldBe(2); list.TotalCount.ShouldBe(2);

6
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Pages/PageAdminAppService_Tests.cs

@ -1,10 +1,8 @@
using System; using Shouldly;
using System;
using System.Linq; using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Shouldly;
using Volo.Abp.Uow;
using Volo.CmsKit.Admin.Pages; using Volo.CmsKit.Admin.Pages;
using Volo.CmsKit.Contents;
using Xunit; using Xunit;
namespace Volo.CmsKit.Pages namespace Volo.CmsKit.Pages

27
modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Blogs/SlugExtensions_Tests.cs

@ -1,12 +1,5 @@
using System; using Shouldly;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xunit; using Xunit;
using Volo.CmsKit.Blogs.Extensions;
using Shouldly;
using Unidecode.NET;
namespace Volo.CmsKit.Blogs namespace Volo.CmsKit.Blogs
{ {
@ -20,7 +13,7 @@ namespace Volo.CmsKit.Blogs
var expected = "my-awesome-name"; var expected = "my-awesome-name";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -33,7 +26,7 @@ namespace Volo.CmsKit.Blogs
var expected = "my-perfect-title-v.2"; var expected = "my-perfect-title-v.2";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -47,7 +40,7 @@ namespace Volo.CmsKit.Blogs
var expected = "are-you-gonna-die"; var expected = "are-you-gonna-die";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -61,7 +54,7 @@ namespace Volo.CmsKit.Blogs
var expected = "we-machines-challenge"; var expected = "we-machines-challenge";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -75,7 +68,7 @@ namespace Volo.CmsKit.Blogs
var expected = "go-and-code-part-2"; var expected = "go-and-code-part-2";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -89,7 +82,7 @@ namespace Volo.CmsKit.Blogs
var expected = "moe-klassnoe-nazvanie"; var expected = "moe-klassnoe-nazvanie";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -103,7 +96,7 @@ namespace Volo.CmsKit.Blogs
var expected = "ozel-turkce-karakterler-gusioc"; var expected = "ozel-turkce-karakterler-gusioc";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -117,7 +110,7 @@ namespace Volo.CmsKit.Blogs
var expected = "wo-de-zhen-bang-tou-xian"; var expected = "wo-de-zhen-bang-tou-xian";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);
@ -131,7 +124,7 @@ namespace Volo.CmsKit.Blogs
var expected = "lets-rock"; var expected = "lets-rock";
// Act // Act
var actual = name.NormalizeSlug(); var actual = SlugNormalizer.Normalize(name);
// Assert // Assert
actual.ShouldBe(expected); actual.ShouldBe(expected);

70
modules/cms-kit/test/Volo.CmsKit.Domain.Tests/Pages/PageManager_Test.cs

@ -0,0 +1,70 @@
using Shouldly;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Pages
{
public class PageManager_Test : CmsKitDomainTestBase
{
private readonly PageManager pageManager;
private readonly CmsKitTestData testData;
private readonly IPageRepository pageRepository;
public PageManager_Test()
{
pageManager = GetRequiredService<PageManager>();
testData = GetRequiredService<CmsKitTestData>();
pageRepository = GetRequiredService<IPageRepository>();
}
public async Task CreateAsync_ShouldWorkProperly_WithNonExistingSlug()
{
var title = "My awesome page";
var slug = "my-awesome-page";
var content = "<h1>My Awesome Page</h1><p>This is my awesome page content!</p>";
var page = await pageManager.CreateAsync(title, slug, content);
page.ShouldNotBeNull();
page.Title.ShouldBe(title);
page.Slug.ShouldBe(slug);
page.Content.ShouldBe(content);
}
public async Task CreateAsync_ShouldThrowException_WithExistingSlug()
{
var title = "My awesome page";
var slug = testData.Page_1_Slug;
var content = "<h1>My Awesome Page</h1><p>This is my awesome page content!</p>";
var exception = await Should.ThrowAsync<PageSlugAlreadyExistsException>(async () =>
await pageManager.CreateAsync(title, slug, content));
exception.ShouldNotBeNull();
}
public async Task SetSlugAsync_ShouldWorkProperly_WithNonExistingSlug()
{
var newSlug = "freshly-generated-new-slug";
var page = await pageRepository.GetAsync(testData.Page_1_Id);
await pageManager.SetSlugAsync(page, newSlug);
page.Slug.ShouldBe(newSlug);
}
public async Task SetSlugAsync_ShouldThrowException_WithExistingSlug()
{
var newSlug = testData.Page_2_Slug;
var page = await pageRepository.GetAsync(testData.Page_1_Id);
var exception = await Should.ThrowAsync<PageSlugAlreadyExistsException>(async () =>
await pageManager.SetSlugAsync(page, newSlug));
exception.ShouldNotBeNull();
}
}
}

10
modules/cms-kit/test/Volo.CmsKit.TestBase/Blogs/BlogPostRepository_Test.cs

@ -97,7 +97,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithoutSorting() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 0, 10, default); var result = await blogPostRepository.GetListAsync(null, testData.Blog_Id);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -107,7 +107,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldHaveAuthor_WithBlogId_WhileGetting10_WithoutSorting() public async Task GetPagedListAsync_ShouldHaveAuthor_WithBlogId_WhileGetting10_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 0, 10, default); var result = await blogPostRepository.GetListAsync(null, testData.Blog_Id);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -119,7 +119,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1_WithoutSorting() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, default, 1, default); var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, maxResultCount: 1);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -129,7 +129,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1InPage2_WithoutSorting() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting1InPage2_WithoutSorting()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, 1, 1, default); var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, skipCount: 1, maxResultCount: 1);
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();
@ -139,7 +139,7 @@ namespace Volo.CmsKit.Blogs
[Fact] [Fact]
public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithSortingByTitle() public async Task GetPagedListAsync_ShouldWorkProperly_WithBlogId_WhileGetting10_WithSortingByTitle()
{ {
var result = await blogPostRepository.GetPagedListAsync(testData.Blog_Id, default, 10, nameof(BlogPost.Title)); var result = await blogPostRepository.GetListAsync(blogId: testData.Blog_Id, sorting: $"{nameof(BlogPost.Title)} asc");
result.ShouldNotBeNull(); result.ShouldNotBeNull();
result.ShouldNotBeEmpty(); result.ShouldNotBeEmpty();

5
modules/docs/src/Volo.Docs.Web/Pages/Documents/Shared/Scripts/vs.js

@ -8,6 +8,11 @@
$('li:not(.last-link) span.plus-icon i.fa-chevron-right').click( $('li:not(.last-link) span.plus-icon i.fa-chevron-right').click(
function () { function () {
var $element = $(this).parent(); var $element = $(this).parent();
var $filter = $('.docs-version #filter');
if ($filter && $filter.val() != ''){
return;
}
$element.parent().children('ul.tree').toggle(100); $element.parent().children('ul.tree').toggle(100);
$element.closest('li').toggleClass('selected-tree'); $element.closest('li').toggleClass('selected-tree');

13156
npm/ng-packs/packages/schematics/src/mocks/api-definition.json

File diff suppressed because it is too large

2
npm/ng-packs/packages/schematics/src/models/api-definition.ts

@ -16,6 +16,7 @@ export interface Type {
export interface PropertyDef { export interface PropertyDef {
name: string; name: string;
jsonName: string | null;
type: string; type: string;
typeSimple: string; typeSimple: string;
isRequired: boolean; isRequired: boolean;
@ -61,6 +62,7 @@ export interface ParameterInSignature {
export interface ParameterInBody { export interface ParameterInBody {
nameOnMethod: string; nameOnMethod: string;
name: string; name: string;
jsonName: string | null;
type: string; type: string;
typeSimple: string; typeSimple: string;
isOptional: boolean; isOptional: boolean;

9
npm/ng-packs/packages/schematics/src/models/method.ts

@ -41,20 +41,21 @@ export class Body {
url: string; url: string;
registerActionParameter = (param: ParameterInBody) => { registerActionParameter = (param: ParameterInBody) => {
const { bindingSourceId, descriptorName, name, nameOnMethod } = param; const { bindingSourceId, descriptorName, jsonName, name, nameOnMethod } = param;
const camelName = camel(name); const camelName = camel(name);
const value = descriptorName ? `${descriptorName}.${camelName}` : nameOnMethod; const paramName = jsonName || camelName;
const value = descriptorName ? `${descriptorName}.${paramName}` : nameOnMethod;
switch (bindingSourceId) { switch (bindingSourceId) {
case eBindingSourceId.Model: case eBindingSourceId.Model:
case eBindingSourceId.Query: case eBindingSourceId.Query:
this.params.push(`${camelName}: ${value}`); this.params.push(`${paramName}: ${value}`);
break; break;
case eBindingSourceId.Body: case eBindingSourceId.Body:
this.body = value; this.body = value;
break; break;
case eBindingSourceId.Path: case eBindingSourceId.Path:
const regex = new RegExp('{(' + camelName + '|' + name + ')}', 'g'); const regex = new RegExp('{(' + paramName + '|' + camelName + '|' + name + ')}', 'g');
this.url = this.url.replace(regex, '${' + value + '}'); this.url = this.url.replace(regex, '${' + value + '}');
break; break;
default: default:

2
npm/ng-packs/packages/schematics/src/utils/model.ts

@ -134,7 +134,7 @@ export function createImportRefToInterfaceReducerCreator(params: ModelGeneratorP
genericsCollector.reset(); genericsCollector.reset();
typeDef.properties?.forEach(prop => { typeDef.properties?.forEach(prop => {
const name = camel(prop.name); const name = prop.jsonName || camel(prop.name);
const type = simplifyType(prop.typeSimple); const type = simplifyType(prop.typeSimple);
const refs = parseType(prop.type).reduce( const refs = parseType(prop.type).reduce(
(acc: string[], r) => acc.concat(parseGenerics(r).toGenerics()), (acc: string[], r) => acc.concat(parseGenerics(r).toGenerics()),

Loading…
Cancel
Save