/// <summary>
        /// Requests the club membership.
        /// </summary>
        /// <param name="playerId">The player identifier.</param>
        /// <param name="golfClubId">The golf club identifier.</param>
        /// <param name="cancellationToken">The cancellation token.</param>
        /// <returns></returns>
        /// <exception cref="InvalidDataException">
        /// Unable to request club membership for a player that has not been registered
        /// or
        /// Unable to request club membership for a club that has not been created
        /// </exception>
        public async Task RequestClubMembership(Guid playerId, Guid golfClubId, CancellationToken cancellationToken)
        {
            // Rehydrate the golf club membership aggregate
            GolfClubMembershipAggregate golfClubMembershipAggregate =
                await this.GolfClubMembershipRepository.GetLatestVersion(golfClubId, cancellationToken);

            // Validate the player id firstly
            PlayerAggregate playerAggregate = await this.PlayerRepository.GetLatestVersion(playerId, cancellationToken);

            if (!playerAggregate.HasBeenRegistered)
            {
                throw new InvalidDataException("Unable to request club membership for a player that has not been registered");
            }

            // Now validate the club
            GolfClubAggregate golfClubAggregate =
                await this.GolfClubRepository.GetLatestVersion(golfClubId, cancellationToken);

            if (!golfClubAggregate.HasBeenCreated)
            {
                throw new InvalidDataException("Unable to request club membership for a club that has not been created");
            }

            // Ok all the data has been validated, now run through the aggregate rules
            golfClubMembershipAggregate.RequestMembership(playerId,
                                                          playerAggregate.FullName,
                                                          playerAggregate.DateOfBirth,
                                                          playerAggregate.Gender,
                                                          DateTime.Now);

            // Save any pending changes
            await this.GolfClubMembershipRepository.SaveChanges(golfClubMembershipAggregate, cancellationToken);
        }
Esempio n. 2
0
        public void GolfClubMembershipAggregate_RequestMembership_PlayerToYoung_RequestRejected()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            // Get the lowest valid age
            DateTime dateOfBirth = DateTime.Now.AddYears(-13);

            // Now add a day to make it invalid
            dateOfBirth = dateOfBirth.AddDays(1);

            aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                        GolfClubMembershipTestData.PlayerFullName,
                                        dateOfBirth,
                                        GolfClubMembershipTestData.PlayerGender,
                                        GolfClubMembershipTestData.RequestDateAndTime);

            MembershipDataTransferObject membership = aggregate.GetMembership(GolfClubMembershipTestData.PlayerId, dateOfBirth, GolfClubMembershipTestData.PlayerGender);

            membership.MembershipId.ShouldNotBe(Guid.Empty);
            membership.PlayerId.ShouldBe(GolfClubMembershipTestData.PlayerId);
            membership.PlayerFullName.ShouldBe(GolfClubMembershipTestData.PlayerFullName);
            membership.PlayerDateOfBirth.ShouldBe(dateOfBirth);
            membership.PlayerGender.ShouldBe(GolfClubMembershipTestData.PlayerGender);
            membership.RejectedDateAndTime.ShouldBe(GolfClubMembershipTestData.RequestDateAndTime);
            membership.AcceptedDateAndTime.ShouldBe(DateTime.MinValue);
            membership.RejectionReason.ShouldBe($"Player Id {GolfClubMembershipTestData.PlayerId} is too young.");
            membership.Status.ShouldBe(2);
        }
        public async Task SignUpPlayerForTournament(Guid tournamentId,
                                                    Guid playerId, CancellationToken cancellationToken)
        {
            // Validate the tournament Id
            TournamentAggregate tournament = await this.TournamentRepository.GetLatestVersion(tournamentId, cancellationToken);

            PlayerAggregate player = await this.PlayerRepository.GetLatestVersion(playerId, cancellationToken);

            if (!player.HasBeenRegistered)
            {
                throw new InvalidOperationException("A player must be registered to sign up for a club tournament");
            }

            try
            {
                GolfClubMembershipAggregate golfClubMembership = await this.ClubMembershipRepository.GetLatestVersion(tournament.GolfClubId, cancellationToken);

                golfClubMembership.GetMembership(player.AggregateId, player.DateOfBirth, player.Gender);
            }
            catch (NotFoundException nex)
            {
                throw new InvalidOperationException("A player must be a member of the club to sign up for a club tournament");
            }

            tournament.SignUpForTournament(playerId);

            await this.TournamentRepository.SaveChanges(tournament, cancellationToken);
        }
Esempio n. 4
0
        public void GolfClubMembershipAggregate_CanBeCreated_IsCreated()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipAggregate.Create(GolfClubMembershipTestData.AggregateId);

            aggregate.ShouldNotBeNull();
            aggregate.AggregateId.ShouldBe(GolfClubMembershipTestData.AggregateId);
        }
Esempio n. 5
0
 public void GolfClubMembershipAggregate_CanBeCreated_EmptyAggregateId_ErrorThrown()
 {
     Should.Throw <ArgumentNullException>(() =>
     {
         GolfClubMembershipAggregate aggregate = GolfClubMembershipAggregate.Create(Guid.Empty);
     });
 }
