Browse Source

Add docs module common projects

pull/22430/head
liangshiwei 11 months ago
parent
commit
b538b30ab3
  1. 2
      Directory.Packages.props
  2. 17
      modules/docs/Volo.Docs.sln
  3. 33
      modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo.Docs.Common.Application.Contracts.csproj
  4. 31
      modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonApplicationContractsModule.cs
  5. 21
      modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissionDefinitionProvider.cs
  6. 19
      modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissions.cs
  7. 9
      modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonRemoteServiceConsts.cs
  8. 12
      modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/DocumentPdfGeneratorInput.cs
  9. 10
      modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfGeneratorAppService.cs
  10. 23
      modules/docs/src/Volo.Docs.Common.Application/Volo.Docs.Common.Application.csproj
  11. 25
      modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/DocsCommonApplicationModule.cs
  12. 9
      modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/DocsDocumentPdfContainer.cs
  13. 88
      modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfGeneratorAppService.cs
  14. 3
      modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/NavigationNode.cs

2
Directory.Packages.props

@ -55,7 +55,7 @@
<PackageVersion Include="LibGit2Sharp" Version="0.30.0" />
<PackageVersion Include="Magick.NET-Q16-AnyCPU" Version="13.4.0" />
<PackageVersion Include="MailKit" Version="4.8.0" />
<PackageVersion Include="Markdig.Signed" Version="0.37.0" />
<PackageVersion Include="Markdig.Signed" Version="0.40.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authentication.OpenIdConnect" Version="9.0.0" />
<PackageVersion Include="Microsoft.AspNetCore.Authorization" Version="9.0.0" />

17
modules/docs/Volo.Docs.sln

@ -63,6 +63,12 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Volo.Docs.MongoDB.Tests", "
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Docs.Installer", "src\Volo.Docs.Installer\Volo.Docs.Installer.csproj", "{50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "common", "common", "{AA7E58C3-E223-455F-81BD-4D2E2E152624}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Docs.Common.Application.Contracts", "src\Volo.Docs.Common.Application.Contracts\Volo.Docs.Common.Application.Contracts.csproj", "{D75944C2-FAB0-41A8-AB2A-1A2F97849302}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Volo.Docs.Common.Application", "src\Volo.Docs.Common.Application\Volo.Docs.Common.Application.csproj", "{A96F4615-8405-493D-AA06-727D6F29B5F5}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
@ -165,6 +171,14 @@ Global
{50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}.Debug|Any CPU.Build.0 = Debug|Any CPU
{50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}.Release|Any CPU.ActiveCfg = Release|Any CPU
{50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1}.Release|Any CPU.Build.0 = Release|Any CPU
{D75944C2-FAB0-41A8-AB2A-1A2F97849302}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{D75944C2-FAB0-41A8-AB2A-1A2F97849302}.Debug|Any CPU.Build.0 = Debug|Any CPU
{D75944C2-FAB0-41A8-AB2A-1A2F97849302}.Release|Any CPU.ActiveCfg = Release|Any CPU
{D75944C2-FAB0-41A8-AB2A-1A2F97849302}.Release|Any CPU.Build.0 = Release|Any CPU
{A96F4615-8405-493D-AA06-727D6F29B5F5}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A96F4615-8405-493D-AA06-727D6F29B5F5}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A96F4615-8405-493D-AA06-727D6F29B5F5}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A96F4615-8405-493D-AA06-727D6F29B5F5}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
@ -197,6 +211,9 @@ Global
{DBE846CD-1BED-4F2C-ABF2-94F6240BCB9B} = {A982A58E-1E92-4764-9F56-39E7AABB8556}
{C5E2A2A3-D54D-4C2E-97BA-EA50A49ED7AD} = {59D430A9-AC61-4457-8338-5DA0705ABB5D}
{50B9AC1D-C03E-47AA-9ED8-E7986BCFABA1} = {A982A58E-1E92-4764-9F56-39E7AABB8556}
{AA7E58C3-E223-455F-81BD-4D2E2E152624} = {42416152-5BAB-4706-93A6-57A19E71FE14}
{D75944C2-FAB0-41A8-AB2A-1A2F97849302} = {AA7E58C3-E223-455F-81BD-4D2E2E152624}
{A96F4615-8405-493D-AA06-727D6F29B5F5} = {AA7E58C3-E223-455F-81BD-4D2E2E152624}
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {13691265-2547-4FFF-B757-E8FACB05679D}

33
modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo.Docs.Common.Application.Contracts.csproj

