using Indotalent.ConfigBackEnd.Extensions; using Indotalent.Features.Payroll.Payrolls.Cqrs; using Indotalent.Features.Payroll.PayrollDetails.Cqrs; using MediatR; using Microsoft.AspNetCore.Authentication.JwtBearer; namespace Indotalent.Features.Payroll.Payrolls; public static class PayrollsEndpoint { public static void MapPayrollsEndpoints(this IEndpointRouteBuilder app) { var group = app.MapGroup("/payroll").WithTags("Payrolls") .RequireAuthorization(policy => policy.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme) .RequireAuthenticatedUser()); group.MapGet("/", async (IMediator mediator) => { var result = await mediator.Send(new GetPayrollProcessListQuery(new GetPayrollProcessListRequest())); return result.ToApiResponse("Payroll processes retrieved successfully"); }) .WithName("GetPayrollProcessList"); group.MapGet("/{id}", async (string id, IMediator mediator) => { var result = await mediator.Send(new GetPayrollProcessByIdQuery(new GetPayrollProcessByIdRequest { Id = id })); return result.ToApiResponse(result is not null ? "Payroll process detail retrieved successfully" : $"Payroll process with ID {id} not found"); }) .WithName("GetPayrollProcessById"); group.MapPost("/", async (CreatePayrollProcessRequest request, IMediator mediator) => { var result = await mediator.Send(new CreatePayrollProcessCommand(request)); return result.ToApiResponse("Payroll calculation completed successfully", StatusCodes.Status201Created); }) .WithName("CreatePayrollProcess"); group.MapPost("/update", async (UpdatePayrollProcessRequest request, IMediator mediator) => { var result = await mediator.Send(new UpdatePayrollProcessCommand(request)); return result.ToApiResponse("Payroll process updated successfully"); }) .WithName("UpdatePayrollProcess"); group.MapPost("/delete/{id}", async (string id, IMediator mediator) => { var result = await mediator.Send(new DeletePayrollProcessByIdCommand(new DeletePayrollProcessByIdRequest { Id = id })); return true.ToApiResponse("Payroll process deleted successfully"); }) .WithName("DeletePayrollProcessById"); group.MapGet("/detail/list/{processId}", async (string processId, IMediator mediator) => { var result = await mediator.Send(new GetPayrollDetailListByProcessIdQuery(new GetPayrollDetailListByProcessIdRequest { PayrollProcessId = processId })); return result.ToApiResponse("Payroll employee details retrieved successfully"); }) .WithName("GetPayrollDetailListByProcessId"); group.MapGet("/detail/{id}", async (string id, IMediator mediator) => { var result = await mediator.Send(new GetPayrollDetailByIdQuery(new GetPayrollDetailByIdRequest { Id = id })); return result.ToApiResponse("Employee payroll component detail retrieved successfully"); }) .WithName("GetPayrollDetailById"); group.MapGet("/detail/slip/{id}", async (string id, IMediator mediator) => { var result = await mediator.Send(new GetPayrollSlipByIdQuery(new GetPayrollSlipByIdRequest { Id = id })); return result.ToApiResponse("Payroll slip retrieved successfully"); }) .WithName("GetPayrollSlipById"); } }