Esempio n. 6
0
        public void GolfClubMembershipAggregate_GetMemberships_MembershipsReturned()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregateWithMultipleMembershipRequested();

            List <MembershipDataTransferObject> memberships = aggregate.GetMemberships();

            memberships.Count.ShouldBe(2);
        }
Esempio n. 7
0
        public static GolfClubMembershipAggregate GetCreatedGolfClubMembershipAggregateWithMembershipRequested()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipAggregate.Create(AggregateId);

            aggregate.RequestMembership(PlayerId, PlayerFullName, PlayerDateOfBirth, PlayerGender, RequestDateAndTime);

            return(aggregate);
        }
Esempio n. 8
0
        public void GolfClubMembershipAggregate_GetMemberships_NoMemberships_ErrorThrown()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            Should.Throw <NotFoundException>(() =>
            {
                aggregate.GetMemberships();
            });
        }
Esempio n. 9
0
        public void GolfClubMembershipAggregate_GetMembership_NoMemberships_ErrorThrown()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            Should.Throw <NotFoundException>(() =>
            {
                aggregate.GetMembership(GolfClubMembershipTestData.PlayerId,
                                        GolfClubMembershipTestData.PlayerDateOfBirth,
                                        GolfClubMembershipTestData.PlayerGender);
            });
        }
Esempio n. 10
0
        public static GolfClubMembershipAggregate GetCreatedGolfClubMembershipAggregateWithNumberOfAcceptedMembershipRequests(Int32 memberCount)
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipAggregate.Create(AggregateId);

            for (Int32 i = 0; i < memberCount; i++)
            {
                aggregate.RequestMembership(Guid.NewGuid(), $"Player {i}", PlayerDateOfBirth, PlayerGender, RequestDateAndTime);
            }

            return(aggregate);
        }
        public async Task <IActionResult> GetGolfClub([FromRoute] Guid golfClubId,
                                                      [FromQuery] Boolean includeMemberships,
                                                      CancellationToken cancellationToken)
        {
            GolfClubAggregate golfClub = await this.GolfClubRepository.GetLatestVersion(golfClubId, cancellationToken);

            if (!golfClub.HasBeenCreated)
            {
                return(this.NotFound($"Golf Club not found with Id {golfClubId}"));
            }

            // Translate to Developer DTO
            DeveloperGetGolfClubResponse response = new DeveloperGetGolfClubResponse
            {
                AddressLine1    = golfClub.AddressLine1,
                Name            = golfClub.Name,
                Town            = golfClub.Town,
                Website         = golfClub.Website,
                Region          = golfClub.Region,
                TelephoneNumber = golfClub.TelephoneNumber,
                EmailAddress    = golfClub.EmailAddress,
                PostalCode      = golfClub.PostalCode,
                AggregateId     = golfClub.AggregateId,
                AddressLine2    = golfClub.AddressLine2,
                HasBeenCreated  = golfClub.HasBeenCreated
            };

            if (includeMemberships)
            {
                GolfClubMembershipAggregate golfClubMemberships = await this.GolfClubMembershipRepository.GetLatestVersion(golfClubId, cancellationToken);

                List <MembershipDataTransferObject> memberships = golfClubMemberships.GetMemberships();

                memberships.ForEach(m =>
                {
                    response.GolfClubMemberships.Add(new GolfClubMembershipResponse
                    {
                        AcceptedDateAndTime = m.AcceptedDateAndTime,
                        MembershipId        = m.MembershipId,
                        MembershipNumber    = m.MembershipNumber,
                        PlayerDateOfBirth   = m.PlayerDateOfBirth,
                        PlayerFullName      = m.PlayerFullName,
                        PlayerGender        = m.PlayerGender,
                        PlayerId            = m.PlayerId,
                        RejectedDateAndTime = m.RejectedDateAndTime,
                        RejectionReason     = m.RejectionReason,
                        Status = m.Status
                    });
                });
            }

            return(this.Ok(response));
        }
Esempio n. 12
0
        public void GolfClubMembershipAggregate_RequestMembership_DuplicatePlayerMembershipRequest_RequestRejected()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregateWithMembershipRequested();

            Should.Throw <InvalidOperationException>(() =>
            {
                aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                            GolfClubMembershipTestData.PlayerFullName,
                                            GolfClubMembershipTestData.PlayerDateOfBirth,
                                            GolfClubMembershipTestData.PlayerGender,
                                            GolfClubMembershipTestData.RequestDateAndTime);
            });
        }
Esempio n. 13
0
        public void GolfClubMembershipAggregate_RequestMembership_InvalidData_ErrorThrown(Boolean validPlayerId,
                                                                                          String playerFullName,
                                                                                          Boolean validDateOfBirth,
                                                                                          String playerGender,
                                                                                          Type exceptionType)
        {
            Guid     playerId    = validPlayerId ? GolfClubMembershipTestData.PlayerId : Guid.Empty;
            DateTime dateOfBirth = validDateOfBirth ? GolfClubMembershipTestData.PlayerDateOfBirth : DateTime.MinValue;

            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            Should.Throw(() => { aggregate.RequestMembership(playerId, playerFullName, dateOfBirth, playerGender, GolfClubMembershipTestData.RequestDateAndTime); },
                         exceptionType);
        }
