using DXPBLL.Auth; using DXPDAL.Common; using DXPSL.Parameters.Auth; using FastEndpoints; using GB5Shared.DTO.Framework.Enum; using GB5Shared.DTO.Framework.ResponseStandard; namespace DXPSL.Endpoints.Auth; // Anonymous — this is the credential check itself. public class Login : Endpoint> { private readonly IAuthBLL _bll; private readonly IDXPSystemContext _systemContext; public Login(IAuthBLL bll, IDXPSystemContext systemContext) { _bll = bll; _systemContext = systemContext; } public override void Configure() { Post("/DXP/Auth/Login"); AllowAnonymous(); } public override async Task HandleAsync(LoginParameters req, CancellationToken ct) { try { var result = await _bll.LoginAsync( req.Email, req.Password, req.DeviceInfo, _systemContext.GetSystemLogin(), ct); await Send.ResponseAsync(new ResponseStandardDTO { Status = FrameworkEnumDTO.ResponseStatus.Ok, Body = result }, cancellation: ct); } catch (InvalidOperationException ex) { // Deliberately generic — never reveal whether the email exists. await Send.ResponseAsync(new ResponseStandardDTO { Status = FrameworkEnumDTO.ResponseStatus.Failed, ErrorBody = ex.Message }, statusCode: 401, cancellation: ct); } } }