/// <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); } }
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); }