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