proposal-system/api/src/ProposalSystem.Api/Controllers/ProposalsController.cs

114 lines
3.8 KiB
C#
Raw Normal View History

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<ActionResult<ProposalResponse>> 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<ActionResult<PagedResponse<ProposalListResponse>>> GetAll(
[FromQuery] ProposalFilterRequest filter,
CancellationToken ct)
{
var result = await _proposalService.GetAllAsync(filter, ct);
return Ok(result);
}
[HttpGet("{id:guid}")]
public async Task<ActionResult<ProposalResponse>> 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<ActionResult<ProposalResponse>> 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<ActionResult<ProposalResponse>> 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<ActionResult<ProposalResponse>> 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<ActionResult<ProposalResponse>> Revise(Guid id, CancellationToken ct)
{
var result = await _proposalService.ReviseAsync(id, ct);
return Ok(result);
}
[HttpGet("{id:guid}/history")]
public async Task<ActionResult<IReadOnlyList<ProposalResponse>>> 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<ActionResult<IReadOnlyList<AuditLogResponse>>> 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<IActionResult> 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<IActionResult> Regenerate(Guid id, CancellationToken ct)
{
await _jobPublisher.PublishAsync("suggestions", new { proposalId = id, trigger = "regenerate" }, ct);
return Accepted();
}
}