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