Browse Source

index rule moved from web layer to app service

pull/20077/head
Salih 2 years ago
parent
commit
cb5e6b64e3
  1. 62
      modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs
  2. 7
      modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs
  3. 10
      modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs
  4. 10
      modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs
  5. 35
      modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

62
modules/docs/src/Volo.Docs.Application/Volo/Docs/Documents/DocumentAppService.cs

@ -1,5 +1,6 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
@ -305,7 +306,7 @@ namespace Volo.Docs.Documents
return normalizedPathStringBuilder.ToString();
}
private string RemoveFileExtensionFromPath(string path, string format)
private static string RemoveFileExtensionFromPath(string path, string format)
{
if (path == null)
{
@ -376,8 +377,8 @@ namespace Volo.Docs.Documents
{
return await GetDocumentAsync(documentName, project, languageCode, version);
}
var document = await _documentRepository.FindAsync(project.Id, documentName, languageCode, version);
var document = await _documentRepository.FindAsync(project.Id, GetPossibleNames(documentName, project.Format), languageCode, version);
if (document == null)
{
return await GetDocumentAsync(documentName, project, languageCode, version);
@ -416,10 +417,8 @@ namespace Volo.Docs.Documents
string languageCode, string version, Document oldDocument = null)
{
Logger.LogInformation($"Not found in the cache. Requesting {documentName} from the source...");
var source = _documentStoreFactory.Create(project.DocumentStoreType);
var sourceDocument = await source.GetDocumentAsync(project, documentName, languageCode, version,
oldDocument?.LastSignificantUpdateTime);
var sourceDocument = await GetSourceDocument(project, documentName, languageCode, version, oldDocument);
await _documentRepository.DeleteAsync(project.Id, sourceDocument.Name, sourceDocument.LanguageCode, sourceDocument.Version, autoSave: true);
await _documentRepository.InsertAsync(sourceDocument, true);
@ -444,6 +443,55 @@ namespace Volo.Docs.Documents
return CreateDocumentWithDetailsDto(project, sourceDocument);
}
private static List<string> GetPossibleNames(string originalDocumentName, string format)
{
var extension = Path.GetExtension(originalDocumentName);
if (extension != null && !extension.Equals("." + format, StringComparison.OrdinalIgnoreCase))
{
return new List<string> {originalDocumentName};
}
var possibleNames = new List<string> {originalDocumentName};
if (!originalDocumentName.EndsWith("/index." + format, StringComparison.OrdinalIgnoreCase))
{
var documentNameWithoutExtension = RemoveFileExtensionFromPath(originalDocumentName, format);
possibleNames.Add(documentNameWithoutExtension + "/index." + format);
possibleNames.Add(documentNameWithoutExtension + "/Index." + format);
}
return possibleNames;
}
private async Task<Document> GetSourceDocument(Project project, string documentName,
string languageCode, string version, Document oldDocument)
{
var source = _documentStoreFactory.Create(project.DocumentStoreType);
Document sourceDocument = null;
Exception firstException = null;
foreach (var name in GetPossibleNames(documentName, project.Format))
{
try
{
sourceDocument = await source.GetDocumentAsync(project, name, languageCode, version,
oldDocument?.LastSignificantUpdateTime);
break;
}
catch (Exception ex)
{
firstException ??= ex;
}
}
if(sourceDocument == null)
{
throw firstException!;
}
return sourceDocument;
}
private TimeSpan GetCacheTimeout()
{
var value = _configuration["Volo.Docs:DocumentCacheTimeoutInterval"];

7
modules/docs/src/Volo.Docs.Domain/Volo/Docs/Documents/IDocumentRepository.cs

@ -19,6 +19,13 @@ namespace Volo.Docs.Documents
string version,
bool includeDetails = true,
CancellationToken cancellationToken = default);
Task<Document> FindAsync(Guid projectId,
List<string> possibleNames,
string languageCode,
string version,
bool includeDetails = true,
CancellationToken cancellationToken = default);
Task DeleteAsync(Guid projectId,
string name,

10
modules/docs/src/Volo.Docs.EntityFrameworkCore/Volo/Docs/Documents/EFCoreDocumentRepository.cs

@ -154,6 +154,16 @@ namespace Volo.Docs.Documents
GetCancellationToken(cancellationToken));
}
public async Task<Document> FindAsync(Guid projectId, List<string> possibleNames, string languageCode, string version,
bool includeDetails = true, CancellationToken cancellationToken = default)
{
return await (await GetDbSetAsync()).IncludeDetails(includeDetails)
.FirstOrDefaultAsync(x =>
x.ProjectId == projectId && possibleNames.Contains(x.Name) &&
x.LanguageCode == languageCode && x.Version == version,
GetCancellationToken(cancellationToken));
}
public virtual async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, bool autoSave = false, CancellationToken cancellationToken = default)
{
await DeleteAsync(x =>

10
modules/docs/src/Volo.Docs.MongoDB/Volo/Docs/Documents/MongoDocumentRepository.cs

@ -62,6 +62,16 @@ namespace Volo.Docs.Documents
x.LanguageCode == languageCode &&
x.Version == version, GetCancellationToken(cancellationToken));
}
public virtual async Task<Document> FindAsync(Guid projectId, List<string> possibleNames, string languageCode, string version,
bool includeDetails = true,
CancellationToken cancellationToken = default)
{
return await (await GetMongoQueryableAsync(cancellationToken)).FirstOrDefaultAsync(x => x.ProjectId == projectId &&
possibleNames.Contains(x.Name) &&
x.LanguageCode == languageCode &&
x.Version == version, GetCancellationToken(cancellationToken));
}
public virtual async Task DeleteAsync(Guid projectId, string name, string languageCode, string version, bool autoSave = false, CancellationToken cancellationToken = default)
{

35
modules/docs/src/Volo.Docs.Web/Pages/Documents/Project/Index.cshtml.cs

@ -482,33 +482,20 @@ namespace Volo.Docs.Pages.Documents.Project
private async Task<bool> TrySetDocumentAsync()
{
var documentPath = DocumentName ?? "";
if (Request.GetDisplayUrl().EndsWith("/index", StringComparison.OrdinalIgnoreCase))
{
documentPath = documentPath.Substring(0, documentPath.LastIndexOf('/') + 1);
}
var documentNames = new[] { DocumentName, documentPath.EnsureEndsWith('/') + "Index", documentPath.EnsureEndsWith('/') + "index" }.Distinct().ToArray();
var languages = new[] { LanguageCode, DefaultLanguageCode }.Where(x => !x.IsNullOrWhiteSpace()).Distinct().ToArray();
var sb = new StringBuilder();
foreach (var documentName in documentNames)
DocumentNameWithExtension = new StringBuilder().Append(DocumentName).Append('.').Append(Project.Format).ToString();
foreach (var language in languages)
{
DocumentName = documentName;
DocumentNameWithExtension = sb.Clear().Append(DocumentName).Append('.').Append(Project.Format).ToString();
foreach (var language in languages)
try
{
try
{
Document = await GetSpecificDocumentOrDefaultAsync(language);
DocumentLanguageCode = language;
await ConvertDocumentContentToHtmlAsync();
return true;
}
catch (DocumentNotFoundException e)
{
Logger.LogWarning(e.Message);
}
Document = await GetSpecificDocumentOrDefaultAsync(language);
DocumentLanguageCode = language;
await ConvertDocumentContentToHtmlAsync();
return true;
}
catch (DocumentNotFoundException e)
{
Logger.LogWarning(e.Message);
}
}

Loading…
Cancel
Save