Browse Source

CmsKit - BlogPost Tagging

pull/7226/head
enisn 6 years ago
parent
commit
9c742d7eac
  1. 15
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs
  2. 2
      modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/IEntityTagAdminAppService.cs
  3. 30
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationModule.cs
  4. 39
      modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/EntityTagAdminAppService.cs
  5. 42
      modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/EntityTagAdminController.cs
  6. 2
      modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/ITagAppService.cs
  7. 2
      modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Tags/TagAppService.cs
  8. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json
  9. 3
      modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json
  10. 2
      modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs
  11. 10
      modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs
  12. 9
      modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs
  13. 2
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml
  14. 4
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/Index.cshtml
  15. 27
      modules/cms-kit/src/Volo.CmsKit.Public.Web/Properties/launchSettings.json
  16. 2
      modules/cms-kit/test/Volo.CmsKit.Application.Tests/Tags/TagPublicAppService_Tests.cs
  17. 14
      modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Tags/EntityTagRepository_Test.cs
  18. 16
      modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Tags/EntityTagRepository_Test.cs
  19. 38
      modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/EntityTagRepository_Test.cs

15
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/EntityTagSetDto.cs

@ -0,0 +1,15 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace Volo.CmsKit.Admin.Tags
{
public class EntityTagSetDto
{
public string EntityId { get; set; }
public string EntityType { get; set; }
public List<string> Tags { get; set; }
}
}

2
modules/cms-kit/src/Volo.CmsKit.Admin.Application.Contracts/Volo/CmsKit/Admin/Tags/IEntityTagAdminAppService.cs

@ -7,5 +7,7 @@ namespace Volo.CmsKit.Admin.Tags
Task AddTagToEntityAsync(EntityTagCreateDto input);
Task RemoveTagFromEntityAsync(EntityTagRemoveDto input);
Task SetEntityTagsAsync(EntityTagSetDto input);
}
}

30
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/CmsKitAdminApplicationModule.cs

@ -1,6 +1,14 @@
using Microsoft.Extensions.DependencyInjection;
using System.Collections.Generic;
using Volo.Abp.AutoMapper;
using Volo.Abp.GlobalFeatures;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.CmsKit.Blogs;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Localization;
using Volo.CmsKit.Permissions;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin
{
@ -11,6 +19,11 @@ namespace Volo.CmsKit.Admin
)]
public class CmsKitAdminApplicationModule : AbpModule
{
public override void PreConfigureServices(ServiceConfigurationContext context)
{
ConfigureTagOptions();
}
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddAutoMapperObjectMapper<CmsKitAdminApplicationModule>();
@ -20,5 +33,22 @@ namespace Volo.CmsKit.Admin
options.AddMaps<CmsKitAdminApplicationModule>(validate: true);
});
}
private void ConfigureTagOptions()
{
Configure<CmsKitTagOptions>(opts =>
{
if (GlobalFeatureManager.Instance.IsEnabled<BlogsFeature>())
{
opts.EntityTypes.AddIfNotContains(
new TagEntityTypeDefiniton(
BlogPostConsts.EntityType,
LocalizableString.Create<CmsKitResource>("BlogPost"),
CmsKitAdminPermissions.BlogPosts.Update,
CmsKitAdminPermissions.BlogPosts.Update,
CmsKitAdminPermissions.BlogPosts.Update));
}
});
}
}
}

39
modules/cms-kit/src/Volo.CmsKit.Admin.Application/Volo/CmsKit/Admin/Tags/EntityTagAdminAppService.cs

