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