85 lines
2.9 KiB
C#
85 lines
2.9 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);
|
||
|
|
}
|
||
|
|
|
||
|
|
// بررسی عضویت فعلی
|
||
|
|
var existingMembership = await _context.ClubMemberships
|
||
|
|
.FirstOrDefaultAsync(x => x.UserId == request.UserId, cancellationToken);
|
||
|
|
|
||
|
|
ClubMembership entity;
|
||
|
|
bool isNewMembership = existingMembership == null;
|
||
|
|
var activationDate = request.ActivationDate ?? DateTimeOffset.UtcNow;
|
||
|
|
|
||
|
|
if (isNewMembership)
|
||
|
|
{
|
||
|
|
// ایجاد عضویت جدید
|
||
|
|
entity = new ClubMembership
|
||
|
|
{
|
||
|
|
UserId = request.UserId,
|
||
|
|
IsActive = true,
|
||
|
|
ActivatedAt = activationDate.DateTime,
|
||
|
|
InitialContribution = 0,
|
||
|
|
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;
|
||
|
|
}
|
||
|
|
}
|