diff --git a/Yes.Application/Admins/Themes/GetThemeFilesQueryHandler.cs b/Yes.Application/Admins/Themes/GetThemeFilesQueryHandler.cs index 6d2d13e..0b012d6 100644 --- a/Yes.Application/Admins/Themes/GetThemeFilesQueryHandler.cs +++ b/Yes.Application/Admins/Themes/GetThemeFilesQueryHandler.cs @@ -7,10 +7,8 @@ string FileName ); - public class GetThemeFilesQueryHandler(IOptionsMonitor options, IMapper mapper, IWebHostEnvironment env) : IRequestHandler> + public class GetThemeFilesQueryHandler(IWebHostEnvironment env) : IRequestHandler> { - private readonly BlogSettings _settings = options.CurrentValue; - private readonly IMapper _mapper = mapper; private readonly IWebHostEnvironment _env = env; public async Task> Handle(GetThemeFilesQuery request, CancellationToken cancellationToken) @@ -18,11 +16,11 @@ var themeName = request.Name; var themes = new List(); var themePath = Path.Combine(_env.ContentRootPath, "files", "themes", themeName); - var files = Directory.GetFiles(themePath).Where(x=>x.EndsWith(".liquid") || x.EndsWith(".css") || x.EndsWith(".js")); + var allowedExtensions = new[] { ".liquid", ".css", ".js" }; + var files = Directory.GetFiles(themePath, "*.*", SearchOption.AllDirectories).Where(file => allowedExtensions.Contains(Path.GetExtension(file).ToLowerInvariant())); - - themes = files.Select(x=>new GetThemeFilesQueryResponse(Path.GetFileName(x))).ToList(); + themes = files.Select(x=>new GetThemeFilesQueryResponse(Path.GetRelativePath(themePath, x))).ToList(); return themes; } diff --git a/Yes.Blog/Endpoints/Admins/Themes/GetThemeFileEndpoint.cs b/Yes.Blog/Endpoints/Admins/Themes/GetThemeFileEndpoint.cs index cd093ae..f8ef0f0 100644 --- a/Yes.Blog/Endpoints/Admins/Themes/GetThemeFileEndpoint.cs +++ b/Yes.Blog/Endpoints/Admins/Themes/GetThemeFileEndpoint.cs @@ -2,14 +2,16 @@ { public class GetThemeFileEndpoint : ThemeEndpointScheme, IEndpoint { - public void Map(IEndpointRouteBuilder app) => app.MapGet("/themes/{themeName}/files/{fileName}", Handle); - - public record Request([FromRoute(Name = "themeName")] string ThemeName, [FromRoute(Name = "fileName")] string FileName); + public void Map(IEndpointRouteBuilder app) => app.MapGet("/themes/{themeName}/file", Handle); - private async Task Handle([AsParameters] Request request, IMediator mediator, IMapper mapper, CancellationToken cancellationToken) + + private async Task Handle( + [FromRoute(Name = "themeName")] string themeName, + [FromQuery] string fileName, IMediator mediator, + IMapper mapper, CancellationToken cancellationToken) { - var query = new GetThemeFileQuery(request.ThemeName, request.FileName); + var query = new GetThemeFileQuery(themeName, fileName); var response = await mediator.Send(query, cancellationToken); diff --git a/Yes.Blog/Endpoints/Admins/Themes/UpdateThemeFileEndpoint.cs b/Yes.Blog/Endpoints/Admins/Themes/UpdateThemeFileEndpoint.cs index fbb9368..22f56da 100644 --- a/Yes.Blog/Endpoints/Admins/Themes/UpdateThemeFileEndpoint.cs +++ b/Yes.Blog/Endpoints/Admins/Themes/UpdateThemeFileEndpoint.cs @@ -3,7 +3,7 @@ namespace Yes.Blog.Endpoints.Admins.Themes { public class UpdateThemeFileEndpoint : ThemeEndpointScheme, IEndpoint { - public void Map(IEndpointRouteBuilder app) => app.MapPut("/themes/{themeName}/files/{fileName}", Handle);//.WithRequestValidation(); + public void Map(IEndpointRouteBuilder app) => app.MapPut("/themes/{themeName}/file", Handle);//.WithRequestValidation(); internal record Request( string Content @@ -21,7 +21,7 @@ namespace Yes.Blog.Endpoints.Admins.Themes private async Task Handle([FromBody] Request request, [FromRoute(Name = "themeName")] string themeName, - [FromRoute(Name = "fileName")] string fileName, + [FromQuery(Name = "fileName")] string fileName, IMediator mediator, IMapper mapper, CancellationToken cancellationToken) { var command = mapper.Map(request); diff --git a/Yes.Blog/wwwroot/admin/js/theme/detail.js b/Yes.Blog/wwwroot/admin/js/theme/detail.js index 0832f21..c504389 100644 --- a/Yes.Blog/wwwroot/admin/js/theme/detail.js +++ b/Yes.Blog/wwwroot/admin/js/theme/detail.js @@ -35,7 +35,7 @@ return this; }, loadFile() { - axios.get('/themes/' + themeName + '/files/' + fileName) + axios.get('/themes/' + themeName + '/file/?fileName=' + fileName) .then(data => { this.file = data; editor.setValue(this.file.content); @@ -47,7 +47,7 @@ return; } this.isSubmitting = true; - axios.put('/themes/' + themeName + '/files/' + fileName, { content: this.file.content }) + axios.put('/themes/' + themeName + '/file/?fileName=' + fileName, { content: this.file.content }) .then(data => { console.log('data:', data); location.href = "/admin/theme/detail?themeName=" + themeName + "&fileName=" + fileName + "";