Esempio n. 14
0
        public void GolfClubMembershipAggregate_GetMembership_MembershipReturned()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregateWithMembershipRequested();

            MembershipDataTransferObject membership = aggregate.GetMembership(GolfClubMembershipTestData.PlayerId, GolfClubMembershipTestData.PlayerDateOfBirth, GolfClubMembershipTestData.PlayerGender);

            membership.MembershipId.ShouldNotBe(Guid.Empty);
            membership.PlayerId.ShouldBe(GolfClubMembershipTestData.PlayerId);
            membership.PlayerFullName.ShouldBe(GolfClubMembershipTestData.PlayerFullName);
            membership.PlayerDateOfBirth.ShouldBe(GolfClubMembershipTestData.PlayerDateOfBirth);
            membership.PlayerGender.ShouldBe(GolfClubMembershipTestData.PlayerGender);
            membership.AcceptedDateAndTime.ShouldBe(GolfClubMembershipTestData.RequestDateAndTime);
            membership.RejectedDateAndTime.ShouldBe(DateTime.MinValue);
            membership.RejectionReason.ShouldBeNullOrEmpty();
            membership.Status.ShouldBe(1);
        }
Esempio n. 15
0
        public void GolfClubMembershipAggregate_RequestMembership_MembershipRequested()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregate();

            aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                        GolfClubMembershipTestData.PlayerFullName,
                                        GolfClubMembershipTestData.PlayerDateOfBirth,
                                        GolfClubMembershipTestData.PlayerGender,
                                        GolfClubMembershipTestData.RequestDateAndTime);

            MembershipDataTransferObject membership = aggregate.GetMembership(GolfClubMembershipTestData.PlayerId,
                                                                              GolfClubMembershipTestData.PlayerDateOfBirth,
                                                                              GolfClubMembershipTestData.PlayerGender);

            membership.MembershipId.ShouldNotBe(Guid.Empty);
            membership.PlayerId.ShouldBe(GolfClubMembershipTestData.PlayerId);
            membership.PlayerFullName.ShouldBe(GolfClubMembershipTestData.PlayerFullName);
            membership.PlayerDateOfBirth.ShouldBe(GolfClubMembershipTestData.PlayerDateOfBirth);
            membership.PlayerGender.ShouldBe(GolfClubMembershipTestData.PlayerGender);
            membership.AcceptedDateAndTime.ShouldBe(GolfClubMembershipTestData.RequestDateAndTime);
            membership.AcceptedDateAndTime.ShouldNotBe(DateTime.MinValue);
            membership.MembershipNumber.ShouldBe("000001");
            membership.Status.ShouldBe(1);
        }
Esempio n. 16
0
        public void GolfClubMembershipAggregate_RequestMembership_NoSpaceForNewMembers_RequestRejected()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipTestData.GetCreatedGolfClubMembershipAggregateWithNumberOfAcceptedMembershipRequests(500);

            aggregate.RequestMembership(GolfClubMembershipTestData.PlayerId,
                                        GolfClubMembershipTestData.PlayerFullName,
                                        GolfClubMembershipTestData.PlayerDateOfBirth,
                                        GolfClubMembershipTestData.PlayerGender,
                                        GolfClubMembershipTestData.RequestDateAndTime);

            MembershipDataTransferObject membership = aggregate.GetMembership(GolfClubMembershipTestData.PlayerId,
                                                                              GolfClubMembershipTestData.PlayerDateOfBirth,
                                                                              GolfClubMembershipTestData.PlayerGender);

            membership.MembershipId.ShouldNotBe(Guid.Empty);
            membership.PlayerId.ShouldBe(GolfClubMembershipTestData.PlayerId);
            membership.PlayerFullName.ShouldBe(GolfClubMembershipTestData.PlayerFullName);
            membership.PlayerDateOfBirth.ShouldBe(GolfClubMembershipTestData.PlayerDateOfBirth);
            membership.PlayerGender.ShouldBe(GolfClubMembershipTestData.PlayerGender);
            membership.RejectedDateAndTime.ShouldBe(GolfClubMembershipTestData.RequestDateAndTime);
            membership.AcceptedDateAndTime.ShouldBe(DateTime.MinValue);
            membership.RejectionReason.ShouldBe($"No more space at club for Player Id {GolfClubMembershipTestData.PlayerId}");
            membership.Status.ShouldBe(2);
        }
Esempio n. 17
0
        public static GolfClubMembershipAggregate GetCreatedGolfClubMembershipAggregate()
        {
            GolfClubMembershipAggregate aggregate = GolfClubMembershipAggregate.Create(GolfClubMembershipTestData.AggregateId);

            return(aggregate);
        }