Пример #1
0
 public async Task <ActionResult <ReleaseViewModel> > UpdateRelease(UpdateReleaseViewModel request,
                                                                    Guid releaseId)
 {
     return(await _releaseService
            .UpdateRelease(releaseId, request)
            .HandleFailuresOrOk());
 }
Пример #2
0
        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);
                });
            }));
        }