GetStatesForReinstatingAfterPossibleRetry(ReleasePublishingStatus releasePublishingStatus)
        {
            var startingState = releasePublishingStatus.Immediate
                ? ReleasePublishingStatusStates.ImmediateReleaseStartedState
                : ReleasePublishingStatusStates.ScheduledReleaseStartedState;

            var existingState = releasePublishingStatus.State;

            var publishingCancelled = existingState.Publishing == ReleasePublishingStatusPublishingStage.Cancelled;
            var overallFailed       = existingState.Overall == ReleasePublishingStatusOverallStage.Failed;

            var contentOk = existingState.Content == ReleasePublishingStatusContentStage.Complete ||
                            releasePublishingStatus.Immediate && existingState.Content == startingState.Content;
            var filesOk = existingState.Files == ReleasePublishingStatusFilesStage.Complete;
            var dataOk  = existingState.Data == ReleasePublishingStatusDataStage.Complete;

            var reinstate = publishingCancelled &&
                            overallFailed &&
                            contentOk &&
                            filesOk &&
                            dataOk;

            var newPublishingState = reinstate
                 ? startingState.Publishing
                 : existingState.Publishing;

            var newOverallState = reinstate
                ? startingState.Overall
                : existingState.Overall;

            return(newPublishingState, newOverallState);
        }
        public async Task <ReleasePublishingStatus> CreateAsync(Guid releaseId, Guid releaseStatusId, ReleasePublishingStatusState state, bool immediate,
                                                                IEnumerable <ReleasePublishingStatusLogMessage> logMessages = null)
        {
            var release = await GetReleaseAsync(releaseId);

            var table = await GetTableAsync();

            var publish       = immediate ? null : release.PublishScheduled;
            var releaseStatus = new ReleasePublishingStatus(release.Publication.Slug, publish, release.Id,
                                                            releaseStatusId, release.Slug, state, immediate, logMessages);
            var tableResult = await table.ExecuteAsync(TableOperation.Insert(releaseStatus));

            return(tableResult.Result as ReleasePublishingStatus);
        }
 private async Task UpdateStage(ReleasePublishingStatus releasePublishingStatus, ReleasePublishingStatusPublishingStage stage,
                                ReleasePublishingStatusLogMessage?logMessage = null)
 {
     await _releasePublishingStatusService.UpdatePublishingStageAsync(releasePublishingStatus.ReleaseId, releasePublishingStatus.Id, stage,
                                                                      logMessage);
 }