using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using ProposalSystem.Application.DTOs; using ProposalSystem.Application.Interfaces; namespace ProposalSystem.Api.Controllers; [ApiController] [Route("api/proposals")] [Authorize] public class ProposalsController : ControllerBase { private readonly IProposalService _proposalService; private readonly IJobPublisher _jobPublisher; public ProposalsController(IProposalService proposalService, IJobPublisher jobPublisher) { _proposalService = proposalService; _jobPublisher = jobPublisher; } [HttpPost] public async Task> Create( [FromBody] CreateProposalRequest request, CancellationToken ct) { var result = await _proposalService.CreateAsync(request, ct); return CreatedAtAction(nameof(GetById), new { id = result.Id }, result); } [HttpGet] public async Task>> GetAll( [FromQuery] ProposalFilterRequest filter, CancellationToken ct) { var result = await _proposalService.GetAllAsync(filter, ct); return Ok(result); } [HttpGet("{id:guid}")] public async Task> GetById(Guid id, CancellationToken ct) { var result = await _proposalService.GetByIdAsync(id, ct); if (result == null) return NotFound(); return Ok(result); } [HttpPut("{id:guid}")] [Authorize(Roles = "admins,sysadmins")] public async Task> Update( Guid id, [FromBody] UpdateProposalRequest request, CancellationToken ct) { var result = await _proposalService.UpdateAsync(id, request, ct); return Ok(result); } [HttpPost("{id:guid}/approve")] [Authorize(Roles = "admins,sysadmins")] public async Task> Approve(Guid id, CancellationToken ct) { var result = await _proposalService.ApproveAsync(id, ct); return Ok(result); } [HttpPost("{id:guid}/send")] [Authorize(Roles = "admins,sysadmins")] public async Task> MarkSent(Guid id, CancellationToken ct) { var result = await _proposalService.MarkSentAsync(id, ct); return Ok(result); } [HttpPost("{id:guid}/revise")] [Authorize(Roles = "admins,sysadmins")] public async Task> Revise(Guid id, CancellationToken ct) { var result = await _proposalService.ReviseAsync(id, ct); return Ok(result); } [HttpGet("{id:guid}/history")] public async Task>> GetHistory(Guid id, CancellationToken ct) { var result = await _proposalService.GetRevisionHistoryAsync(id, ct); return Ok(result); } [HttpGet("{id:guid}/audit")] [Authorize(Roles = "admins,sysadmins")] public async Task>> GetAudit(Guid id, CancellationToken ct) { var result = await _proposalService.GetAuditTrailAsync(id, ct); return Ok(result); } [HttpPost("{id:guid}/generate-suggestions")] [Authorize(Roles = "admins,sysadmins")] public async Task GenerateSuggestions(Guid id, CancellationToken ct) { await _jobPublisher.PublishAsync("suggestions", new { proposalId = id, trigger = "generate" }, ct); return Accepted(); } [HttpPost("{id:guid}/regenerate")] [Authorize(Roles = "admins,sysadmins")] public async Task Regenerate(Guid id, CancellationToken ct) { await _jobPublisher.PublishAsync("suggestions", new { proposalId = id, trigger = "regenerate" }, ct); return Accepted(); } }