using Microsoft.AspNetCore.Mvc; using PlotLine.Models; using PlotLine.Services; using PlotLine.ViewModels; namespace PlotLine.Controllers; public sealed class TimelineController(ITimelineService timeline) : Controller { public async Task Index([FromQuery] TimelineFilterViewModel filter) { if (filter.ProjectID == 0) { return BadRequest("ProjectID is required."); } var model = await timeline.GetAsync(filter); return model is null ? NotFound() : View(model); } [HttpPost] public async Task SavePreset(TimelinePresetSaveViewModel model) { await timeline.SavePresetAsync(model); return RedirectToAction(nameof(Index), new { projectId = model.ProjectID, bookId = model.BookID }); } public async Task LoadPreset(int id) { var preset = await timeline.GetPresetAsync(id); if (preset is null) { return NotFound(); } var filter = System.Text.Json.JsonSerializer.Deserialize(preset.FilterJson) ?? new TimelineFilterViewModel(); filter.ProjectID = preset.ProjectID; filter.BookID = preset.BookID; filter.FocusType = preset.FocusType; filter.FocusID = preset.FocusID; return RedirectToAction(nameof(Index), filter); } [HttpPost] public async Task DeletePreset(int id, int projectId, int? bookId) { await timeline.ArchivePresetAsync(id); return RedirectToAction(nameof(Index), new { projectId, bookId }); } }