Files
Backend-Api/ProgramManager/src/Application/GozareshgirProgramManager.Application/Modules/Users/Commands/LoginUser/LoginUserCommandHandler.cs

99 lines
3.6 KiB
C#

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;
/// <summary>
/// Handler برای ورود کاربر به سیستم
/// </summary>
public class LoginUserCommandHandler : IRequestHandler<LoginUserCommand, OperationResult<LoginResponse>>
{
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<OperationResult<LoginResponse>> Handle(LoginUserCommand request, CancellationToken cancellationToken)
{
// اعتبارسنجی
if (request.UserId <= 0)
{
return OperationResult<LoginResponse>.Failure("شناسه کاربری معتبر نیست", ErrorType.BadRequest);
}
// یافتن کاربر
var user = await _userRepository.GetUserWithRolesByIdAsync(request.UserId, cancellationToken);
if (user == null)
{
return OperationResult<LoginResponse>.Failure("کاربر یافت نشد", ErrorType.NotFound);
}
// بررسی فعال بودن کاربر
if (!user.IsActive)
{
return OperationResult<LoginResponse>.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<LoginResponse>.Success(response);
}
}