using Campaign_Tracker.Server.Authorization; using Campaign_Tracker.Server.ExtensionData; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Campaign_Tracker.Server.Controllers; [ApiController] [Authorize(Policy = ApplicationPolicy.AdminAccess)] [Route("api/admin/extension-records")] public sealed class ExtensionRecordsController : ControllerBase { private readonly IExtensionRecordStore _store; public ExtensionRecordsController(IExtensionRecordStore store) { _store = store; } [HttpPost] public async Task> Save( ExtensionRecordRequest request, CancellationToken cancellationToken) { if (request.LegacyLink is null) { return BadRequest(new ExtensionRecordValidationProblem("Legacy reference is required.")); } var result = await _store.SaveAsync( new ExtensionRecordDraft( request.RecordType, request.RecordId, new LegacyLinkReference(request.LegacyLink.Type, request.LegacyLink.Value)), cancellationToken); if (!result.Saved || result.Record is null) { return BadRequest(new ExtensionRecordValidationProblem( result.Error ?? "Extension record could not be saved.")); } return Ok(ExtensionRecordResponse.From(result.Record)); } } public sealed record ExtensionRecordRequest( string RecordType, string RecordId, LegacyLinkRequest? LegacyLink); public sealed record LegacyLinkRequest( LegacyLinkType Type, string Value); public sealed record ExtensionRecordResponse( string RecordType, string RecordId, string LinkType, string LinkValue) { public static ExtensionRecordResponse From(ILegacyLinkedRecord record) => new(record.RecordType, record.RecordId, record.LegacyLink.Type.ToString(), record.LegacyLink.Value); } public sealed record ExtensionRecordValidationProblem(string Error);