public void Join(CircleJoinCommand command) { using (var transaction = new TransactionScope()) { var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "사용자를 찾지 못했음"); } var id = new CircleId(command.CircleId); var circle = circleRepository.Find(id); if (circle == null) { throw new CircleNotFoundException(id, "서클을 찾지 못했음"); } // 서클에 소속된 사용자가 서클장을 포함 30명 이하인지 확인 if (circle.Members.Count >= 29) { throw new CircleFullException(id); } // 가입 처리 circle.Members.Add(member); circleRepository.Save(circle); transaction.Complete(); } }
public void Join(CircleJoinCommand command) { using (var transaction = new TransactionScope()) { var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "ユーザが見つかりませんでした。"); } var id = new CircleId(command.CircleId); var circle = circleRepository.Find(id); if (circle == null) { throw new CircleNotFoundException(id, "サークルが見つかりませんでした。"); } // サークルのオーナーを含めて30名か確認 if (circle.Members.Count >= 29) { throw new CircleFullException(id); } // メンバーを追加する circle.Members.Add(member); circleRepository.Save(circle); transaction.Complete(); } }
public void Join(CircleJoinCommand command) { using (var transaction = new TransactionScope()) { var memberId = new UserId(command.MemberId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "서클에 가입할 사용자를 찾지 못했음"); } var id = new CircleId(command.CircleId); var circle = circleRepository.Find(id); if (circle == null) { throw new CircleNotFoundException(id, "가입할 서클을 찾지 못했음"); } var fullSpec = new CircleFullSpecification(userRepository); if (fullSpec.IsSatisfiedBy(circle)) { throw new CircleFullException(id, "서클에 소속 가능한 최대 인원을 초과함"); } circle.Join(member, fullSpec); circleRepository.Save(circle); transaction.Complete(); } }
public void Join(CircleJoinCommand command) { using (var transaction = new TransactionScope()) { var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "사용자를 찾지 못했음"); } var id = new CircleId(command.CircleId); var circle = circleRepository.Find(id); if (circle == null) { throw new CircleNotFoundException(id, "서클을 찾지 못했음"); } if (circle.IsFull()) { throw new CircleFullException(id); } circle.Join(member); circleRepository.Save(circle); transaction.Complete(); } }
public void Join(CircleJoinCommand command) { var circleId = new CircleId(command.CircleId); var circle = circleRepository.Find(circleId); var users = userRepository.Find(circle.Members); // サークルに所属しているプレミアムユーザの人数により上限が変わる var premiumUserNumber = users.Count(user => user.IsPremium); var circleUpperLimit = premiumUserNumber < 10 ? 30 : 50; if (circle.CountMembers() >= circleUpperLimit) { throw new CircleFullException(circleId); } var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "ユーザが見つかりませんでした。"); } circle.Join(member); circleRepository.Save(circle); }
public void Join(CircleJoinCommand command) { var circleId = new CircleId(command.CircleId); var circle = circleRepository.Find(circleId); var owner = userRepository.Find(circle.Owner); var members = userRepository.Find(circle.Members); var circleMembers = new CircleMembers(circle.Id, owner, members); var circleFullSpec = new CircleMembersFullSpecification(); if (circleFullSpec.IsSatisfiedBy(circleMembers)) { throw new CircleFullException(circleId); } var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "사용자를 찾지 못했음"); } circle.Join(member); circleRepository.Save(circle); }
public void Join(CircleJoinCommand command) { using (var transaction = new TransactionScope()) { var memberId = new UserId(command.MemberId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "ユーザが見つかりませんでした。"); } var id = new CircleId(command.CircleId); var circle = circleRepository.Find(id); if (circle == null) { throw new CircleNotFoundException(id, "サークルが見つかりませんでした。"); } var fullSpec = new CircleFullSpecification(userRepository); if (fullSpec.IsSatisfiedBy(circle)) { throw new CircleFullException(id, "サークルに所属しているメンバーが上限に達しています。"); } circle.Join(member, fullSpec); circleRepository.Save(circle); transaction.Complete(); } }
public void Join(CircleJoinCommand command) { var circleId = new CircleId(command.CircleId); var circle = circleRepository.Find(circleId); var users = userRepository.Find(circle.Members); // 서클에 소속된 프리미엄 사용자의 수에 따라 최대 인원이 결정됨 var premiumUserNumber = users.Count(user => user.IsPremium); var circleUpperLimit = premiumUserNumber < 10 ? 30 : 50; if (circle.CountMembers() >= circleUpperLimit) { throw new CircleFullException(circleId); } var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "사용자를 찾지 못했음"); } circle.Join(member); circleRepository.Save(circle); }
public void Join(CircleJoinCommand command) { using var transaction = new TransactionScope(); var circleId = new CircleId(command.CircleId); var circle = _circleRepository.Find(circleId); if (circle == null) { throw new CircleNotFoundException(circleId, "サークルが見つかりませんでした。"); } // 複雑な仕様:対処方法その1 // var circleFullSpecification = new CircleFullSpecification(_userRepository); // if (circleFullSpecification.IsSatisfiedBy(circle)) // { // throw new CircleFullException(circle.Id); // } // 複雑な仕様:対処方法その2 // ファーストコレクションクラスを利用する場合 // ドメインオブジェクトで userRepository を使わずに済む(入出力をドメインオブジェクトから排除できた) var owner = _userRepository.Find(circle.Owner); var members = _userRepository.Find(circle.Members); var circleMembers = new CircleMembers(circle.Id, owner, members); var circleMembersFullSpecification = new CircleMembersFullSpecification(); if (circleMembersFullSpecification.IsSatisfiedBy(circleMembers)) { throw new CircleFullException(circleId); } var memberId = new UserId(command.UserId); var member = _userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "ユーザーが見つかりませんでした。"); } circle.Join(member); _circleRepository.Save(circle); transaction.Complete(); }
public void Join(CircleJoinCommand command) { var circleId = new CircleId(command.CircleId); var circle = circleRepository.Find(circleId); var circleFullSpecification = new CircleFullSpecification(userRepository); if (circleFullSpecification.IsSatisfiedBy(circle)) { throw new CircleFullException(circleId); } var memberId = new UserId(command.UserId); var member = userRepository.Find(memberId); if (member == null) { throw new UserNotFoundException(memberId, "ユーザが見つかりませんでした。"); } circle.Join(member); circleRepository.Save(circle); }
public void JoinMember(string id, [FromBody] CircleJoinMemberRequestModel request) { var command = new CircleJoinCommand(id, request.AddUserId); circleApplicationService.Join(command); }