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;
public ActivateClubMembershipCommandHandler(IApplicationDbContext context)
{
_context = context;
}
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 membershipPrice = await _context.SystemConfigurations
.Where(x => x.Key == "club_membership_price" && x.IsActive)
.Select(x => x.Value)
.FirstOrDefaultAsync(cancellationToken);
long initialContribution = 25_000_000; // Default: 25 million Rials
if (!string.IsNullOrEmpty(membershipPrice) && long.TryParse(membershipPrice, out var parsedPrice))
{
initialContribution = parsedPrice;
}
// بررسی عضویت فعلی
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 = "System" // TODO: باید از Current User گرفته شود
};
await _context.ClubMembershipHistories.AddAsync(history, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);
return entity.Id;
}
}