using Distribution.Infra.Authorization; using Distribution.Models; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace Distribution.Features.SysConfig; [ApiController] [Route("api/sys-config")] public class SysConfigController(SysConfigService service, ICurrentUserService currentUser) : ControllerBase { [HttpGet] [Authorize("sys-config.view")] public async Task GetAll() => Ok(await service.GetAllAsync()); [HttpGet("invoice-creation-mode")] [Authorize("sys-config.view")] public async Task GetInvoiceCreationMode() { var mode = await service.GetInvoiceCreationModeAsync(); return Ok(new { Mode = mode }); } [HttpPut("invoice-creation-mode")] [Authorize("sys-config.manage")] public async Task SetInvoiceCreationMode(SetInvoiceCreationModeRequest request, CancellationToken ct) { var userId = currentUser.UserId ?? throw new UnauthorizedAccessException(); try { var result = await service.SetAsync(SysConfigService.KeyInvoiceCreationMode, request.Mode.ToString(), userId, ct); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } } [HttpGet("{key}")] [Authorize("sys-config.view")] public async Task GetByKey(string key) { var result = await service.GetByKeyAsync(key); return result is null ? NotFound() : Ok(result); } [HttpPut("{key}")] [Authorize("sys-config.manage")] public async Task Set(string key, SetSysConfigRequest request, CancellationToken ct) { var userId = currentUser.UserId ?? request.UserId; if (userId is null) return BadRequest(new { error = "UserId is required while auth is unavailable" }); try { var result = await service.SetAsync(key, request.Value, userId.Value, ct); return Ok(result); } catch (InvalidOperationException ex) { return BadRequest(new { error = ex.Message }); } } }