Files
CMS/src/CMSMicroservice.Application/ClubMembershipCQ/Commands/ActivateClubMembership/ActivateClubMembershipCommandHandler.cs

99 lines
3.7 KiB
C#

namespace CMSMicroservice.Application.ClubMembershipCQ.Commands.ActivateClubMembership;
public class ActivateClubMembershipCommandHandler : IRequestHandler<ActivateClubMembershipCommand, long>
{
private readonly IApplicationDbContext _context;
private readonly ICurrentUserService _currentUser;
public ActivateClubMembershipCommandHandler(
IApplicationDbContext context,
ICurrentUserService currentUser)
{
_context = context;
_currentUser = currentUser;
}
public async Task<long> Handle(ActivateClubMembershipCommand request, CancellationToken cancellationToken)
{
// بررسی وجود کاربر
var userExists = await _context.Users
.AnyAsync(x => x.Id == request.UserId, cancellationToken);
if (!userExists)
{
throw new NotFoundException(nameof(User), request.UserId);
}
// دریافت مبلغ عضویت از Configuration
var activationFeeConfig = await _context.SystemConfigurations
.Where(x => x.Key == "Club.ActivationFee" && x.IsActive)
.Select(x => x.Value)
.FirstOrDefaultAsync(cancellationToken);
long initialContribution = long.Parse(activationFeeConfig ?? "25000000"); // Default: 25 million Rials
// بررسی عضویت فعلی
var existingMembership = await _context.ClubMemberships
.FirstOrDefaultAsync(x => x.UserId == request.UserId, cancellationToken);
ClubMembership entity;
bool isNewMembership = existingMembership == null;
var activationDate = request.ActivationDate ?? DateTimeOffset.Now; // استفاده از Local Time
if (isNewMembership)
{
// ایجاد عضویت جدید
// توجه: InitialContribution فقط ثبت می‌شود، از کیف پول کسر نمی‌شود!
// کاربر قبلاً باید کیف پول خود را شارژ کرده باشد
entity = new ClubMembership
{
UserId = request.UserId,
IsActive = true,
ActivatedAt = activationDate.DateTime,
InitialContribution = initialContribution, // مبلغ عضویت از Configuration
TotalEarned = 0
};
await _context.ClubMemberships.AddAsync(entity, cancellationToken);
}
else
{
// فعال‌سازی مجدد عضویت موجود
entity = existingMembership;
if (entity.IsActive)
{
// اگر از قبل فعال است، فقط تاریخ را به‌روز می‌کنیم
entity.ActivatedAt = activationDate.DateTime;
}
else
{
// فعال‌سازی عضویت غیرفعال
entity.IsActive = true;
entity.ActivatedAt = activationDate.DateTime;
}
_context.ClubMemberships.Update(entity);
}
await _context.SaveChangesAsync(cancellationToken);
// ثبت تاریخچه
var history = new ClubMembershipHistory
{
ClubMembershipId = entity.Id,
UserId = entity.UserId,
OldIsActive = !isNewMembership && !existingMembership!.IsActive,
NewIsActive = true,
Action = ClubMembershipAction.Activated,
Reason = request.Reason ?? (isNewMembership ? "Initial activation" : "Reactivated"),
PerformedBy = _currentUser.GetPerformedBy()
};
await _context.ClubMembershipHistories.AddAsync(history, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);
return entity.Id;
}
}