@ -0,0 +1,33 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\configureawait.props" />
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFrameworks>netstandard2.0;netstandard2.1;net8.0;net9.0</TargetFrameworks>
<AssemblyName>Volo.Docs.Common.Application.Contracts</AssemblyName>
<PackageId>Volo.Docs.Common.Application.Contracts</PackageId>
<GenerateEmbeddedFilesManifest>true</GenerateEmbeddedFilesManifest>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<EmbeddedResource Include="Volo\Docs\Common\Localization\Resources\Docs\ApplicationContracts\*.json" />
<Content Remove="Volo\Docs\Common\Localization\Resources\Docs\ApplicationContracts\*.json" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Docs.Domain.Shared\Volo.Docs.Domain.Shared.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Application.Contracts\Volo.Abp.Ddd.Application.Contracts.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Authorization.Abstractions\Volo.Abp.Authorization.Abstractions.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.FileProviders.Embedded" />
</ItemGroup>
<ItemGroup>
<Folder Include="Volo\Docs\Common\Localization\Resources\Docs\" />
</ItemGroup>
</Project>

31
modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonApplicationContractsModule.cs

@ -0,0 +1,31 @@
using Volo.Abp.Application;
using Volo.Abp.Authorization;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
using Volo.Docs.Localization;
namespace Volo.Docs.Common;
[DependsOn(
typeof(DocsDomainSharedModule),
typeof(AbpDddApplicationContractsModule),
typeof(AbpAuthorizationAbstractionsModule)
)]
public class DocsCommonApplicationContractsModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
Configure<AbpVirtualFileSystemOptions>(options =>
{
options.FileSets.AddEmbedded<DocsCommonApplicationContractsModule>();
});
Configure<AbpLocalizationOptions>(options =>
{
options.Resources
.Get<DocsResource>()
.AddVirtualJson("Volo/Docs/Admin/Localization/Resources/Docs/ApplicationContracts");
});
}
}

21
modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissionDefinitionProvider.cs

@ -0,0 +1,21 @@
using Volo.Abp.Authorization.Permissions;
using Volo.Abp.Localization;
using Volo.Docs.Localization;
namespace Volo.Docs.Common
{
public class DocsCommonPermissionDefinitionProvider : PermissionDefinitionProvider
{
public override void Define(IPermissionDefinitionContext context)
{
var group = context.AddGroup(DocsCommonPermissions.GroupName, L("Permission:DocumentManagement.Common"));
group.AddPermission(DocsCommonPermissions.Documents.PdfCreation, L("Permission:PdfCreation"));
}
private static LocalizableString L(string name)
{
return LocalizableString.Create<DocsResource>(name);
}
}
}

19
modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonPermissions.cs

@ -0,0 +1,19 @@
using Volo.Abp.Reflection;
namespace Volo.Docs.Common
{
public class DocsCommonPermissions
{
public const string GroupName = "Docs.Common";
public static class Documents
{
public const string PdfCreation = GroupName + ".PdfCreation";
}
public static string[] GetAll()
{
return ReflectionHelper.GetPublicConstantsRecursively(typeof(DocsCommonPermissions));
}
}
}

9
modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/DocsCommonRemoteServiceConsts.cs

@ -0,0 +1,9 @@
namespace Volo.Docs.Common
{
public static class DocsCommonRemoteServiceConsts
{
public const string RemoteServiceName = "AbpDocsCommon";
public const string ModuleName = "docs-common";
}
}

12
modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/DocumentPdfGeneratorInput.cs

@ -0,0 +1,12 @@
using System;
namespace Volo.Docs.Common.Documents;
public class DocumentPdfGeneratorInput
{
public Guid ProjectId { get; set; }
public string Version { get; set; }
public string LanguageCode { get; set; }
}

10
modules/docs/src/Volo.Docs.Common.Application.Contracts/Volo/Docs/Common/Documents/IDocumentPdfGeneratorAppService.cs

@ -0,0 +1,10 @@
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.Content;
namespace Volo.Docs.Common.Documents;
public interface IDocumentPdfGeneratorAppService : IApplicationService
{
Task<IRemoteStreamContent> GeneratePdfAsync(DocumentPdfGeneratorInput input);
}

23
modules/docs/src/Volo.Docs.Common.Application/Volo.Docs.Common.Application.csproj

@ -0,0 +1,23 @@
<Project Sdk="Microsoft.NET.Sdk">
<Import Project="..\..\..\..\configureawait.props" />
<Import Project="..\..\..\..\common.props" />
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<AssemblyName>Volo.Docs.Common.Application</AssemblyName>
<PackageId>Volo.Docs.Common.Application</PackageId>
<RootNamespace />
</PropertyGroup>
<ItemGroup>
<ProjectReference Include="..\Volo.Docs.Common.Application.Contracts\Volo.Docs.Common.Application.Contracts.csproj" />
<ProjectReference Include="..\Volo.Docs.Domain\Volo.Docs.Domain.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.AutoMapper\Volo.Abp.AutoMapper.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Caching\Volo.Abp.Caching.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.Ddd.Application\Volo.Abp.Ddd.Application.csproj" />
<ProjectReference Include="..\..\..\..\framework\src\Volo.Abp.BlobStoring\Volo.Abp.BlobStoring.csproj" />
<PackageReference Include="Markdig.Signed" />
<PackageReference Include="Scriban" />
</ItemGroup>
</Project>

