public async Task <ActionResult <ReleaseViewModel> > UpdateRelease(UpdateReleaseViewModel request, Guid releaseId) { return(await _releaseService .UpdateRelease(releaseId, request) .HandleFailuresOrOk()); }
public async Task <Either <ActionResult, ReleaseViewModel> > UpdateRelease( Guid releaseId, UpdateReleaseViewModel request) { return(await _persistenceHelper .CheckEntityExists <Release>(releaseId, ReleaseChecklistService.HydrateReleaseForChecklist) .OnSuccess(_userService.CheckCanUpdateRelease) .OnSuccessDo(release => _userService.CheckCanUpdateReleaseStatus(release, request.Status)) .OnSuccessDo(async release => await ValidateReleaseSlugUniqueToPublication(request.Slug, release.PublicationId, releaseId)) .OnSuccess(async release => { if (request.Status != ReleaseStatus.Approved && release.Published.HasValue) { return ValidationActionResult(PublishedReleaseCannotBeUnapproved); } if (request.Status == ReleaseStatus.Approved && request.PublishMethod == PublishMethod.Scheduled && !request.PublishScheduledDate.HasValue) { return ValidationActionResult(ApprovedReleaseMustHavePublishScheduledDate); } release.Slug = request.Slug; release.TypeId = request.TypeId; release.ReleaseName = request.ReleaseName; release.TimePeriodCoverage = request.TimePeriodCoverage; release.PreReleaseAccessList = request.PreReleaseAccessList; var oldStatus = release.Status; release.Status = request.Status; release.InternalReleaseNote = request.InternalReleaseNote; release.NextReleaseDate = request.NextReleaseDate; release.PublishScheduled = request.PublishMethod == PublishMethod.Immediate && request.Status == ReleaseStatus.Approved ? DateTime.UtcNow : request.PublishScheduledDate; return await ValidateReleaseWithChecklist(release) .OnSuccess(async() => { _context.Releases.Update(release); await _context.SaveChangesAsync(); // Only need to inform Publisher if changing release status to or from Approved if (oldStatus == ReleaseStatus.Approved || request.Status == ReleaseStatus.Approved) { await _publishingService.ReleaseChanged( releaseId, request.PublishMethod == PublishMethod.Immediate ); } _context.Update(release); await _context.SaveChangesAsync(); return await GetRelease(releaseId); }); })); }