99 lines
3.6 KiB
C#
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);
|
|
}
|
|
}
|
|
|