diff --git a/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommand.cs b/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommand.cs
new file mode 100644
index 0000000..3da1d9e
--- /dev/null
+++ b/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommand.cs
@@ -0,0 +1,27 @@
+namespace CMSMicroservice.Application.NetworkMembershipCQ.Commands.JoinNetwork;
+
+///
+/// Command برای افزودن کاربر به شبکه دوتایی (Binary Network)
+///
+public record JoinNetworkCommand : IRequest
+{
+ ///
+ /// شناسه کاربر که میخواهد به شبکه بپیوندد
+ ///
+ public long UserId { get; init; }
+
+ ///
+ /// شناسه والد در شبکه (Sponsor/Parent)
+ ///
+ public long ParentId { get; init; }
+
+ ///
+ /// موقعیت در شبکه (Left یا Right)
+ ///
+ public NetworkLeg LegPosition { get; init; }
+
+ ///
+ /// دلیل/یادداشت (اختیاری)
+ ///
+ public string? Reason { get; init; }
+}
diff --git a/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommandHandler.cs b/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommandHandler.cs
new file mode 100644
index 0000000..69521b2
--- /dev/null
+++ b/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommandHandler.cs
@@ -0,0 +1,80 @@
+namespace CMSMicroservice.Application.NetworkMembershipCQ.Commands.JoinNetwork;
+
+public class JoinNetworkCommandHandler : IRequestHandler
+{
+ private readonly IApplicationDbContext _context;
+
+ public JoinNetworkCommandHandler(IApplicationDbContext context)
+ {
+ _context = context;
+ }
+
+ public async Task Handle(JoinNetworkCommand 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)
+ {
+ throw new InvalidOperationException($"کاربر با شناسه {request.UserId} قبلاً در شبکه عضو شده است");
+ }
+
+ // بررسی وجود والد
+ var parent = await _context.Users
+ .FirstOrDefaultAsync(x => x.Id == request.ParentId, cancellationToken);
+
+ if (parent == null)
+ {
+ throw new NotFoundException(nameof(User), $"Parent with Id {request.ParentId}");
+ }
+
+ // بررسی والد خودش در شبکه باشد (یا Root باشد)
+ if (!parent.NetworkParentId.HasValue && parent.Id != 1) // فرض: UserId=1 همیشه Root
+ {
+ throw new InvalidOperationException($"والد با شناسه {request.ParentId} خودش در شبکه عضو نیست");
+ }
+
+ // بررسی خالی بودن Leg موردنظر
+ var legOccupied = await _context.Users
+ .AnyAsync(x => x.NetworkParentId == request.ParentId && x.LegPosition == request.LegPosition,
+ cancellationToken);
+
+ if (legOccupied)
+ {
+ throw new InvalidOperationException(
+ $"موقعیت {request.LegPosition} زیر والد {request.ParentId} قبلاً پر شده است");
+ }
+
+ // افزودن به شبکه
+ user.NetworkParentId = request.ParentId;
+ user.LegPosition = request.LegPosition;
+
+ _context.Users.Update(user);
+ await _context.SaveChangesAsync(cancellationToken);
+
+ // ثبت تاریخچه
+ var history = new NetworkMembershipHistory
+ {
+ UserId = request.UserId,
+ OldParentId = null,
+ NewParentId = request.ParentId,
+ OldLegPosition = null,
+ NewLegPosition = request.LegPosition,
+ Action = NetworkMembershipAction.Join,
+ Reason = request.Reason ?? "عضویت در شبکه",
+ PerformedBy = "System" // TODO: باید از Current User گرفته شود
+ };
+
+ await _context.NetworkMembershipHistories.AddAsync(history, cancellationToken);
+ await _context.SaveChangesAsync(cancellationToken);
+
+ return Unit.Value;
+ }
+}
diff --git a/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommandValidator.cs b/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommandValidator.cs
new file mode 100644
index 0000000..533502d
--- /dev/null
+++ b/src/CMSMicroservice.Application/NetworkMembershipCQ/Commands/JoinNetwork/JoinNetworkCommandValidator.cs
@@ -0,0 +1,37 @@
+namespace CMSMicroservice.Application.NetworkMembershipCQ.Commands.JoinNetwork;
+
+public class JoinNetworkCommandValidator : AbstractValidator
+{
+ public JoinNetworkCommandValidator()
+ {
+ RuleFor(x => x.UserId)
+ .GreaterThan(0)
+ .WithMessage("شناسه کاربر معتبر نیست");
+
+ RuleFor(x => x.ParentId)
+ .GreaterThan(0)
+ .WithMessage("شناسه والد معتبر نیست");
+
+ RuleFor(x => x.LegPosition)
+ .IsInEnum()
+ .WithMessage("موقعیت شبکه باید Left یا Right باشد");
+
+ RuleFor(x => x.Reason)
+ .MaximumLength(500)
+ .WithMessage("طول دلیل نباید بیشتر از 500 کاراکتر باشد")
+ .When(x => !string.IsNullOrEmpty(x.Reason));
+ }
+
+ public Func