using Indotalent.ConfigFrontEnd.Service; using Indotalent.Data.Entities; using Indotalent.Infrastructure.Authentication.Identity; using MediatR; using Microsoft.AspNetCore.Identity; using Microsoft.Extensions.Options; namespace Indotalent.Features.Account.Login.Cqrs; public class LoginRequest { public string Email { get; set; } = string.Empty; public string Password { get; set; } = string.Empty; public bool RememberMe { get; set; } } public class LoginResponse { public bool Succeeded { get; set; } public string Message { get; set; } = string.Empty; public bool IsNotAllowed { get; set; } public string? Token { get; set; } public string? RefreshToken { get; set; } } public record LoginCommand(LoginRequest Data) : IRequest; public class LoginHandler : IRequestHandler { private readonly SignInManager _signInManager; private readonly UserManager _userManager; private readonly JwtSettingsModel _jwtSettings; public LoginHandler( SignInManager signInManager, UserManager userManager, IOptions jwtSettings) { _signInManager = signInManager; _userManager = userManager; _jwtSettings = jwtSettings.Value; } public async Task Handle(LoginCommand request, CancellationToken cancellationToken) { var user = await _userManager.FindByEmailAsync(request.Data.Email); if (user == null) return new LoginResponse { Succeeded = false, Message = "Invalid credentials" }; var result = await _signInManager.PasswordSignInAsync(user, request.Data.Password, request.Data.RememberMe, false); if (result.Succeeded) { var token = JwtService.GenerateNewJwt(user, _jwtSettings); var refreshToken = Guid.NewGuid().ToString().Replace("-", ""); user.RefreshToken = refreshToken; user.LastLoginAt = DateTime.Now; await _userManager.UpdateAsync(user); return new LoginResponse { Succeeded = true, Message = "Login successful", Token = token, RefreshToken = refreshToken }; } return new LoginResponse { Succeeded = false, Message = "Invalid credentials" }; } }