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();
            }
        }
Exemple #2
0
        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();
            }
        }
Exemple #4
0
        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();
            }
        }
Exemple #5
0
        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();
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        public void JoinMember(string id, [FromBody] CircleJoinMemberRequestModel request)
        {
            var command = new CircleJoinCommand(id, request.AddUserId);

            circleApplicationService.Join(command);
        }