From de96c447bdc5d5a4f6bc8f07c3f926820c039c7d Mon Sep 17 00:00:00 2001 From: EngincanV Date: Wed, 31 Mar 2021 18:12:24 +0300 Subject: [PATCH 1/3] Docs: Create get all document links endpoint --- .../Docs/Documents/IDocumentAppService.cs | 2 + .../Volo/Docs/Documents/DocumentAppService.cs | 85 ++++++++++++++++++- .../Docs/Documents/DocsDocumentController.cs | 7 ++ 3 files changed, 92 insertions(+), 2 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs index 259d9edf0b..355c2319f8 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs @@ -19,5 +19,7 @@ namespace Volo.Docs.Documents Task> SearchAsync(DocumentSearchInput input); Task FullSearchEnabledAsync(); + + Task> GetLinksAsync(); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 9d5015d942..2c9521209c 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq; +using System.Text; using System.Threading.Tasks; using Microsoft.Extensions.Caching.Distributed; using Microsoft.Extensions.Configuration; @@ -193,6 +194,87 @@ namespace Volo.Docs.Documents return await Task.FromResult(_docsElasticSearchOptions.Enable); } + public async Task> GetLinksAsync() + { + var documentLinks = new List(); + var projects = await _projectRepository.GetListAsync(); + + foreach (var project in projects) + { + var documents = await _documentRepository.GetListByProjectId(project.Id); + + foreach (var document in documents) + { + var navigationNode = await GetNavigationAsync(new GetNavigationDocumentInput + { + ProjectId = project.Id, + LanguageCode = document.LanguageCode, + Version = document.Version + }); + + navigationNode.Items?.ForEach(node => + { + documentLinks.AddIfNotContains( + GetDocumentLinks(node, documentLinks, document.LanguageCode, + project.ShortName, document.Version, document.Format) + ); + }); + } + } + + return documentLinks; + } + + private List GetDocumentLinks(NavigationNode node, List documentLinks, string languageName, + string shortName, string version, string format) + { + if (!IsExternalLink(node.Path)) + { + documentLinks.AddIfNotContains(NormalizePath(node.Path, languageName, shortName, version, format)); + } + + node.Items?.ForEach(childNode => + { + GetDocumentLinks(childNode, documentLinks, languageName, shortName, version, format); + }); + + return documentLinks; + } + + private string NormalizePath(string path, string languageCode, string projectName, string version, + string projectFormat) + { + var pathWithoutFileExtension = RemoveFileExtensionFromPath(path, projectFormat); + + //TODO: get prefix from DocsUiOptions? + var prefix = "/"; + + return prefix + languageCode + "/" + projectName + "/" + version + "/" + pathWithoutFileExtension; + } + + private string RemoveFileExtensionFromPath(string path, string projectFormat) + { + if (path == null) + { + return null; + } + + return path.EndsWith("." + projectFormat) + ? path.Left(path.Length - projectFormat.Length - 1) + : path; + } + + private static bool IsExternalLink(string path) + { + if (path.IsNullOrEmpty()) + { + return false; + } + + return path.StartsWith("http://", StringComparison.OrdinalIgnoreCase) || + path.StartsWith("https://", StringComparison.OrdinalIgnoreCase); + } + public async Task GetParametersAsync(GetParametersDocumentInput input) { var project = await _projectRepository.GetAsync(input.ProjectId); @@ -353,7 +435,6 @@ namespace Volo.Docs.Documents } return project.ExtraProperties["VersionBranchPrefix"].ToString(); - } private GithubVersionProviderSource GetGithubVersionProviderSource(Project project) @@ -363,4 +444,4 @@ namespace Volo.Docs.Documents : GithubVersionProviderSource.Releases; } } -} +} \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs index d8d68ec0e8..bec1be922e 100644 --- a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs +++ b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs @@ -61,6 +61,13 @@ namespace Volo.Docs.Documents return DocumentAppService.FullSearchEnabledAsync(); } + [HttpGet] + [Route("links")] + public Task> GetLinksAsync() + { + return DocumentAppService.GetLinksAsync(); + } + [HttpGet] [Route("parameters")] public Task GetParametersAsync(GetParametersDocumentInput input) From fde0e5a01dea3391ba2870c7e9dab2c26c844743 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Wed, 31 Mar 2021 20:51:30 +0300 Subject: [PATCH 2/3] Refactoring --- .../Docs/Documents/IDocumentAppService.cs | 2 +- .../Volo/Docs/Documents/DocumentAppService.cs | 45 ++++++++++--------- .../Docs/Documents/DocsDocumentController.cs | 4 +- 3 files changed, 27 insertions(+), 24 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs index 355c2319f8..653d823ff6 100644 --- a/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application.Contracts/Volo/Docs/Documents/IDocumentAppService.cs @@ -20,6 +20,6 @@ namespace Volo.Docs.Documents Task FullSearchEnabledAsync(); - Task> GetLinksAsync(); + Task> GetUrlsAsync(string prefix); } } \ No newline at end of file diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 2c9521209c..73cc7e7a06 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -194,13 +194,18 @@ namespace Volo.Docs.Documents return await Task.FromResult(_docsElasticSearchOptions.Enable); } - public async Task> GetLinksAsync() + public async Task> GetUrlsAsync(string prefix) { - var documentLinks = new List(); + var documentUrls = new List(); var projects = await _projectRepository.GetListAsync(); foreach (var project in projects) { + if (project.ShortName == "ABP Commercial" || project.Name == "ABP Commercial") + { + continue; + } + var documents = await _documentRepository.GetListByProjectId(project.Id); foreach (var document in documents) @@ -214,53 +219,51 @@ namespace Volo.Docs.Documents navigationNode.Items?.ForEach(node => { - documentLinks.AddIfNotContains( - GetDocumentLinks(node, documentLinks, document.LanguageCode, - project.ShortName, document.Version, document.Format) + documentUrls.AddIfNotContains( + GetDocumentLinks(node, documentUrls, prefix, project.ShortName, document) ); }); } } - return documentLinks; + return documentUrls; } - private List GetDocumentLinks(NavigationNode node, List documentLinks, string languageName, - string shortName, string version, string format) + private List GetDocumentLinks(NavigationNode node, List documentUrls, string prefix, + string shortName, Document document) { if (!IsExternalLink(node.Path)) { - documentLinks.AddIfNotContains(NormalizePath(node.Path, languageName, shortName, version, format)); + documentUrls.AddIfNotContains( + NormalizePath(prefix, node.Path, shortName, document) + ); } node.Items?.ForEach(childNode => { - GetDocumentLinks(childNode, documentLinks, languageName, shortName, version, format); + GetDocumentLinks(childNode, documentUrls, prefix, shortName, document); }); - return documentLinks; + return documentUrls; } - private string NormalizePath(string path, string languageCode, string projectName, string version, - string projectFormat) + private string NormalizePath(string prefix, string path, string shortName, Document document) { - var pathWithoutFileExtension = RemoveFileExtensionFromPath(path, projectFormat); - - //TODO: get prefix from DocsUiOptions? - var prefix = "/"; + var pathWithoutFileExtension = RemoveFileExtensionFromPath(path, document.Format); + var normalizedPath = prefix + document.LanguageCode + "/" + shortName + "/" + document.Version + "/" + pathWithoutFileExtension; - return prefix + languageCode + "/" + projectName + "/" + version + "/" + pathWithoutFileExtension; + return normalizedPath; } - private string RemoveFileExtensionFromPath(string path, string projectFormat) + private string RemoveFileExtensionFromPath(string path, string format) { if (path == null) { return null; } - return path.EndsWith("." + projectFormat) - ? path.Left(path.Length - projectFormat.Length - 1) + return path.EndsWith("." + format) + ? path.Left(path.Length - format.Length - 1) : path; } diff --git a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs index bec1be922e..354925f83e 100644 --- a/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs +++ b/modules/docs/src/Volo.Docs.HttpApi/Volo/Docs/Documents/DocsDocumentController.cs @@ -63,9 +63,9 @@ namespace Volo.Docs.Documents [HttpGet] [Route("links")] - public Task> GetLinksAsync() + public Task> GetUrlsAsync(string prefix) { - return DocumentAppService.GetLinksAsync(); + return DocumentAppService.GetUrlsAsync(prefix); } [HttpGet] From a1864dea070878ee32f71958b97050e71307b189 Mon Sep 17 00:00:00 2001 From: EngincanV Date: Tue, 13 Apr 2021 17:29:49 +0300 Subject: [PATCH 3/3] Update DocumentAppService.cs --- .../Volo/Docs/Documents/DocumentAppService.cs | 23 +++++++++++-------- 1 file changed, 13 insertions(+), 10 deletions(-) diff --git a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs index 73cc7e7a06..4d451a1d4f 100644 --- a/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs +++ b/modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs @@ -201,21 +201,24 @@ namespace Volo.Docs.Documents foreach (var project in projects) { - if (project.ShortName == "ABP Commercial" || project.Name == "ABP Commercial") - { - continue; - } - var documents = await _documentRepository.GetListByProjectId(project.Id); foreach (var document in documents) { - var navigationNode = await GetNavigationAsync(new GetNavigationDocumentInput + var version = GetProjectVersionPrefixIfExist(project) + document.Version; + var navigationDocument = await GetDocumentWithDetailsDtoAsync( + project, + project.NavigationDocumentName, + document.LanguageCode, + version + ); + + if (!DocsJsonSerializerHelper.TryDeserialize(navigationDocument.Content, + out var navigationNode)) { - ProjectId = project.Id, - LanguageCode = document.LanguageCode, - Version = document.Version - }); + throw new UserFriendlyException( + $"Cannot validate navigation file '{project.NavigationDocumentName}' for the project {project.Name}."); + } navigationNode.Items?.ForEach(node => {