using Markdig; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace MyWebLog.Features.Pages; /// /// Handle routes for pages /// [Route("/page")] [Authorize] public class PageController : MyWebLogController { /// /// Pipeline with most extensions enabled /// private readonly MarkdownPipeline _pipeline = new MarkdownPipelineBuilder() .UseSmartyPants().UseAdvancedExtensions().Build(); /// public PageController(WebLogDbContext db) : base(db) { } [HttpGet("all")] [HttpGet("all/page/{pageNbr:int}")] public async Task All(int? pageNbr) => View(new PageListModel(await Db.Pages.FindPageOfPages(pageNbr ?? 1), WebLog)); [HttpGet("{id}/edit")] public async Task Edit(string id) { if (id == "new") return View(new EditPageModel(WebLog)); var page = await Db.Pages.FindByIdWithRevisions(id); if (page == null) return NotFound(); return View(EditPageModel.CreateFromPage(page, WebLog)); } [HttpPost("{id}/edit")] public async Task Save(EditPageModel model) { var page = model.PopulatePage(model.IsNew ? new() { Id = WebLogDbContext.NewId(), AuthorId = UserId, PublishedOn = DateTime.UtcNow, Revisions = new List() } : await Db.Pages.GetById(model.PageId)); if (page == null) return NotFound(); page.Text = model.Source == RevisionSource.Html ? model.Text : Markdown.ToHtml(model.Text, _pipeline); page.UpdatedOn = DateTime.UtcNow; if (model.IsNew) await Db.Pages.AddAsync(page); await Db.SaveChangesAsync(); // TODO: confirmation return RedirectToAction(nameof(All)); } }