diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs index 475b94acb5f..685347ab5d5 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Documents/IDocumentAdminAppService.cs @@ -1,4 +1,5 @@ -using System.Threading.Tasks; +using System; +using System.Threading.Tasks; using Volo.Abp.Application.Services; namespace Volo.Docs.Admin.Documents @@ -10,7 +11,5 @@ public interface IDocumentAdminAppService : IApplicationService Task PullAllAsync(PullAllDocumentInput input); Task PullAsync(PullDocumentInput input); - - Task ReindexAsync(); } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs index 34b607689cf..9b832165d15 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/IProjectAdminAppService.cs @@ -12,9 +12,13 @@ public interface IProjectAdminAppService : IApplicationService Task GetAsync(Guid id); Task CreateAsync(CreateProjectDto input); - + Task UpdateAsync(Guid id, UpdateProjectDto input); - + Task DeleteAsync(Guid id); + + Task ReindexAsync(ReindexInput input); + + Task ReindexAllAsync(); } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ReindexInput.cs b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ReindexInput.cs new file mode 100644 index 00000000000..c0ff3472af7 --- /dev/null +++ b/modules/docs/src/Volo.Docs.Admin.Application.Contracts/Volo/Docs/Admin/Projects/ReindexInput.cs @@ -0,0 +1,9 @@ +using System; + +namespace Volo.Docs.Admin.Projects +{ + public class ReindexInput + { + public Guid ProjectId { get; set; } + } +} diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs index 25e5c1d9df1..92b809bf87c 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Documents/DocumentAdminAppService.cs @@ -25,17 +25,13 @@ public class DocumentAdminAppService : ApplicationService, IDocumentAdminAppServ private readonly IDistributedCache _documentUpdateCache; private readonly IDistributedCache> _versionCache; private readonly IDistributedCache _languageCache; - private readonly IDistributedCache _resourceCache; - private readonly IDocumentFullSearch _documentFullSearch; public DocumentAdminAppService(IProjectRepository projectRepository, IDocumentRepository documentRepository, IDocumentSourceFactory documentStoreFactory, IDistributedCache documentUpdateCache, IDistributedCache> versionCache, - IDistributedCache languageCache, - IDistributedCache resourceCache, - IDocumentFullSearch documentFullSearch) + IDistributedCache languageCache) { _projectRepository = projectRepository; _documentRepository = documentRepository; @@ -43,8 +39,6 @@ public DocumentAdminAppService(IProjectRepository projectRepository, _documentUpdateCache = documentUpdateCache; _versionCache = versionCache; _languageCache = languageCache; - _resourceCache = resourceCache; - _documentFullSearch = documentFullSearch; LocalizationResource = typeof(DocsResource); } @@ -125,32 +119,6 @@ await _documentRepository.DeleteAsync(sourceDocument.ProjectId, sourceDocument.N await UpdateDocumentUpdateInfoCache(sourceDocument); } - public async Task ReindexAsync() - { - var docs = await _documentRepository.GetListAsync(); - var projects = await _projectRepository.GetListAsync(); - foreach (var doc in docs) - { - var project = projects.FirstOrDefault(x => x.Id == doc.ProjectId); - if (project == null) - { - continue; - } - - if (doc.FileName == project.NavigationDocumentName) - { - continue; - } - - if (doc.FileName == project.ParametersDocumentName) - { - continue; - } - - await _documentFullSearch.AddOrUpdateAsync(doc); - } - } - private async Task UpdateDocumentUpdateInfoCache(Document document) { var cacheKey = $"DocumentUpdateInfo{document.ProjectId}#{document.Name}#{document.LanguageCode}#{document.Version}"; @@ -174,4 +142,4 @@ private async Task GetDocumentAsync( return document; } } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs index 436c9d1c764..882a8b80872 100644 --- a/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs +++ b/modules/docs/src/Volo.Docs.Admin.Application/Volo/Docs/Admin/Projects/ProjectAdminAppService.cs @@ -1,10 +1,13 @@ using System; using System.Collections.Generic; +using System.Linq; using System.Threading.Tasks; using Microsoft.AspNetCore.Authorization; using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Services; using Volo.Abp.Guids; +using Volo.Docs.Documents; +using Volo.Docs.Documents.FullSearch.Elastic; using Volo.Docs.Localization; using Volo.Docs.Projects; @@ -14,15 +17,22 @@ namespace Volo.Docs.Admin.Projects public class ProjectAdminAppService : ApplicationService, IProjectAdminAppService { private readonly IProjectRepository _projectRepository; + private readonly IDocumentRepository _documentRepository; + private readonly IDocumentFullSearch _documentFullSearch; private readonly IGuidGenerator _guidGenerator; public ProjectAdminAppService( - IProjectRepository projectRepository, IGuidGenerator guidGenerator) + IProjectRepository projectRepository, + IDocumentRepository documentRepository, + IDocumentFullSearch documentFullSearch, + IGuidGenerator guidGenerator) { ObjectMapperContext = typeof(DocsAdminApplicationModule); LocalizationResource = typeof(DocsResource); _projectRepository = projectRepository; + _documentRepository = documentRepository; + _documentFullSearch = documentFullSearch; _guidGenerator = guidGenerator; } @@ -51,7 +61,7 @@ public async Task CreateAsync(CreateProjectDto input) { throw new ProjectShortNameAlreadyExistsException(input.ShortName); } - + var project = new Project(_guidGenerator.Create(), input.Name, input.ShortName, @@ -71,7 +81,7 @@ public async Task CreateAsync(CreateProjectDto input) { project.ExtraProperties.Add(extraProperty.Key, extraProperty.Value); } - + project = await _projectRepository.InsertAsync(project); return ObjectMapper.Map(project); @@ -106,6 +116,57 @@ public async Task DeleteAsync(Guid id) { await _projectRepository.DeleteAsync(id); } - + + public async Task ReindexAsync(ReindexInput input) + { + var project = await _projectRepository.GetAsync(input.ProjectId); + + await _documentFullSearch.DeleteAllByProjectIdAsync(project.Id); + + var docs = await _documentRepository.GetListByProjectId(project.Id); + + foreach (var doc in docs) + { + if (doc.FileName == project.NavigationDocumentName) + { + continue; + } + + if (doc.FileName == project.ParametersDocumentName) + { + continue; + } + + await _documentFullSearch.AddOrUpdateAsync(doc); + } + } + + public async Task ReindexAllAsync() + { + await _documentFullSearch.DeleteAllAsync(); + + var docs = await _documentRepository.GetListAsync(); + var projects = await _projectRepository.GetListAsync(); + foreach (var doc in docs) + { + var project = projects.FirstOrDefault(x => x.Id == doc.ProjectId); + if (project == null) + { + continue; + } + + if (doc.FileName == project.NavigationDocumentName) + { + continue; + } + + if (doc.FileName == project.ParametersDocumentName) + { + continue; + } + + await _documentFullSearch.AddOrUpdateAsync(doc); + } + } } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs index 3a6136d6628..f0fd596f58a 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/DocumentsAdminController.cs @@ -39,12 +39,5 @@ public Task PullAsync(PullDocumentInput input) { return _documentAdminAppService.PullAsync(input); } - - [HttpPost] - [Route("Reindex")] - public Task ReindexAsync() - { - return _documentAdminAppService.ReindexAsync(); - } } } diff --git a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs index ed46afe9447..627c7c42539 100644 --- a/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs +++ b/modules/docs/src/Volo.Docs.Admin.HttpApi/Volo/Docs/Admin/ProjectsAdminController.cs @@ -53,5 +53,19 @@ public Task DeleteAsync(Guid id) { return _projectAppService.DeleteAsync(id); } + + [HttpPost] + [Route("ReindexAll")] + public Task ReindexAllAsync() + { + return _projectAppService.ReindexAllAsync(); + } + + [HttpPost] + [Route("Reindex")] + public Task ReindexAsync(ReindexInput input) + { + return _projectAppService.ReindexAsync(input); + } } } diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml index e3c0416b6d7..8284d73dcd3 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/Index.cshtml @@ -39,6 +39,10 @@ } + @if (await Authorization.IsGrantedAsync(DocsAdminPermissions.Projects.Default)) + { + + } diff --git a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/index.js b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/index.js index de7faea5e2d..baf4c6b646b 100644 --- a/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/index.js +++ b/modules/docs/src/Volo.Docs.Admin.Web/Pages/Docs/Admin/Projects/index.js @@ -74,6 +74,18 @@ _dataTable.ajax.reload(); }); } + }, + { + text: l('ReIndexProject'), + visible: abp.auth.isGranted('Docs.Admin.Documents'), + confirmMessage: function (data) { return l('ReIndexProjectConfirmationMessage', data.record.name); }, + action: function (data) { + volo.docs.admin.projectsAdmin + .reindex({ projectId: data.record.id}) + .then(function () { + abp.message.success(l('SuccessfullyReIndexProject', data.record.name)); + }); + } } ] } @@ -110,6 +122,19 @@ _createModal.open({source:"GitHub"}); }); + $("#ReIndexAllProjects").click(function (event) { + abp.message.confirm(l('ReIndexAllProjectConfirmationMessage')) + .done(function (accepted) { + if (accepted) { + volo.docs.admin.projectsAdmin + .reindexAll() + .then(function () { + abp.message.success(l('SuccessfullyReIndexAllProject')); + }); + } + }); + }); + _createModal.onClose(function () { _dataTable.ajax.reload(); }); @@ -118,4 +143,4 @@ _dataTable.ajax.reload(); }); -}); \ No newline at end of file +}); diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs index 51ecd817b54..854032ab2c8 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/ElasticDocumentFullSearch.cs @@ -92,6 +92,48 @@ public async Task DeleteAsync(Guid id, CancellationToken cancellationToken = def .DeleteAsync(DocumentPath.Id(id), x => x.Index(_options.IndexName), cancellationToken)); } + public async Task DeleteAllAsync(CancellationToken cancellationToken = default) + { + ValidateElasticSearchEnabled(); + + var request = new DeleteByQueryRequest(_options.IndexName) + { + Query = new MatchAllQuery() + }; + + HandleError(await _clientProvider.GetClient() + .DeleteByQueryAsync(request, cancellationToken)); + } + + public async Task DeleteAllByProjectIdAsync(Guid projectId, CancellationToken cancellationToken = default) + { + ValidateElasticSearchEnabled(); + + var request = new DeleteByQueryRequest(_options.IndexName) + { + Query = new BoolQuery + { + Filter = new QueryContainer[] + { + new BoolQuery + { + Must = new QueryContainer[] + { + new TermQuery + { + Field = "projectId", + Value = projectId + } + } + } + } + }, + }; + + HandleError(await _clientProvider.GetClient() + .DeleteByQueryAsync(request, cancellationToken)); + } + public async Task> SearchAsync(string context, Guid projectId, string languageCode, string version, int? skipCount = null, int? maxResultCount = null, CancellationToken cancellationToken = default) @@ -185,4 +227,4 @@ protected void ValidateElasticSearchEnabled() } } } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/IDocumentFullSearch.cs b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/IDocumentFullSearch.cs index 615f5be4b47..e05c31bda3a 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/IDocumentFullSearch.cs +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/FullSearch/Elastic/IDocumentFullSearch.cs @@ -13,8 +13,12 @@ public interface IDocumentFullSearch Task DeleteAsync(Guid id, CancellationToken cancellationToken = default); + Task DeleteAllAsync(CancellationToken cancellationToken = default); + + Task DeleteAllByProjectIdAsync(Guid projectId, CancellationToken cancellationToken = default); + Task> SearchAsync(string context, Guid projectId, string languageCode, string version, int? skipCount = null, int? maxResultCount = null, CancellationToken cancellationToken = default); } -} \ No newline at end of file +} diff --git a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json index 998327cd90f..31fdf8f8f2a 100644 --- a/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json +++ b/modules/docs/src/Volo.Docs.Domain/Volo/Docs/Localization/Domain/en.json @@ -11,6 +11,12 @@ "Delete": "Delete", "ClearCache": "Clear cache", "ClearCacheConfirmationMessage": "Are you sure to clear all caches for project \"{0}\"", + "ReIndexAllProjects": "ReIndex all projects", + "ReIndexProject": "ReIndex project", + "ReIndexProjectConfirmationMessage":"Are you sure to reindex for project \"{0}\"", + "SuccessfullyReIndexProject": "Successfully reindex for project \"{0}\"", + "ReIndexAllProjectConfirmationMessage": "Are you sure to reindex all project?", + "SuccessfullyReIndexAllProject": "Successfully reindex for all projects", "InThisDocument": "In this document", "GoToTop": "Go to top", "Projects": "Project(s)",