public async Task DeleteRelationships(Guid memoryBookUniverseId, IList <Guid> relationshipIds)
        {
            Contract.RequiresNotNull(relationshipIds, nameof(relationshipIds));

            foreach (var relationshipId in relationshipIds)
            {
                RelationshipReadModel relationship = (await this.relationshipProvider
                                                      .GetRelationships(memoryBookUniverseId, new List <Guid> {
                    relationshipId
                })
                                                      .ConfigureAwait(false))?.FirstOrDefault();

                if (relationship == null)
                {
                    throw new InvalidOperationException($"Relationship with id {relationshipId} did not exist!");
                }

                IList <RelationshipMembershipReadModel> existingMembers = await this.relationshipMemberProvider
                                                                          .GetRelationshipMembershipsForRelationshipAsync(memoryBookUniverseId, relationshipId)
                                                                          .ConfigureAwait(false);

                if (existingMembers.Any())
                {
                    await this.relationshipMemberProvider
                    .DeleteRelationshipMembershipAsync(memoryBookUniverseId, existingMembers)
                    .ConfigureAwait(false);
                }

                await this.relationshipProvider.DeleteRelationships(memoryBookUniverseId, relationshipId)
                .ConfigureAwait(false);
            }
        }
Esempio n. 2
0
        public static CombinedRelationshipReadModel ToViewModel(
            this RelationshipReadModel readModel,
            IDictionary <Guid, MemberReadModel> membersDictionary,
            IDictionary <Guid, IList <RelationshipMembershipReadModel> > memberToRelationshipsDictionary,
            IDictionary <Guid, RelationshipTypeReadModel> relationshipTypeDictionary,
            IDictionary <Guid, List <DetailViewModel> > relationshipDetailsDictionary)
        {
            IList <CombinedRelationshipMemberReadModel> relationshipMembers = new List <CombinedRelationshipMemberReadModel>();

            foreach (Guid memberId in readModel.MembershipIds)
            {
                var member                 = membersDictionary[memberId];
                var memberMembership       = memberToRelationshipsDictionary[memberId].FirstOrDefault(x => x.RelationshipId == readModel.Id);
                var memberRelationshipType = relationshipTypeDictionary[memberMembership.MemberRelationshipTypeId];

                relationshipMembers.Add(new CombinedRelationshipMemberReadModel
                {
                    MemberId  = memberId,
                    StartDate = memberMembership.StartDate,
                    EndDate   = memberMembership.EndDate,
                    Id        = memberMembership.Id,
                    MemberRelationshipTypeCode = memberRelationshipType.Code,
                    MemberRelationshipTypeId   = memberRelationshipType.Id
                });
            }

            return(new CombinedRelationshipReadModel
            {
                Id = readModel.Id,
                StartDate = readModel.StartDate,
                EndDate = readModel.EndDate,
                RelationshipMembers = relationshipMembers,
                Details = relationshipDetailsDictionary.ContainsKey(readModel.Id) ? relationshipDetailsDictionary[readModel.Id] : new List <DetailViewModel>()
            });
        }
        public async Task UpdateRelationships(Guid memoryBookUniverseId, IList <CombinedRelationshipUpdateModel> updateModels)
        {
            Contract.RequiresNotNull(updateModels, nameof(updateModels));

            foreach (var updateModel in updateModels)
            {
                IList <CombinedRelationshipMemberCreateModel> inputModelRelationshipMembers = updateModel.RelationshipMembers;
                Contract.RequiresNotNull(inputModelRelationshipMembers, nameof(inputModelRelationshipMembers));

                if (inputModelRelationshipMembers.Count < 2)
                {
                    throw new ArgumentException("Relationship must have at least two members.");
                }

                RelationshipReadModel relationship = (await this.relationshipProvider
                                                      .GetRelationships(memoryBookUniverseId, new List <Guid> {
                    updateModel.Id
                })
                                                      .ConfigureAwait(false))?.FirstOrDefault();

                if (relationship == null)
                {
                    throw new InvalidOperationException($"Relationship with id {updateModel.Id} did not exist!");
                }

                await this.relationshipProvider.UpdateRelationship(memoryBookUniverseId, updateModel.Id, updateModel.StartDate, updateModel.EndDate)
                .ConfigureAwait(false);

                IList <RelationshipMembershipReadModel> existingMembers = await this.relationshipMemberProvider
                                                                          .GetRelationshipMembershipsForRelationshipAsync(memoryBookUniverseId, updateModel.Id)
                                                                          .ConfigureAwait(false);

                List <Guid> existingMemberIds   = existingMembers.Select(x => x.MemberId).ToList();
                List <Guid> inputModelMemberIds = inputModelRelationshipMembers.Select(x => x.MemberId).ToList();

                List <CombinedRelationshipMemberCreateModel> newMembers      = inputModelRelationshipMembers.Where(x => !existingMemberIds.Contains(x.MemberId)).ToList();
                List <RelationshipMembershipReadModel>       membersToUpdate = existingMembers.Where(x => inputModelMemberIds.Contains(x.MemberId)).ToList();
                List <RelationshipMembershipReadModel>       membersToDelete = existingMembers.Where(x => !inputModelMemberIds.Contains(x.MemberId)).ToList();

                if (newMembers.Any())
                {
                    await this.relationshipMemberProvider
                    .CreateRelationshipMembershipAsync(updateModel.Id, newMembers, updateModel.StartDate,
                                                       updateModel.EndDate)
                    .ConfigureAwait(false);
                }

                if (membersToUpdate.Any())
                {
                    await this.relationshipMemberProvider
                    .UpdateRelationshipMembershipAsync(memoryBookUniverseId, membersToUpdate, updateModel.StartDate, updateModel.EndDate)
                    .ConfigureAwait(false);
                }

                if (membersToDelete.Any())
                {
                    await this.relationshipMemberProvider
                    .DeleteRelationshipMembershipAsync(memoryBookUniverseId, membersToDelete)
                    .ConfigureAwait(false);
                }
            }
        }