Files
CMS/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/RemoveFromNetwork/RemoveFromNetworkCommandHandler.cs

70 lines
2.4 KiB
C#
Raw Normal View History

namespace CMSMicroservice.Application.NetworkMembershipCQ.Commands.RemoveFromNetwork;
public class RemoveFromNetworkCommandHandler : IRequestHandler<RemoveFromNetworkCommand, Unit>
{
private readonly IApplicationDbContext _context;
public RemoveFromNetworkCommandHandler(IApplicationDbContext context)
{
_context = context;
}
public async Task<Unit> Handle(RemoveFromNetworkCommand request, CancellationToken cancellationToken)
{
// بررسی وجود کاربر
var user = await _context.Users
.FirstOrDefaultAsync(x => x.Id == request.UserId, cancellationToken);
if (user == null)
{
throw new NotFoundException(nameof(User), request.UserId);
}
// بررسی اینکه کاربر در شبکه باشد
if (!user.NetworkParentId.HasValue)
{
// اگر قبلاً حذف شده، هیچ کاری نکن (Idempotent)
return Unit.Value;
}
// بررسی وجود فرزندان
var hasChildren = await _context.Users
.AnyAsync(x => x.NetworkParentId == request.UserId, cancellationToken);
if (hasChildren)
{
throw new InvalidOperationException(
$"کاربر با شناسه {request.UserId} دارای فرزند در شبکه است. ابتدا باید فرزندان جابجا یا حذف شوند");
}
// ذخیره مقادیر قبلی برای History
var oldParentId = user.NetworkParentId;
var oldLegPosition = user.LegPosition;
// حذف از شبکه (Soft Delete)
user.NetworkParentId = null;
user.LegPosition = null;
_context.Users.Update(user);
await _context.SaveChangesAsync(cancellationToken);
// ثبت تاریخچه
var history = new NetworkMembershipHistory
{
UserId = request.UserId,
OldParentId = oldParentId,
NewParentId = null,
OldLegPosition = oldLegPosition,
NewLegPosition = null,
Action = NetworkMembershipAction.Remove,
Reason = request.Reason ?? "حذف از شبکه",
PerformedBy = "System" // TODO: باید از Current User گرفته شود
};
await _context.NetworkMembershipHistories.AddAsync(history, cancellationToken);
await _context.SaveChangesAsync(cancellationToken);
return Unit.Value;
}
}