@ -1,24 +1,32 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Volo.CmsKit.Admin.Tags;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Admin.Application.Volo.CmsKit.Admin.Tags
namespace Volo.CmsKit.Admin.Tags
{
public class EntityTagAdminAppService : CmsKitAdminAppServiceBase, IEntityTagAdminAppService
{
protected ITagDefinitionStore _tagDefinitionStore;
protected IEntityTagManager _entityTagManager;
protected ITagManager _tagManager;
protected readonly ITagDefinitionStore _tagDefinitionStore;
protected readonly IEntityTagManager _entityTagManager;
protected readonly ITagManager _tagManager;
protected readonly ITagRepository _tagRepository;
protected readonly IEntityTagRepository _entityTagRepository;
public EntityTagAdminAppService(
ITagDefinitionStore tagDefinitionStore,
IEntityTagManager entityTagManager,
ITagManager tagManager)
ITagManager tagManager,
ITagRepository tagRepository,
IEntityTagRepository entityTagRepository)
{
_tagDefinitionStore = tagDefinitionStore;
_entityTagManager = entityTagManager;
_tagManager = tagManager;
_tagRepository = tagRepository;
_entityTagRepository = entityTagRepository;
}
public async Task AddTagToEntityAsync(EntityTagCreateDto input)
@ -48,5 +56,26 @@ namespace Volo.CmsKit.Admin.Application.Volo.CmsKit.Admin.Tags
input.EntityId,
CurrentTenant?.Id);
}
public async Task SetEntityTagsAsync(EntityTagSetDto input)
{
var definition = await _tagDefinitionStore.GetTagEntityTypeDefinitionsAsync(input.EntityType);
await CheckPolicyAsync(definition.UpdatePolicy);
var existingTags = await _tagRepository.GetAllRelatedTagsAsync(input.EntityType, input.EntityId, CurrentTenant?.Id);
var deletedTags = existingTags.Where(x => !input.Tags.Contains(x.Name)).ToList();
var addedTags = input.Tags.Where(x => !existingTags.Any(a => a.Name == x));
await _entityTagRepository.DeleteManyAsync(deletedTags.Select(s => s.Id).ToArray());
foreach (var addedTag in addedTags)
{
var tag = await _tagManager.GetOrAddAsync(input.EntityType, addedTag, CurrentTenant?.Id);
await _entityTagManager.AddTagToEntityAsync(tag.Id, input.EntityType, input.EntityId, CurrentTenant?.Id);
}
}
}
}

42
modules/cms-kit/src/Volo.CmsKit.Admin.HttpApi/Volo/CmsKit/Admin/Tags/EntityTagAdminController.cs

@ -0,0 +1,42 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.GlobalFeatures;
using Volo.CmsKit.GlobalFeatures;
using Volo.CmsKit.Permissions;
namespace Volo.CmsKit.Admin.Tags
{
[RequiresGlobalFeature(typeof(TagsFeature))]
[RemoteService(Name = CmsKitCommonRemoteServiceConsts.RemoteServiceName)]
[Area("cms-kit")]
[Route("api/cms-kit-admin/entity-tags")]
public class EntityTagAdminController : CmsKitAdminController, IEntityTagAdminAppService
{
protected IEntityTagAdminAppService EntityTagAdminAppService { get; }
public EntityTagAdminController(IEntityTagAdminAppService entityTagAdminAppService)
{
EntityTagAdminAppService = entityTagAdminAppService;
}
[HttpPost]
public Task AddTagToEntityAsync(EntityTagCreateDto input)
{
return EntityTagAdminAppService.AddTagToEntityAsync(input);
}
[HttpDelete]
public Task RemoveTagFromEntityAsync(EntityTagRemoveDto input)
{
return EntityTagAdminAppService.RemoveTagFromEntityAsync(input);
}
[HttpPut]
public Task SetEntityTagsAsync(EntityTagSetDto input)
{
return EntityTagAdminAppService.SetEntityTagsAsync(input);
}
}
}

2
modules/cms-kit/src/Volo.CmsKit.Public.Application.Contracts/Volo/CmsKit/Public/Tags/ITagAppService.cs → modules/cms-kit/src/Volo.CmsKit.Common.Application.Contracts/Volo/CmsKit/Tags/ITagAppService.cs

