Class TicketsController
- Namespace
- KadicErp.WebApi.Controllers.Helpdesk
- Assembly
- KadicErp.WebApi.dll
Tickets de soporte. Helpdesk es global y transversal a todo el ERP (decisión 2026-07-13): NO lleva [RequireModule] a propósito — se gatea únicamente por permisos, que el auto-seed asigna a todos los roles activos (Create/ViewOwn/Comment) o solo a gestores (ViewAll/…). La regla own-or-ViewAll de lectura/comentario se resuelve en los handlers vía ICurrentUser.HasPermission.
[ApiController]
[Route("api/helpdesk/tickets")]
[Authorize]
public class TicketsController : ControllerBase
- Inheritance
-
objectControllerBaseTicketsController
Constructors
TicketsController(IMediator)
public TicketsController(IMediator mediator)
Parameters
mediatorIMediator
Methods
AddComment(Guid, AddCommentRequest)
[HttpPost("{id:guid}/comments")]
[Authorize(Policy = "HELPDESK_TICKETS_COMMENT")]
public Task<IActionResult> AddComment(Guid id, TicketsController.AddCommentRequest request)
Parameters
idGuidrequestTicketsController.AddCommentRequest
Returns
- Task<IActionResult>
Assign(Guid, AssignTicketRequest)
[HttpPost("{id:guid}/assign")]
[Authorize(Policy = "HELPDESK_TICKETS_ASSIGN")]
public Task<IActionResult> Assign(Guid id, TicketsController.AssignTicketRequest request)
Parameters
idGuidrequestTicketsController.AssignTicketRequest
Returns
- Task<IActionResult>
Create(CreateTicketCommand)
[HttpPost]
[Authorize(Policy = "HELPDESK_TICKETS_CREATE")]
public Task<IActionResult> Create(CreateTicketCommand command)
Parameters
commandCreateTicketCommand
Returns
- Task<IActionResult>
GetById(Guid)
[HttpGet("{id:guid}")]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_OWN")]
public Task<IActionResult> GetById(Guid id)
Parameters
idGuid
Returns
- Task<IActionResult>
GetInbox(int, int, TicketStatus?, int?, Guid?, string?)
Bandeja de gestores: todos los tickets del tenant con filtros combinables.
[HttpGet]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_ALL")]
public Task<IActionResult> GetInbox(int pageNumber = 1, int pageSize = 20, TicketStatus? status = null, int? categoryId = null, Guid? assigneeUserId = null, string? search = null)
Parameters
pageNumberintpageSizeintstatusTicketStatus?categoryIdint?assigneeUserIdGuid?searchstring
Returns
- Task<IActionResult>
GetMine(int, int, TicketStatus?)
[HttpGet("mine")]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_OWN")]
public Task<IActionResult> GetMine(int pageNumber = 1, int pageSize = 20, TicketStatus? status = null)
Parameters
pageNumberintpageSizeintstatusTicketStatus?
Returns
- Task<IActionResult>
Transition(Guid, TransitionTicketRequest)
Cambia el estado del ticket. Policy base ViewOwn (la tienen todos los roles activos): la regla real — Tickets.Transition, EXCEPTO el solicitante cancelando su propio ticket Open — se resuelve en el handler vía ICurrentUser.HasPermission.
[HttpPost("{id:guid}/transition")]
[Authorize(Policy = "HELPDESK_TICKETS_VIEW_OWN")]
public Task<IActionResult> Transition(Guid id, TicketsController.TransitionTicketRequest request)
Parameters
idGuidrequestTicketsController.TransitionTicketRequest
Returns
- Task<IActionResult>