namespace CMSMicroservice.Application.ClubMembershipCQ.Commands.ActivateClubMembership; public class ActivateClubMembershipCommandHandler : IRequestHandler { private readonly IApplicationDbContext _context; public ActivateClubMembershipCommandHandler(IApplicationDbContext context) { _context = context; } public async Task 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; } }