Example #1
0
        /// <summary>
        ///     Ensures the process chain of uploading Product info: file upload,process, validation, mapping, address validation,
        ///     warehouse creation, output file generation
        ///     Updates upload status after each step completes
        /// </summary>
        /// <param name="input"></param>
        public void Upload(FileUploadInput input)
        {
            if (input == null) throw new ArgumentNullException("input");

            var uploadStatus = new UploadStatus(input.UploadTraceToken);
            _logger.Information(string.Format("Upload initiated for file: {0}, by {1}", input.FileName,
                input.UserContext));
            try
            {
                //Initiate upload
                UpdateStatus(uploadStatus, UploadStageEnum.UploadInitiated, "Initiating upload process...");
                //Upload file to temp directory
                UpdateStatus(uploadStatus, UploadStageEnum.FileUploadStart, "File upload to temp directory started...");
                FileUploadResult fileUploadResult = FileUpload(input);
                UpdateStatus(uploadStatus, UploadStageEnum.FileUploadEnd, "File upload to temp directory completed.");
                if (fileUploadResult.ValidationResult.HasViolations)
                {
                    UpdateStatus(uploadStatus, UploadStageEnum.UploadCompleted,
                        "Unable to complete upload process. " +
                        fileUploadResult.ValidationResult.ValidationErrors.First().Message);
                    return;
                }
                // Load File Data into memory
                UpdateStatus(uploadStatus, UploadStageEnum.FileProcessStart, "Load file data into memory started...");
                FileProcessResult<ProductInputRow> fileProcessResult =
                    FileProcess(new FileProcessInput(input.UserContext)
                    {
                        FileName = fileUploadResult.TempFileName,
                        FilePath = fileUploadResult.TempFilePath
                    });
                UpdateStatus(uploadStatus, UploadStageEnum.FileProcessEnd, "Load file data into memory completed.");
                if (fileProcessResult.ValidationResult.HasViolations)
                {
                    UpdateStatus(uploadStatus, UploadStageEnum.UploadCompleted,
                        "Unable to complete upload process. " +
                        fileProcessResult.ValidationResult.ValidationErrors.First().Message);
                    return;
                }
                // Validate data
                UpdateStatus(uploadStatus, UploadStageEnum.FileDataValidateStart, "File  data validation started...");
                FileDataValidateResult<ProductInputRow> fileDataValidateResult =
                    FileDataValidate(new FileDataValidateInput<ProductInputRow>(input.UserContext)
                    {
                        FileData = fileProcessResult.FileData
                    });
                FileDataProcessResult<ProductInputRow> fileDataProcessResult = null;
                if (fileDataValidateResult.ValidationResult.HasViolations)
                {
                    UpdateStatus(uploadStatus, UploadStageEnum.FileDataValidateEnd,
                        "File data validation completed. " +
                        fileDataValidateResult.ValidationResult.ValidationErrors.First().Message);
                }
                else
                {
                    UpdateStatus(uploadStatus, UploadStageEnum.FileDataValidateEnd, "File data validation completed.");
                }
                //process data if ready
                if (fileDataValidateResult.ReadyForUpload)
                {
                    UpdateStatus(uploadStatus, UploadStageEnum.FileDataProcessStart, "File data processing started...");
                    fileDataProcessResult =
                        FileDataProcess(new FileDataProcessInput<ProductInputRow>(input.UserContext)
                        {
                            FileData = fileDataValidateResult.FileData
                        });
                    if (fileDataProcessResult.ValidationResult.HasViolations)
                    {
                        UpdateStatus(uploadStatus, UploadStageEnum.FileDataProcessEnd,
                            "File data processing completed. " +
                            fileDataProcessResult.ValidationResult.ValidationErrors.First().Message);
                    }
                    else
                    {
                        UpdateStatus(uploadStatus, UploadStageEnum.FileDataProcessEnd, "File data processing completed.");
                    }
                }

                UpdateStatus(uploadStatus, UploadStageEnum.OutputFileProcessStart, "Output file generation started...");
                OutputFileProcessResult outputFileProcessResult =
                    OutputFileProcess(new OutputFileProcessInput<ProductInputRow>(input.UserContext)
                    {
                        TempFileName = fileUploadResult.TempFileName,
                        TempFilePath = fileUploadResult.TempFilePath,
                        ProcessedFileData =
                            fileDataProcessResult == null
                                ? fileDataValidateResult.FileData
                                : fileDataProcessResult.FileData,
                        HeadersCount = fileProcessResult.HeadersCount
                    });
                UpdateStatus(uploadStatus, UploadStageEnum.OutputFileProcessEnd, "Output file generation completed.");
                UpdateStatus(uploadStatus, UploadStageEnum.UploadCompleted, "Upload process completed.",
                    outputFileProcessResult.OutputFileInfo);
            }
            catch (Exception e)
            {
                UpdateStatus(uploadStatus, UploadStageEnum.UploadCompleted,
                    "Unable to complete upload process. An unexpected error has occurred.");
                _logger.Fatal("Unable to complete upload process. User context: " + input.UserContext, e);
            }
        }
Example #2
0
 private void UpdateStatus(UploadStatus uploadStatus, UploadStageEnum step, string message,
     object stageOutput = null)
 {
     uploadStatus.CurrentUploadStage = new UploadStage
     {
         Stage = step,
         Message = string.Format("{0} - {1}", DateTime.Now.ToString("hh:mm:ss"), message),
         StageOutput = stageOutput
     };
     _cacher.Set(uploadStatus.TraceToken, uploadStatus, 60);
     _logger.Information(message);
 }