using GozareshgirProgramManager.Application._Common.Interfaces; using GozareshgirProgramManager.Application._Common.Models; using GozareshgirProgramManager.Domain._Common; using GozareshgirProgramManager.Domain.UserAgg.Entities; using GozareshgirProgramManager.Domain.UserAgg.Repositories; using MediatR; using Microsoft.EntityFrameworkCore; namespace GozareshgirProgramManager.Application.Modules.Users.Commands.LoginUser; /// /// Handler برای ورود کاربر به سیستم /// public class LoginUserCommandHandler : IRequestHandler> { private readonly IUserRepository _userRepository; private readonly IUserRefreshTokenRepository _refreshTokenRepository; private readonly IAuthHelper _authHelper; private readonly IUnitOfWork _unitOfWork; public LoginUserCommandHandler( IUserRepository userRepository, IAuthHelper authHelper, IUnitOfWork unitOfWork, IUserRefreshTokenRepository refreshTokenRepository) { _userRepository = userRepository; _authHelper = authHelper; _unitOfWork = unitOfWork; _refreshTokenRepository = refreshTokenRepository; } public async Task> Handle(LoginUserCommand request, CancellationToken cancellationToken) { // اعتبارسنجی if (request.UserId <= 0) { return OperationResult.Failure("شناسه کاربری معتبر نیست", ErrorType.BadRequest); } // یافتن کاربر var user = await _userRepository.GetUserWithRolesByIdAsync(request.UserId, cancellationToken); if (user == null) { return OperationResult.Failure("کاربر یافت نشد", ErrorType.NotFound); } // بررسی فعال بودن کاربر if (!user.IsActive) { return OperationResult.Failure("حساب کاربری غیرفعال است", ErrorType.Unauthorized); } // تولید توکن‌ها با استفاده از AuthHelper var roles = user.RoleUser .Select(r => r.RoleId.ToString()).ToList(); var session = _authHelper.SignIn( user.Id, user.UserName, user.FullName, user.AccountId??0, roles); // دریافت اطلاعات درخواست با استفاده از AuthHelper var ipAddress = _authHelper.GetClientIpAddress(); var userAgent = _authHelper.GetUserAgent(); // ذخیره Refresh Token در دیتابیس //user.AddRefreshToken(refreshToken, refreshTokenExpiration, ipAddress, userAgent); var refreshTokenEntity = new UserRefreshToken( user.Id, session.RefreshToken, session.RefreshTokenExpiration, ipAddress, userAgent); await _refreshTokenRepository.CreateAsync(refreshTokenEntity); await _unitOfWork.SaveChangesAsync(cancellationToken); // ساخت پاسخ (RefreshToken به فرانت داده نمی‌شود) var response = new LoginResponse { AccessToken = session.AccessToken, ExpiresAt = session.AccessTokenExpiration, UserId = user.Id, FullName = user.FullName, UserName = user.UserName, Roles = user.RoleUser.Select(r => r.RoleId).ToList() }; return OperationResult.Success(response); } }