using Api.SeaHavenIndustries.Filters; using Microsoft.AspNetCore.Mvc; using SeaHaven.Services.DTOs; using SeaHaven.Services.Interfaces; namespace Api.SeaHavenIndustries.Controllers { [ApiController] [Route("api/workorders")] public class WorkOrderIngestController : ControllerBase { private const int MaxBatchSize = 100; private readonly IWorkOrderIngestService _ingestService; public WorkOrderIngestController(IWorkOrderIngestService ingestService) { _ingestService = ingestService; } /// /// Idempotent upsert by ExternalWorkOrderId (Lambda cutover target). /// Auth: X-Ingest-Key header. /// [HttpPost("ingest")] [IngestApiKey] [ProducesResponseType(typeof(WorkOrderIngestBatchResultDto), StatusCodes.Status200OK)] public async Task> Ingest( [FromBody] WorkOrderIngestBatchRequestDto? batch, CancellationToken cancellationToken) { var items = NormalizeItems(batch); if (items.Count == 0) return BadRequest("At least one item with externalWorkOrderId is required."); if (items.Count > MaxBatchSize) return BadRequest($"Max {MaxBatchSize} items per request."); var result = await _ingestService.UpsertBatchAsync(items, cancellationToken); return Ok(result); } private static List NormalizeItems(WorkOrderIngestBatchRequestDto? batch) { if (batch?.Items is { Count: > 0 }) return batch.Items; return new List(); } } }