using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using PlotLine.Models; using PlotLine.Services; using PlotLine.ViewModels; namespace PlotLine.Controllers; [Authorize] public sealed class ContinuityExplorerController(IStoryStateService storyState) : Controller { public async Task Index([FromQuery] ContinuityFilter filter) { if (filter.ProjectID == 0) { return BadRequest("ProjectID is required."); } var model = await storyState.GetContinuityExplorerAsync(filter); return model is null ? NotFound() : View(model); } [HttpPost] [ValidateAntiForgeryToken] public IActionResult ApplyFilters(ContinuityFilter filter) { return RedirectToAction(nameof(Index), filter); } [HttpPost] [ValidateAntiForgeryToken] public async Task AcknowledgeWarning( string warningType, int? sceneId, int? characterId, int? assetId, string? notes, [Bind(Prefix = "ReturnFilter")] ContinuityFilter returnFilter) { if (returnFilter.ProjectID == 0 || string.IsNullOrWhiteSpace(warningType)) { return BadRequest("Warning identity is required."); } await storyState.AcknowledgeWarningAsync(new ContinuityWarningAcknowledgement { ProjectID = returnFilter.ProjectID, WarningType = warningType, SceneID = sceneId, CharacterID = characterId, AssetID = assetId, Notes = notes }); return RedirectToAction(nameof(Index), returnFilter); } [HttpPost] [ValidateAntiForgeryToken] public async Task RestoreWarning( string warningType, int? sceneId, int? characterId, int? assetId, [Bind(Prefix = "ReturnFilter")] ContinuityFilter returnFilter) { if (returnFilter.ProjectID == 0 || string.IsNullOrWhiteSpace(warningType)) { return BadRequest("Warning identity is required."); } await storyState.RestoreWarningAsync(new ContinuityWarningAcknowledgement { ProjectID = returnFilter.ProjectID, WarningType = warningType, SceneID = sceneId, CharacterID = characterId, AssetID = assetId }); return RedirectToAction(nameof(Index), returnFilter); } }