[CLAUDE] Workflow: App CQRS + API ApprovalWorkflowsV2 (Chunk B)

3 handler MediatR + Validator + Controller cho schema mới Mig 22.

Files:
- Application/ApprovalWorkflowsV2/ApprovalWorkflowV2AdminFeatures.cs
  - GetAwAdminOverviewQuery (filter optional ApplicableType)
  - CreateAwDefinitionCommand + Validator (auto-increment Version
    theo Code, deactivate active version cùng ApplicableType)
  - DeleteAwDefinitionCommand (UAT helper — chưa pin nên unconditional)
  - DTO: AwDefinition/AwStep/AwLevel + TypeSummary
- Application/Common/Interfaces/IApplicationDbContext.cs (3 DbSet)
- Api/Controllers/ApprovalWorkflowsV2Controller.cs
  - Route /api/approval-workflows-v2
  - GET ?applicableType=N | POST | DELETE/{id}
  - Reuse policy Workflows.Read/Workflows.Create

Verify: build OK 0 error, IApplicationDbContext expose 3 DbSet mới.

Next: Chunk C — FE Designer page + route + Layout resolver.
This commit is contained in:
pqhuy1987
2026-05-08 12:42:03 +07:00
parent c847dc0b24
commit f6047d5218
3 changed files with 324 additions and 0 deletions

View File

@ -0,0 +1,38 @@
using MediatR;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using SolutionErp.Application.ApprovalWorkflowsV2;
namespace SolutionErp.Api.Controllers;
// Quy trình duyệt MỚI (Mig 22 — Session 17, 2026-05-08).
// Schema riêng để UAT, KHÔNG đụng WorkflowDefinition cũ.
// Reuse policy "Workflows.Read"/"Workflows.Create" giống PE/Contract designer
// — admin đã có quyền quản lý workflow nói chung.
[ApiController]
[Route("api/approval-workflows-v2")]
[Authorize(Policy = "Workflows.Read")]
public class ApprovalWorkflowsV2Controller(IMediator mediator) : ControllerBase
{
[HttpGet]
public async Task<ActionResult<AwAdminOverviewDto>> Overview(
[FromQuery] int? applicableType,
CancellationToken ct)
=> Ok(await mediator.Send(new GetAwAdminOverviewQuery(applicableType), ct));
[HttpPost]
[Authorize(Policy = "Workflows.Create")]
public async Task<ActionResult<object>> Create([FromBody] CreateAwDefinitionCommand cmd, CancellationToken ct)
{
var id = await mediator.Send(cmd, ct);
return Ok(new { id });
}
[HttpDelete("{id:guid}")]
[Authorize(Policy = "Workflows.Create")]
public async Task<IActionResult> Delete(Guid id, CancellationToken ct)
{
await mediator.Send(new DeleteAwDefinitionCommand(id), ct);
return NoContent();
}
}