public async Task <ActionResult> Review(BulkActionReviewRequest request)
        {
            var userName = HttpContext.User.Identity.Name;
            var report   = await _reportService.Validate(new TransformalizeRequest(request.ReportContentItemId, userName));

            if (report.Fails())
            {
                return(report.ActionResult);
            }

            var taskNames    = _settingsService.GetBulkActionTaskNames(report.Part);
            var batchSummary = await _taskService.Validate(new TransformalizeRequest(taskNames.Summary, HttpContext.User.Identity.Name) { Secure = false });

            if (batchSummary.Fails())
            {
                return(batchSummary.ActionResult);
            }

            await _taskService.RunAsync(batchSummary.Process);

            var bulkAction = await _formService.ValidateParameters(new TransformalizeRequest(request.TaskContentItemId, HttpContext.User.Identity.Name));

            if (bulkAction.Fails())
            {
                return(bulkAction.ActionResult);
            }

            return(View(new BulkActionViewModel(TransferRequiredParameters(request, bulkAction), batchSummary.Process)));
        }
        public async Task <ActionResult> Form(BulkActionReviewRequest request)
        {
            var bulkAction = await _formService.ValidateParameters(new TransformalizeRequest(request.TaskContentItemId, HttpContext.User.Identity.Name));

            if (bulkAction.Fails())
            {
                return(bulkAction.ActionResult);
            }

            return(View("Form", TransferRequiredParameters(request, bulkAction).Process));
        }
        private static TransformalizeResponse <TransformalizeTaskPart> TransferRequiredParameters(BulkActionReviewRequest request, TransformalizeResponse <TransformalizeTaskPart> response)
        {
            var existing = new HashSet <string>(response.Process.Parameters.Select(p => p.Name));

            if (!existing.Contains(Common.TaskReferrer))
            {
                response.Process.Parameters.Add(new Parameter {
                    Name = Common.TaskReferrer, Value = request.TaskReferrer
                });
            }

            if (!existing.Contains(Common.TaskContentItemId))
            {
                response.Process.Parameters.Add(new Parameter {
                    Name = Common.TaskContentItemId, Value = request.TaskContentItemId
                });
            }

            if (!existing.Contains(Common.ReportContentItemId))
            {
                response.Process.Parameters.Add(new Parameter {
                    Name = Common.ReportContentItemId, Value = request.ReportContentItemId
                });
            }

            return(response);
        }
        public async Task <ActionResult> Run(BulkActionReviewRequest request)
        {
            var user = HttpContext.User.Identity.Name;

            var report = await _reportService.Validate(new TransformalizeRequest(request.ReportContentItemId, user));

            if (report.Fails())
            {
                return(report.ActionResult);
            }

            var taskNames = _settingsService.GetBulkActionTaskNames(report.Part);

            var bulkAction = await _taskService.Validate(new TransformalizeRequest(request.TaskContentItemId, user));

            if (bulkAction.Fails())
            {
                return(bulkAction.ActionResult);
            }

            await _taskService.RunAsync(bulkAction.Process);

            var recordsAffected = bulkAction.Process.Actions.Where(a => a.RowCount > 0).Sum(a => a.RowCount) + bulkAction.Process.Entities.Where(a => a.Hits > 0).Sum(e => e.Hits);
            var closeParameters = new Dictionary <string, string>()
            {
                { "RecordsAffected", recordsAffected.ToString() }
            };

            if (bulkAction.Process.Status == 200)
            {
                var batchSuccess = await _taskService.Validate(new TransformalizeRequest(taskNames.Success, user) { InternalParameters = closeParameters });

                if (batchSuccess.Fails())
                {
                    _logger.Warn(() => $"{bulkAction.ContentItem.DisplayText} succeeded but {taskNames.Success} failed to load.");
                }
                else
                {
                    await _taskService.RunAsync(batchSuccess.Process);
                }
            }
            else
            {
                var message = new StringBuilder(bulkAction.Process.Message);
                foreach (var error in _logger.Log.Where(l => l.LogLevel == Transformalize.Contracts.LogLevel.Error))
                {
                    message.AppendLine(error.Message);
                }
                closeParameters["Message"] = message.ToString();
                var batchFail = await _taskService.Validate(new TransformalizeRequest(taskNames.Fail, user) { InternalParameters = closeParameters });

                if (batchFail.Fails())
                {
                    _logger.Warn(() => $"{bulkAction.ContentItem.DisplayText} failed and {taskNames.Fail} failed to load.");
                }
                else
                {
                    await _taskService.RunAsync(batchFail.Process);
                }
            }

            TransferRequiredParameters(request, bulkAction);

            return(RedirectToAction("Result", ParametersToRouteValues(bulkAction.Process.Parameters.Where(p => p.Input))));
        }