using System.Text.Json.Nodes; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ModelBinding; using Csob.Services; namespace Csob.Controllers; /// /// PISP – direct-debit mandate initiation and its authorization (sign) flow. Requires the ČSOB /// credential headers. The mandate body is forwarded to ČSOB as raw JSON (COBS direct-debit shape). /// [ApiController] [Route("direct-debits")] [Produces("application/json")] [Tags("PISP – Direct debits")] public sealed class DirectDebitsController : ControllerBase { private readonly DirectDebitsService _service; public DirectDebitsController(DirectDebitsService service) => _service = service; /// Initiate a direct-debit mandate. [HttpPost] public async Task Initiate([FromBody] JsonNode request, CancellationToken ct) => Ok(await _service.InitiateAsync(request, ct)); /// Get the direct-debit mandate detail. [HttpGet("{id}")] public async Task Detail(string id, CancellationToken ct) => Ok(await _service.DetailAsync(id, ct)); /// Get the direct-debit instruction status. [HttpGet("{id}/status")] public async Task Status(string id, CancellationToken ct) => Ok(await _service.StatusAsync(id, ct)); /// Revoke a direct-debit mandate. [HttpDelete("{id}")] public async Task Cancel(string id, CancellationToken ct) => Ok(await _service.CancelAsync(id, ct)); /// Start the authorization (SCA) of a direct-debit mandate. Returns the PSU redirect details. [HttpPost("{id}/sign/{signId}")] public async Task StartSign(string id, string signId, [FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] JsonNode? body, CancellationToken ct) => Ok(await _service.StartSignAsync(id, signId, body, ct)); /// Get the current state of an authorization (sign) transaction. [HttpGet("{id}/sign/{signId}")] public async Task SignStatus(string id, string signId, CancellationToken ct) => Ok(await _service.SignStatusAsync(id, signId, ct)); /// Finalize an authorization (sign) transaction. [HttpPut("{id}/sign/{signId}")] public async Task FinalizeSign(string id, string signId, [FromBody(EmptyBodyBehavior = EmptyBodyBehavior.Allow)] JsonNode? body, CancellationToken ct) => Ok(await _service.FinalizeSignAsync(id, signId, body, ct)); }