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

85 lines
2.9 KiB
C#
Raw Normal View History

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;
}
}