using System.Diagnostics; using FastBlog.Core.Abstractions.Repositories.Blogs; using FastBlog.Core.Models.Blogs; using FastBlog.Core.Services; using FastBlog.Web.Models; using Microsoft.AspNetCore.Mvc; namespace FastBlog.Web.Controllers; [Route("")] [Route("blogs")] public class BlogsController(BlogService service) : Controller { [HttpGet] [Route("{*slug}")] public async Task Index(string? slug) { if (string.IsNullOrWhiteSpace(slug)) slug = null; var blog = await service.Get(slug); if (blog is null) return NotFound(); return View(blog); } [HttpGet] [Route("")] public async Task Index() { var blog = await service.Get(null); if (blog is null) return NotFound(); return View(blog); } [HttpGet] [Route("edit/{id:int?}")] public async ValueTask Edit(int? id) { if (!id.HasValue) { var date = DateTime.Now; return View( new EditBlog { Text = "# My new blog", Title = "Blog from " + DateTime.Now.ToString("g"), SourceLocation = $"{date:yyyy-MM-dd-HH-mm}_blog.md", CreatedAt = date, ModifiedAt = date, FullWidth = false, ShowDetails = true, Slug = "blog-" + date.ToString("yyyy-MM-dd-HH-mm"), Visible = false } ); } var blog = await service.GetForEdit(id.Value); if (blog is null) return NotFound(); return View(new EditBlog { Id = blog.Metadata.Id, Text = blog.Text, Title = blog.Metadata.Title, SourceLocation = blog.Metadata.SourceLocation, CreatedAt = blog.Metadata.CreatedAt, ModifiedAt = blog.Metadata.ModifiedAt, FullWidth = blog.Metadata.FullWidth, ShowDetails = blog.Metadata.ShowDetails, Slug = blog.Metadata.Slug, Visible = blog.Metadata.Visible, ImageUrl = blog.Metadata.ImageUrl, Signature = blog.Metadata.Signature }); } [HttpPost] [Route("edit")] public async Task Edit([FromForm] EditBlog editBlog) { var result = await service.UpdateBlog(new() { Text = editBlog.Text, Metadata = new() { Id = editBlog.Id, Title = editBlog.Title, Slug = editBlog.Slug, ShowDetails = editBlog.ShowDetailsStr is not null, ImageUrl = editBlog.ImageUrl, CreatedAt = editBlog.CreatedAt, ModifiedAt = editBlog.ModifiedAt, Signature = editBlog.Signature, FullWidth = editBlog.FullWidthStr is not null, Visible = editBlog.VisibleStr is not null, SourceLocation = editBlog.SourceLocation } }); if (result.IsError) { return result.AsError.ShortCode switch { "already_exists" => Conflict(), "not_found" => NotFound(), _ => throw result.AsError }; } return Redirect($"/blogs/{editBlog.Slug}"); } [HttpPost] [Route("preview")] public IActionResult Preview([FromForm] EditBlog editBlog) { return View("Index", new Blog { Text = editBlog.Text, Metadata = new() { Title = editBlog.Title, Slug = editBlog.Slug, ShowDetails = editBlog.ShowDetailsStr is not null, ImageUrl = editBlog.ImageUrl, CreatedAt = editBlog.CreatedAt, ModifiedAt = editBlog.ModifiedAt, Signature = editBlog.Signature, FullWidth = editBlog.FullWidthStr is not null, Visible = editBlog.VisibleStr is not null, SourceLocation = editBlog.SourceLocation } }); } }