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); } }
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); } } }