using System; using System.Collections.Generic; using System.IO; using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Options; using Volo.Abp.BlobStoring; using Volo.Abp.Data; using Volo.Abp.DependencyInjection; using Volo.Abp.Guids; using Volo.Abp.MultiTenancy; using Volo.Abp.Users; using Volo.CmsKit.Blogs; using Volo.CmsKit.Comments; using Volo.CmsKit.MarkedItems; using Volo.CmsKit.MediaDescriptors; using Volo.CmsKit.Menus; using Volo.CmsKit.Pages; using Volo.CmsKit.Ratings; using Volo.CmsKit.Reactions; using Volo.CmsKit.Tags; using Volo.CmsKit.Users; namespace Volo.CmsKit; public class CmsKitDataSeedContributor : IDataSeedContributor, ITransientDependency { private readonly IGuidGenerator _guidGenerator; private readonly ICmsUserRepository _cmsUserRepository; private readonly CmsKitTestData _cmsKitTestData; private readonly ICommentRepository _commentRepository; private readonly ReactionManager _reactionManager; private readonly IRatingRepository _ratingRepository; private readonly ICurrentTenant _currentTenant; private readonly EntityTagManager _entityTagManager; private readonly TagManager _tagManager; private readonly ITagRepository _tagRepository; private readonly IEntityTagRepository _entityTagRepository; private readonly IPageRepository _pageRepository; private readonly IBlogRepository _blogRepository; private readonly IBlogFeatureRepository _blogFeatureRepository; private readonly IBlogPostRepository _blogPostRepository; private readonly BlogPostManager _blogPostManager; private readonly IOptions _reactionOptions; private readonly IOptions _tagOptions; private readonly IMediaDescriptorRepository _mediaDescriptorRepository; private readonly IBlobContainer _mediaBlobContainer; private readonly BlogManager _blogManager; private readonly IOptions _mediaOptions; private readonly IOptions _commentsOptions; private readonly IOptions _ratingOptions; private readonly IMenuItemRepository _menuItemRepository; private readonly MarkedItemManager _markedItemManager; private readonly IOptions _markedItemOptions; public CmsKitDataSeedContributor( IGuidGenerator guidGenerator, ICmsUserRepository cmsUserRepository, CmsKitTestData cmsKitTestData, ICommentRepository commentRepository, ReactionManager reactionManager, IRatingRepository ratingRepository, ICurrentTenant currentTenant, TagManager tagManager, ITagRepository tagRepository, IEntityTagRepository entityTagRepository, IPageRepository pageRepository, IBlogRepository blogRepository, IBlogPostRepository blogPostRepository, BlogPostManager blogPostmanager, IBlogFeatureRepository blogFeatureRepository, EntityTagManager entityTagManager, IOptions reactionOptions, IOptions tagOptions, IMediaDescriptorRepository mediaDescriptorRepository, IBlobContainer mediaBlobContainer, BlogManager blogManager, IOptions cmsMediaOptions, IOptions commentsOptions, IOptions ratingOptions, IMenuItemRepository menuItemRepository, MarkedItemManager markedItemManager, IOptions markedItemOptions) { _guidGenerator = guidGenerator; _cmsUserRepository = cmsUserRepository; _cmsKitTestData = cmsKitTestData; _commentRepository = commentRepository; _reactionManager = reactionManager; _ratingRepository = ratingRepository; _currentTenant = currentTenant; _tagManager = tagManager; _tagRepository = tagRepository; _entityTagManager = entityTagManager; _entityTagRepository = entityTagRepository; _pageRepository = pageRepository; _blogRepository = blogRepository; _blogPostRepository = blogPostRepository; _blogPostManager = blogPostmanager; _blogFeatureRepository = blogFeatureRepository; _reactionOptions = reactionOptions; _tagOptions = tagOptions; _mediaDescriptorRepository = mediaDescriptorRepository; _mediaBlobContainer = mediaBlobContainer; _blogManager = blogManager; _mediaOptions = cmsMediaOptions; _commentsOptions = commentsOptions; _ratingOptions = ratingOptions; _menuItemRepository = menuItemRepository; _markedItemManager = markedItemManager; _markedItemOptions = markedItemOptions; } public async Task SeedAsync(DataSeedContext context) { using (_currentTenant.Change(context?.TenantId)) { await ConfigureCmsKitOptionsAsync(); await SeedUsersAsync(); await SeedCommentsAsync(); await SeedReactionsAsync(); await SeedRatingsAsync(); await SeedTagsAsync(); await SeedPagesAsync(); await SeedBlogsAsync(); await SeedBlogFeaturesAsync(); await SeedMediaAsync(); await SeedMenusAsync(); await SeedMarkedItemsAsync(); } } private Task ConfigureCmsKitOptionsAsync() { _tagOptions.Value.EntityTypes.AddIfNotContains(new TagEntityTypeDefiniton(_cmsKitTestData.EntityType1)); _tagOptions.Value.EntityTypes.AddIfNotContains(new TagEntityTypeDefiniton(_cmsKitTestData.EntityType2)); _tagOptions.Value.EntityTypes.AddIfNotContains(new TagEntityTypeDefiniton(_cmsKitTestData.Content_1_EntityType)); _tagOptions.Value.EntityTypes.AddIfNotContains(new TagEntityTypeDefiniton(_cmsKitTestData.Content_2_EntityType)); _tagOptions.Value.EntityTypes.AddIfNotContains(new TagEntityTypeDefiniton(_cmsKitTestData.TagDefinition_1_EntityType)); _mediaOptions.Value.EntityTypes.AddIfNotContains( new MediaDescriptorDefinition( _cmsKitTestData.Media_1_EntityType, createPolicies: new[] { "SomeCreatePolicy" }, deletePolicies: new[] { "SomeDeletePolicy" })); _commentsOptions.Value.EntityTypes.Add( new CommentEntityTypeDefinition(_cmsKitTestData.EntityType1)); List reactions = new() { new ReactionDefinition(StandardReactions.Smile), new ReactionDefinition(StandardReactions.ThumbsUp), new ReactionDefinition(StandardReactions.ThumbsDown), new ReactionDefinition(StandardReactions.Confused), new ReactionDefinition(StandardReactions.Eyes), new ReactionDefinition(StandardReactions.Heart), new ReactionDefinition(StandardReactions.HeartBroken), new ReactionDefinition(StandardReactions.Wink), new ReactionDefinition(StandardReactions.Pray), new ReactionDefinition(StandardReactions.Rocket), new ReactionDefinition(StandardReactions.Victory), new ReactionDefinition(StandardReactions.Rock), }; _reactionOptions.Value.EntityTypes.Add(new ReactionEntityTypeDefinition(_cmsKitTestData.EntityType1, reactions)); _reactionOptions.Value.EntityTypes.Add(new ReactionEntityTypeDefinition(_cmsKitTestData.EntityType2, reactions)); _ratingOptions.Value.EntityTypes.Add(new RatingEntityTypeDefinition(_cmsKitTestData.EntityType1)); _ratingOptions.Value.EntityTypes.Add(new RatingEntityTypeDefinition(_cmsKitTestData.EntityType2)); _markedItemOptions.Value.EntityTypes.Add(new MarkedItemEntityTypeDefinition(_cmsKitTestData.EntityType1, StandardMarkedItems.Favorite)); _markedItemOptions.Value.EntityTypes.Add(new MarkedItemEntityTypeDefinition(_cmsKitTestData.EntityType2, StandardMarkedItems.Starred)); return Task.CompletedTask; } private async Task SeedUsersAsync() { await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User1Id, "user1", "user1@volo.com", "user", "1")), autoSave: true); await _cmsUserRepository.InsertAsync(new CmsUser(new UserData(_cmsKitTestData.User2Id, "user2", "user2@volo.com", "user", "2")), autoSave: true); } private async Task SeedCommentsAsync() { var comment1 = await _commentRepository.InsertAsync(new Comment(_cmsKitTestData.CommentWithChildId, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, "comment", null, _cmsKitTestData.User1Id ) { IdempotencyToken = _cmsKitTestData.IdempotencyToken_1 }); await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, "reply", comment1.Id, _cmsKitTestData.User2Id )); await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, "reply", comment1.Id, _cmsKitTestData.User1Id )); await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, "comment", null, _cmsKitTestData.User2Id )); await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId2, "comment", null, _cmsKitTestData.User2Id )); await _commentRepository.InsertAsync(new Comment(_guidGenerator.Create(), _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId1, "comment", null, _cmsKitTestData.User2Id )); } private async Task SeedReactionsAsync() { await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, StandardReactions.Confused); await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, StandardReactions.ThumbsUp); await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId2, StandardReactions.Heart); await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId1, StandardReactions.Rocket); await _reactionManager.GetOrCreateAsync( _cmsKitTestData.User2Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, StandardReactions.ThumbsUp); } private async Task SeedRatingsAsync() { await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, 4, _cmsKitTestData.User1Id )); await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1, 5, _cmsKitTestData.User1Id )); await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId2, 5, _cmsKitTestData.User2Id )); await _ratingRepository.InsertAsync(new Rating(_guidGenerator.Create(), _cmsKitTestData.EntityType2, _cmsKitTestData.EntityId2, 1, _cmsKitTestData.User2Id )); } private async Task SeedTagsAsync() { var created1 = await _tagRepository.InsertAsync( await _tagManager.CreateAsync( _cmsKitTestData.TagId_1, _cmsKitTestData.EntityType1, _cmsKitTestData.TagName_1)); await _entityTagManager.AddTagToEntityAsync(created1.Id, created1.EntityType, _cmsKitTestData.EntityId1); var created2 = await _tagRepository.InsertAsync( await _tagManager.CreateAsync( _cmsKitTestData.TagId_2, _cmsKitTestData.EntityType2, _cmsKitTestData.TagName_2)); await _entityTagManager.AddTagToEntityAsync(created2.Id, created2.EntityType, _cmsKitTestData.EntityId2); foreach (var tag in _cmsKitTestData.Content_1_Tags) { var tagEntity = await _tagRepository.InsertAsync( await _tagManager.CreateAsync( _guidGenerator.Create(), _cmsKitTestData.Content_1_EntityType, tag)); await _entityTagManager.AddTagToEntityAsync(tagEntity.Id, _cmsKitTestData.Content_1_EntityType, _cmsKitTestData.Content_1_EntityId); } foreach (var tag in _cmsKitTestData.Content_2_Tags) { var tagEntity = await _tagRepository.InsertAsync( await _tagManager.CreateAsync( _guidGenerator.Create(), _cmsKitTestData.Content_2_EntityType, tag)); await _entityTagManager.AddTagToEntityAsync(tagEntity.Id, _cmsKitTestData.Content_2_EntityType, _cmsKitTestData.Content_2_EntityId); } } private async Task SeedPagesAsync() { var page1 = new Page(_cmsKitTestData.Page_1_Id, _cmsKitTestData.Page_1_Title, _cmsKitTestData.Page_1_Slug, _cmsKitTestData.Content_1); await _pageRepository.InsertAsync(page1); var page2 = new Page(_cmsKitTestData.Page_2_Id, _cmsKitTestData.Page_2_Title, _cmsKitTestData.Page_2_Slug, _cmsKitTestData.Content_2); await _pageRepository.InsertAsync(page2); } private async Task SeedBlogsAsync() { var blog = await _blogRepository.InsertAsync( await _blogManager.CreateAsync(_cmsKitTestData.BlogName, _cmsKitTestData.BlogSlug), autoSave: true); _cmsKitTestData.Blog_Id = blog.Id; var author = await _cmsUserRepository.GetAsync(_cmsKitTestData.User1Id); _cmsKitTestData.BlogPost_1_Id = (await _blogPostRepository.InsertAsync( await _blogPostManager.CreateAsync( author, blog, _cmsKitTestData.BlogPost_1_Title, _cmsKitTestData.BlogPost_1_Slug, BlogPostStatus.Published, "Short desc 1", "Blog Post 1 Content"))).Id; _cmsKitTestData.BlogPost_2_Id = (await _blogPostRepository.InsertAsync( await _blogPostManager.CreateAsync( author, blog, _cmsKitTestData.BlogPost_2_Title, _cmsKitTestData.BlogPost_2_Slug, BlogPostStatus.Published, "Short desc 2", "Blog Post 2 Content"))).Id; } private async Task SeedBlogFeaturesAsync() { var blogFeature1 = await _blogFeatureRepository.InsertAsync( new BlogFeature( _cmsKitTestData.Blog_Id, _cmsKitTestData.BlogFeature_1_FeatureName, _cmsKitTestData.BlogFeature_1_Enabled)); _cmsKitTestData.BlogFeature_1_Id = blogFeature1.Id; var blogFeature2 = await _blogFeatureRepository.InsertAsync( new BlogFeature( _cmsKitTestData.Blog_Id, _cmsKitTestData.BlogFeature_2_FeatureName, _cmsKitTestData.BlogFeature_2_Enabled)); _cmsKitTestData.BlogFeature_2_Id = blogFeature2.Id; } private async Task SeedMediaAsync() { using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(_cmsKitTestData.Media_1_Content))) { var media = new MediaDescriptor(_cmsKitTestData.Media_1_Id, _cmsKitTestData.Media_1_EntityType, _cmsKitTestData.Media_1_Name, _cmsKitTestData.Media_1_ContentType, stream.Length); await _mediaDescriptorRepository.InsertAsync(media); await _mediaBlobContainer.SaveAsync(media.Id.ToString(), stream); } } private async Task SeedMenusAsync() { var menuItem4 = new MenuItem( _cmsKitTestData.MenuItem_4_With_Page_1_Id, _cmsKitTestData.MenuItem_4_With_Page_1_Name, _cmsKitTestData.Page_1_Slug.EnsureStartsWith('/')); menuItem4.SetPageId(_cmsKitTestData.Page_1_Id); await _menuItemRepository.InsertManyAsync(new[] { new MenuItem( _cmsKitTestData.MenuItem_1_Id, _cmsKitTestData.MenuItem_1_Name, _cmsKitTestData.MenuItem_1_Url), new MenuItem( _cmsKitTestData.MenuItem_2_Id, _cmsKitTestData.MenuItem_2_Name, _cmsKitTestData.MenuItem_2_Url), new MenuItem( _cmsKitTestData.MenuItem_3_Id, _cmsKitTestData.MenuItem_3_Name, _cmsKitTestData.MenuItem_3_Url), menuItem4 }); } private async Task SeedMarkedItemsAsync() { await _markedItemManager.ToggleUserMarkedItemAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId1 ); await _markedItemManager.ToggleUserMarkedItemAsync( _cmsKitTestData.User1Id, _cmsKitTestData.EntityType1, _cmsKitTestData.EntityId2 ); } }