25
modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/DocsCommonApplicationModule.cs

@ -0,0 +1,25 @@
using Volo.Abp.Application;
using Volo.Abp.Authorization;
using Volo.Abp.AutoMapper;
using Volo.Abp.Caching;
using Volo.Abp.Localization;
using Volo.Abp.Modularity;
using Volo.Abp.VirtualFileSystem;
using Volo.Docs.Localization;
namespace Volo.Docs.Common;
[DependsOn(
typeof(DocsDomainModule),
typeof(DocsCommonApplicationContractsModule),
typeof(AbpCachingModule),
typeof(AbpAutoMapperModule),
typeof(AbpDddApplicationModule)
)]
public class DocsCommonApplicationModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
}
}

9
modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/DocsDocumentPdfContainer.cs

@ -0,0 +1,9 @@
using Volo.Abp.BlobStoring;
namespace Volo.Docs.Common;
[BlobContainerName("docs-document-pdf")]
public class DocsDocumentPdfContainer
{
}

88
modules/docs/src/Volo.Docs.Common.Application/Volo/Docs/Common/Documents/DocumentPdfGeneratorAppService.cs

@ -0,0 +1,88 @@
using System.Threading.Tasks;
using Volo.Abp;
using Volo.Abp.Application.Services;
using Volo.Abp.BlobStoring;
using Volo.Abp.Content;
using Volo.Docs.Documents;
using Volo.Docs.Projects;
using Volo.Extensions;
namespace Volo.Docs.Common.Documents;
public class DocumentPdfGeneratorAppService : ApplicationService, IDocumentPdfGeneratorAppService
{
protected IBlobContainer<DocsDocumentPdfContainer> BlobContainer { get; }
protected IProjectRepository ProjectRepository { get; }
protected IDocumentSourceFactory DocumentStoreFactory { get; }
protected IDocumentRepository DocumentRepository { get; }
public DocumentPdfGeneratorAppService(
IBlobContainer<DocsDocumentPdfContainer> blobContainer,
IProjectRepository projectRepository,
IDocumentSourceFactory documentStoreFactory,
IDocumentRepository documentRepository)
{
BlobContainer = blobContainer;
ProjectRepository = projectRepository;
DocumentStoreFactory = documentStoreFactory;
DocumentRepository = documentRepository;
}
public virtual async Task<IRemoteStreamContent> GeneratePdfAsync(DocumentPdfGeneratorInput input)
{
var project = await ProjectRepository.GetAsync(input.ProjectId);
var fileName = CalculateDocumentPdfFileName(project.Name, input.Version, input.LanguageCode);
var stream = await BlobContainer.GetOrNullAsync(fileName);
if(stream != null)
{
return new RemoteStreamContent(stream, fileName , "application/pdf");
}
var documentStore = DocumentStoreFactory.Create(project.DocumentStoreType);
var navigation = await GetNavigationAsync(documentStore, project, input.LanguageCode, input.Version);
}
protected virtual string CalculateDocumentPdfFileName(string projectName, string version, string languageCode)
{
return $"{projectName.ToLower()}-{version.ToLower()}--{languageCode.ToLower()}";
}
private async Task<NavigationNode> GetNavigationAsync(
IDocumentSource documentStore,
Project project,
string languageCode,
string version)
{
var navigationDocument = await GetDocumentAsync(documentStore, project, project.NavigationDocumentName, languageCode, version);
if (!DocsJsonSerializerHelper.TryDeserialize<NavigationNode>(navigationDocument.Content, out var navigation))
{
throw new UserFriendlyException($"Cannot validate navigation file '{project.NavigationDocumentName}' for the project {project.Name}.");
}
return navigation;
}
private async Task<Document> GetDocumentAsync(
IDocumentSource documentStore,
Project project,
string documentName,
string languageCode,
string version)
{
version = string.IsNullOrWhiteSpace(version) ? project.LatestVersionBranchName : version;
var document = await DocumentRepository.FindAsync(project.Id, documentName, version, languageCode);
if (document != null)
{
return document;
}
document = await documentStore.GetDocumentAsync(project, documentName, languageCode, version);
return document;
}
}

3
modules/docs/src/Volo.Docs.Domain.Shared/Volo/Docs/Documents/NavigationNode.cs

@ -24,6 +24,9 @@ namespace Volo.Docs.Documents
[JsonPropertyName("keywords")]
public string[] Keywords { get; set; }
[JsonPropertyName("ignoreOnDownload")]
public bool IgnoreOnDownload { get; set; }
public bool IsLeaf => !HasChildItems;

Loading…
Cancel
Save