public async Task <Either <ActionResult, PublicationViewModel> > UpdatePublication( Guid publicationId, SavePublicationViewModel updatedPublication) { return(await _persistenceHelper .CheckEntityExists <Publication>(publicationId) .OnSuccess(_userService.CheckCanUpdatePublication) .OnSuccessDo(_ => ValidateSelectedTopic(updatedPublication.TopicId)) .OnSuccessDo(_ => ValidateSelectedMethodology( updatedPublication.MethodologyId, updatedPublication.ExternalMethodology )) .OnSuccess(async publication => { if (publication.Live) { // Leave slug return publication; } return (await ValidatePublicationSlugUniqueForUpdate(publication.Id, updatedPublication.Slug)).Map(_ => { publication.Slug = updatedPublication.Slug; return publication; }); }) .OnSuccess(async publication => { publication.Title = updatedPublication.Title; publication.TopicId = updatedPublication.TopicId; publication.MethodologyId = updatedPublication.MethodologyId; publication.ExternalMethodology = updatedPublication.ExternalMethodology; publication.Updated = DateTime.UtcNow; // Add new contact if it doesn't exist, otherwise replace existing // contact that is shared with another publication with a new // contact, as we want each publication to have its own contact. if (publication.Contact == null || _context.Publications .Any(p => p.ContactId == publication.ContactId && p.Id != publication.Id)) { publication.Contact = new Contact(); } publication.Contact.ContactName = updatedPublication.Contact.ContactName; publication.Contact.ContactTelNo = updatedPublication.Contact.ContactTelNo; publication.Contact.TeamName = updatedPublication.Contact.TeamName; publication.Contact.TeamEmail = updatedPublication.Contact.TeamEmail; _context.Publications.Update(publication); await _context.SaveChangesAsync(); if (publication.Live) { await _publishingService.PublicationChanged(publication.Id); } return await GetViewModel(publication.Id); })); }