@ -3,7 +3,7 @@ using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Public.Tags
namespace Volo.CmsKit.Tags
{
public interface ITagAppService : IApplicationService
{

2
modules/cms-kit/src/Volo.CmsKit.Public.Application/Volo/CmsKit/Public/Tags/TagAppService.cs → modules/cms-kit/src/Volo.CmsKit.Common.Application/Volo/CmsKit/Tags/TagAppService.cs

@ -5,7 +5,7 @@ using System.Text;
using System.Threading.Tasks;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.Public.Tags
namespace Volo.CmsKit.Tags
{
public class TagAppService : CmsKitAppServiceBase, ITagAppService
{

3
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/en.json

@ -4,11 +4,11 @@
"CmsKit:0002": "Content already exists!",
"CmsKit:0003": "The entity {0} is not taggable.",
"CmsKit:Page:0001": "The given url ({0}) already exists.",
"CmsKit:Tag:0002": "The entity is not taggable!",
"CommentAuthorizationExceptionMessage": "Those comments are not allowed for public display.",
"Comments": "Comments",
"Delete": "Delete",
"Edit": "Edit",
"Read": "Read",
"LastModification": "Last Modification",
"LoginToAddComment": "Login to add comment",
"LoginToRate": "Login to rate",
@ -30,6 +30,7 @@
"Permission:TagManagement.Update": "Update",
"PickYourReaction": "Pick your reaction",
"RatingUndoMessage": "Your rating will be undo.",
"Read": "Read",
"Reply": "Reply",
"Send": "Send",
"Star": "Star",

3
modules/cms-kit/src/Volo.CmsKit.Domain.Shared/Volo/CmsKit/Localization/Resources/tr.json

@ -4,11 +4,11 @@
"CmsKit:0002": "İçerik zaten mevcut!",
"CmsKit:0003": "{0} ögesi etiketlenebilir değil.",
"CmsKit:Page:0001": "Girilen url ({0}) kullanımdadır.",
"CmsKit:Tag:0002": "Bu öge etiketlenebilir değil.",
"CommentAuthorizationExceptionMessage": "Bu yorumları görebilmek için yetki gerekir.",
"Comments": "Yorumlar",
"Delete": "Sil",
"Edit": "Düzenle",
"Read": "Oku",
"LastModification": "Son Güncellenme",
"LoginToAddComment": "Yorum yapmak için giriş yap",
"LoginToRate": "Oylamak için giriş yapın",
@ -26,6 +26,7 @@
"Permission:TagManagement.Update": "Etiket Güncelleme",
"PickYourReaction": "Tepkinizi seçin",
"RatingUndoMessage": "Oylamanız geri alınacak.",
"Read": "Oku",
"Reply": "Cevapla",
"Send": "Gönder",
"Star": "Yıldız",

2
modules/cms-kit/src/Volo.CmsKit.Domain/Volo/CmsKit/Tags/IEntityTagRepository.cs

@ -13,5 +13,7 @@ namespace Volo.CmsKit.Tags
[NotNull] string entityId,
[CanBeNull] Guid? tenantId,
CancellationToken cancellationToken = default);
Task DeleteManyAsync(Guid[] tagIds, CancellationToken cancellationToken = default);
}
}

10
modules/cms-kit/src/Volo.CmsKit.EntityFrameworkCore/Volo/CmsKit/Tags/EfCoreEntityTagRepository.cs

@ -1,5 +1,8 @@
using JetBrains.Annotations;
using Nito.Disposables;
using System;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
@ -14,6 +17,13 @@ namespace Volo.CmsKit.Tags
{
}
public async Task DeleteManyAsync(Guid[] tagIds, CancellationToken cancellationToken = default)
{
var dbSet = await GetDbSetAsync();
dbSet.RemoveRange(dbSet.Where(x => tagIds.Contains(x.TagId)));
}
public Task<EntityTag> FindAsync(
[NotNull] Guid tagId,
[NotNull] string entityId,

9
modules/cms-kit/src/Volo.CmsKit.MongoDB/Volo/CmsKit/MongoDB/Tags/MongoEntityTagRepository.cs

@ -1,5 +1,7 @@
using JetBrains.Annotations;
using MongoDB.Driver;
using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Volo.Abp.Domain.Repositories.MongoDB;
@ -14,6 +16,13 @@ namespace Volo.CmsKit.MongoDB.Tags
{
}
public async Task DeleteManyAsync(Guid[] tagIds, CancellationToken cancellationToken = default)
{
var collection = await GetCollectionAsync();
await collection.DeleteManyAsync(Builders<EntityTag>.Filter.In(x => x.TagId, tagIds));
}
public Task<EntityTag> FindAsync(
[NotNull] Guid tagId,
[NotNull] string entityId,

2
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/BlogPost.cshtml

@ -1,4 +1,4 @@
@page "/b/{blogUrlSlug}/{blogPostUrlSlug}"
@page "/blogs/{blogUrlSlug}/{blogPostUrlSlug}"
@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Blogs.BlogPost
@using Volo.CmsKit.Public.Web.Pages.CmsKit.Shared.Components.Blogs.BlogPostComment

4
modules/cms-kit/src/Volo.CmsKit.Public.Web/Pages/CmsKit/Blogs/Index.cshtml

@ -1,4 +1,4 @@
@page "/b/{blogUrlSlug}"
@page "/blogs/{blogUrlSlug}"
@using Volo.CmsKit.Public.Web.Pages
@ -24,7 +24,7 @@
@blog.ShortDescription
</abp-card-text>
<abp-card-text>
<a href="/b/@Model.BlogUrlSlug/@blog.UrlSlug">
<a href="/blogs/@Model.BlogUrlSlug/@blog.UrlSlug">
<abp-button text="@L["Read"]"
button-type="Outline_Primary" />
</a>

27
modules/cms-kit/src/Volo.CmsKit.Public.Web/Properties/launchSettings.json

@ -0,0 +1,27 @@
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:60873/",
"sslPort": 44300
}
},
"profiles": {
"IIS Express": {
"commandName": "IISExpress",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"Volo.CmsKit.Public.Web": {
"commandName": "Project",
"launchBrowser": true,
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
},
"applicationUrl": "https://localhost:5001;http://localhost:5000"
}
}
}

