using Api.SeaHavenIndustries.Options; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using SeaHaven.Services.DTOs; using SeaHaven.Services.Helpers; using SeaHaven.Services.Interfaces; namespace Api.SeaHavenIndustries.Controllers { /// Ops-only endpoints for manual domain job reprocessing. [Authorize(Roles = "Admin")] [ApiController] [Route("api/workorders/jobs")] public class WorkOrderJobsController : ControllerBase { private readonly IWorkOrderWeekRolledService _weekRolledService; private readonly IPastDueCacheService _pastDueCacheService; public WorkOrderJobsController( IWorkOrderWeekRolledService weekRolledService, IPastDueCacheService pastDueCacheService) { _weekRolledService = weekRolledService; _pastDueCacheService = pastDueCacheService; } /// /// Reprocess WeekRolled for a specific operational week (Monday start). /// Idempotent via WorkOrderWeekRolledLedger. /// [HttpPost("week-rolled")] [ProducesResponseType(typeof(WeekRolledJobResult), StatusCodes.Status200OK)] public async Task> RunWeekRolled( [FromQuery] DateOnly? sourceWeekStart, CancellationToken cancellationToken) { var weekStart = sourceWeekStart ?? WorkOrderOperationalWeek.GetPreviousOperationalWeekStart(DateTime.UtcNow); if (weekStart.DayOfWeek != DayOfWeek.Monday) return BadRequest("sourceWeekStart must be a Monday (operational week start)."); var result = await _weekRolledService.ProcessWeekRolledAsync(weekStart, cancellationToken); return Ok(result); } /// /// Refresh optional OperationalFlags.PastDue cache (board isPastDue remains on-read). /// [HttpPost("past-due-cache")] [ProducesResponseType(typeof(PastDueCacheJobResult), StatusCodes.Status200OK)] public async Task> RunPastDueCache(CancellationToken cancellationToken) { var result = await _pastDueCacheService.RefreshAsync(cancellationToken); return Ok(result); } } }