diff --git a/.gitignore b/.gitignore index fde09aa..6593c43 100644 --- a/.gitignore +++ b/.gitignore @@ -2,8 +2,7 @@ *.db # STATIC -wwwroot/static/ - +src/FastBlog.Web/wwwroot/static/ # BLOGS md/ diff --git a/src/FastBlog.Core/Abstractions/Repositories/Blogs/IBlogMetaRepository.cs b/src/FastBlog.Core/Abstractions/Repositories/Blogs/IBlogMetaRepository.cs index b5e2086..49fc381 100644 --- a/src/FastBlog.Core/Abstractions/Repositories/Blogs/IBlogMetaRepository.cs +++ b/src/FastBlog.Core/Abstractions/Repositories/Blogs/IBlogMetaRepository.cs @@ -7,6 +7,7 @@ public interface IBlogMetaRepository { Task Get(string? slug); Task GetForEdit(int id); + Task Delete(int id); Task> Add(BlogMeta meta); Task> Update(BlogMeta meta); } \ No newline at end of file diff --git a/src/FastBlog.Core/DependencyInjection.cs b/src/FastBlog.Core/DependencyInjection.cs index 9594c0a..13fc01d 100644 --- a/src/FastBlog.Core/DependencyInjection.cs +++ b/src/FastBlog.Core/DependencyInjection.cs @@ -58,7 +58,7 @@ public static class DependencyInjection if (mainPage is not null) return; - await blogService.UpdateBlog(new Blog + await blogService.Update(new Blog { Text = BlogDefaultBody, Metadata = new BlogMeta diff --git a/src/FastBlog.Core/Repositories/BlogMetaRepository.cs b/src/FastBlog.Core/Repositories/BlogMetaRepository.cs index 7d0354b..322dc38 100644 --- a/src/FastBlog.Core/Repositories/BlogMetaRepository.cs +++ b/src/FastBlog.Core/Repositories/BlogMetaRepository.cs @@ -44,6 +44,19 @@ public sealed class BlogMetaRepository(SqliteConnectionFactory connectionFactory return await connection.QueryFirstOrDefaultAsync(sql, new { id }); } + public async Task Delete(int id) + { + const string sql = """ + update Blogs + set Deleted = 1 + where id = @id + """; + + using var connection = connectionFactory.Create(); + + return await connection.ExecuteAsync(sql, new { id }) > 0; + } + public async Task> Add(BlogMeta meta) { using var connection = connectionFactory.Create(); diff --git a/src/FastBlog.Core/Services/BlogService.cs b/src/FastBlog.Core/Services/BlogService.cs index 71ae53d..05e2a77 100644 --- a/src/FastBlog.Core/Services/BlogService.cs +++ b/src/FastBlog.Core/Services/BlogService.cs @@ -47,12 +47,27 @@ public sealed class BlogService(IBlogMetaRepository metaRepository, IBlogFileRep } - public Task> UpdateBlog(Blog blog) + public Task> Update(Blog blog) { - return blog.Metadata.Id is null ? CreateBlog(blog) : UpdateBlogInternal(blog); + return blog.Metadata.Id is null ? Create(blog) : UpdateInternal(blog); } - private async Task> CreateBlog(Blog newBlog) + public async Task Delete(int id) + { + var meta = await metaRepository.GetForEdit(id); + if (meta is null) + return false; + + var toDelete = meta.SourceLocation; + + var result = await metaRepository.Delete(id); + if (!result) + return false; + + return await blogFileRepository.Delete(toDelete); + } + + private async Task> Create(Blog newBlog) { var metaResult = await metaRepository.Add(newBlog.Metadata); if (metaResult.IsError) @@ -71,7 +86,7 @@ public sealed class BlogService(IBlogMetaRepository metaRepository, IBlogFileRep } - private async Task> UpdateBlogInternal(Blog blog) + private async Task> UpdateInternal(Blog blog) { var oldMeta = await metaRepository.GetForEdit(blog.Metadata.Id!.Value); if (oldMeta is null) diff --git a/src/FastBlog.Web/Controllers/BlogsController.cs b/src/FastBlog.Web/Controllers/BlogsController.cs index af62e93..d58bed6 100644 --- a/src/FastBlog.Web/Controllers/BlogsController.cs +++ b/src/FastBlog.Web/Controllers/BlogsController.cs @@ -44,12 +44,12 @@ public class BlogsController(BlogService service) : Controller { if (!id.HasValue) { - var date = DateTime.Now; + var date = DateTime.UtcNow; return View( new EditBlog { Text = "# My new blog", - Title = "Blog from " + DateTime.Now.ToString("g"), + Title = "Blog from " + DateTime.UtcNow.ToString("g"), SourceLocation = $"{date:yyyy-MM-dd-HH-mm}_blog.md", CreatedAt = date, ModifiedAt = date, @@ -87,7 +87,7 @@ public class BlogsController(BlogService service) : Controller [Route("edit")] public async Task Edit([FromForm] EditBlog editBlog) { - var result = await service.UpdateBlog(new() + var result = await service.Update(new() { Text = editBlog.Text, Metadata = new() @@ -141,4 +141,17 @@ public class BlogsController(BlogService service) : Controller } }); } + + [HttpDelete] + [Route("{id:int}")] + public async Task Delete(int id) + { + var result = await service.Delete(id); + + if (!result) + return NotFound(); + + HttpContext.Response.Headers.Append("Hx-Redirect", "/"); + return Ok(); + } } \ No newline at end of file diff --git a/src/FastBlog.Web/Controllers/FilesController.cs b/src/FastBlog.Web/Controllers/FilesController.cs index 3293ed3..398f0b0 100644 --- a/src/FastBlog.Web/Controllers/FilesController.cs +++ b/src/FastBlog.Web/Controllers/FilesController.cs @@ -50,7 +50,7 @@ public class FilesController(FileService fileService) : Controller var meta = new FileMeta { SourceLocation = Path.Combine(sourcePath ?? "", file.FileName), - CreatedAt = DateTime.Now, + CreatedAt = DateTime.UtcNow, MimeType = file.ContentType }; diff --git a/src/FastBlog.Web/Views/Blogs/Edit.cshtml b/src/FastBlog.Web/Views/Blogs/Edit.cshtml index 9b2c793..7fce865 100644 --- a/src/FastBlog.Web/Views/Blogs/Edit.cshtml +++ b/src/FastBlog.Web/Views/Blogs/Edit.cshtml @@ -73,7 +73,7 @@ else
- +
diff --git a/src/FastBlog.Web/Views/Blogs/Index.cshtml b/src/FastBlog.Web/Views/Blogs/Index.cshtml index 21c5a18..64af888 100644 --- a/src/FastBlog.Web/Views/Blogs/Index.cshtml +++ b/src/FastBlog.Web/Views/Blogs/Index.cshtml @@ -5,7 +5,12 @@ @{ ViewBag.Title = Model.Metadata.Title; - var pipelineBuilder = new MarkdownPipelineBuilder().UseAdvancedExtensions().UseHighlightJs(); + var pipelineBuilder = new MarkdownPipelineBuilder() + .UseSmartyPants() + .UseEmojiAndSmiley() + .UseAlertBlocks() + .UseAdvancedExtensions() + .UseHighlightJs(); var sanitizer = new HtmlSanitizer(); sanitizer.AllowedAttributes.Add("class"); var pipeline = pipelineBuilder.Build(); @@ -37,4 +42,31 @@ } @Html.Raw(sanitizer.Sanitize(Markdown.ToHtml(Model.Text, pipeline))) - \ No newline at end of file + + +
+ +
+
+
+
+