2
modules/cms-kit/test/Volo.CmsKit.Application.Tests/Tags/TagPublicAppService_Tests.cs

@ -3,7 +3,7 @@ using NSubstitute;
using Shouldly;
using System.Threading.Tasks;
using Volo.Abp.Users;
using Volo.CmsKit.Public.Tags;
using Volo.CmsKit.Tags;
using Xunit;
namespace Volo.CmsKit.Tags

14
modules/cms-kit/test/Volo.CmsKit.EntityFrameworkCore.Tests/EntityFrameworkCore/Tags/EntityTagRepository_Test.cs

@ -0,0 +1,14 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.CmsKit.Tags;
namespace Volo.CmsKit.EntityFrameworkCore.Tags
{
public class EntityTagRepository_Test : EntityTagRepository_Test<CmsKitEntityFrameworkCoreTestModule>
{
}
}

16
modules/cms-kit/test/Volo.CmsKit.MongoDB.Tests/MongoDB/Tags/EntityTagRepository_Test.cs

@ -0,0 +1,16 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.CmsKit.Tags;
using Xunit;
namespace Volo.CmsKit.MongoDB.Tags
{
[Collection(MongoTestCollection.Name)]
public class EntityTagRepository_Test : EntityTagRepository_Test<CmsKitMongoDbTestModule>
{
}
}

38
modules/cms-kit/test/Volo.CmsKit.TestBase/Tags/EntityTagRepository_Test.cs

@ -0,0 +1,38 @@
using Shouldly;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Volo.Abp.Modularity;
using Xunit;
namespace Volo.CmsKit.Tags
{
public abstract class EntityTagRepository_Test<TStartupModule> : CmsKitTestBase<TStartupModule>
where TStartupModule : IAbpModule
{
private CmsKitTestData _cmsKitTestData;
private IEntityTagRepository _entityTagRepository;
private ITagRepository _tagRepository;
public EntityTagRepository_Test()
{
_cmsKitTestData = GetRequiredService<CmsKitTestData>();
_entityTagRepository = GetRequiredService<IEntityTagRepository>();
_tagRepository = GetRequiredService<ITagRepository>();
}
[Fact]
public async Task DeleteManyAsync_ShouldWorkProperly_WithExistingIds()
{
var relatedTags = await _tagRepository.GetAllRelatedTagsAsync(_cmsKitTestData.Content_1_EntityType, _cmsKitTestData.Content_1_EntityId);
await _entityTagRepository.DeleteManyAsync(relatedTags.Select(s => s.Id).ToArray());
relatedTags = await _tagRepository.GetAllRelatedTagsAsync(_cmsKitTestData.Content_1_EntityType, _cmsKitTestData.Content_1_EntityId);
relatedTags.ShouldBeEmpty();
}
}
}
Loading…
Cancel
Save