Editor's controls

+
+ +
+ +
+ +
+
+ +
+
diff --git a/src/FastBlog.Web/Views/Blogs/Preview.cshtml b/src/FastBlog.Web/Views/Blogs/Preview.cshtml index dd49537..59db3e5 100644 --- a/src/FastBlog.Web/Views/Blogs/Preview.cshtml +++ b/src/FastBlog.Web/Views/Blogs/Preview.cshtml @@ -1,7 +1,4 @@ -@using Ganss.Xss -@using Markdig; -@using Pek.Markdig.HighlightJs -@model FastBlog.Core.Models.Blogs.Blog +@model FastBlog.Core.Models.Blogs.Blog @await Html.PartialAsync("Index", Model); diff --git a/src/FastBlog.Web/Views/Shared/_Layout.cshtml b/src/FastBlog.Web/Views/Shared/_Layout.cshtml index bd5deeb..c09e366 100644 --- a/src/FastBlog.Web/Views/Shared/_Layout.cshtml +++ b/src/FastBlog.Web/Views/Shared/_Layout.cshtml @@ -31,6 +31,7 @@ return;
    @foreach (var link in options.Value.Links) diff --git a/src/FastBlog.Web/wwwroot/css/site.css b/src/FastBlog.Web/wwwroot/css/site.css index dc67d3e..5065b7e 100644 --- a/src/FastBlog.Web/wwwroot/css/site.css +++ b/src/FastBlog.Web/wwwroot/css/site.css @@ -26,6 +26,9 @@ --pico-background-color: #0f1a27; --pico-card-background-color: #132232; --pico-card-sectioning-background-color: #17273a; + + --pico-form-element-background-color: #ffffff08; + --pico-form-element-active-background-color: #ffffff18; } h1, h2, h3, h4, h5, h6 { diff --git a/src/FastBlog.Web/wwwroot/static/denji512.png b/src/FastBlog.Web/wwwroot/static/denji512.png deleted file mode 100644 index 21fa831..0000000 Binary files a/src/FastBlog.Web/wwwroot/static/denji512.png and /dev/null differ