public async Task <IEnumerable <BulkRegisterOdsInstancesResult> > Execute(IEnumerable <IRegisterOdsInstanceModel> odsInstances, IEnumerable <IRegisterOdsInstanceModel> filteredDataRecords, ApiMode mode, string userId, CloudOdsClaimSet cloudOdsClaimSet = null) { var results = new List <BulkRegisterOdsInstancesResult>(); var dataRecords = odsInstances.ToList(); var recordsToProcess = filteredDataRecords.ToList(); if (!recordsToProcess.Any()) { recordsToProcess = _dataFiltrationService.FilteredRecords(dataRecords, mode).ToList(); } var skippedRecords = dataRecords.Except(recordsToProcess); foreach (var skippedInstance in skippedRecords) { results.Add(new BulkRegisterOdsInstancesResult { NumericSuffix = skippedInstance.NumericSuffix.ToString(), Description = skippedInstance.Description, IndividualInstanceResult = IndividualInstanceResult.Skipped }); _logger.Info($"Ods instance({skippedInstance.NumericSuffix.ToString()}) was skipped because it was previously registered."); } foreach (var instance in recordsToProcess) { try { var odsInstanceRegisteredId = await _registerOdsInstanceCommand.Execute(instance, mode, userId, cloudOdsClaimSet); results.Add(new BulkRegisterOdsInstancesResult { NumericSuffix = instance.NumericSuffix.ToString(), Description = instance.Description, IndividualInstanceResult = IndividualInstanceResult.Succeded, OdsInstanceRegisteredId = odsInstanceRegisteredId }); _logger.Info($"Ods instance({instance.NumericSuffix.ToString()}) registered successfully."); } catch (Exception ex) { results.Add(new BulkRegisterOdsInstancesResult { NumericSuffix = instance.NumericSuffix.ToString(), Description = instance.Description, IndividualInstanceResult = IndividualInstanceResult.Failed, ErrorMessage = ex.Message }); _logger.Error($"Ods instance({instance.NumericSuffix.ToString()}) registration failed. Error: {ex.Message}"); } } return(results); }
public BulkRegisterOdsInstancesModelValidator(AdminAppDbContext database , ICloudOdsAdminAppSettingsApiModeProvider apiModeProvider , IDatabaseValidationService databaseValidationService , IDatabaseConnectionProvider databaseConnectionProvider , IBulkRegisterOdsInstancesFiltrationService dataFilterService) { var mode = apiModeProvider.GetApiMode(); RuleFor(m => m.OdsInstancesFile) .NotEmpty(); RuleFor(m => m.OdsInstancesFile.FileName).NotNull().Must(x => x.ToLower().EndsWith(".csv")) .WithMessage("Please select a file with .csv format."); When(m => m.OdsInstancesFile != null, () => { RuleFor(m => m).SafeCustom(HaveValidHeaders); }); When(m => m.OdsInstancesFile != null && !ValidHeadersRuleFailed, () => { RuleFor(m => m).SafeCustom(HaveUniqueRecords); }); When( m => m.OdsInstancesFile != null && !UniquenessRuleFailed && !ValidHeadersRuleFailed, () => { RuleFor(x => x) .SafeCustom( (model, context) => { var validator = new RegisterOdsInstanceModelValidator( database, apiModeProvider, databaseValidationService, databaseConnectionProvider, true); var newOdsInstancesToRegister = dataFilterService.FilteredRecords(model.DataRecords(), mode).ToList(); model.FilteredDataRecords = newOdsInstancesToRegister; foreach (var record in newOdsInstancesToRegister) { var data = (RegisterOdsInstanceModel)record; var results = validator.Validate(data); if (!results.IsValid) { foreach (var failure in results.Errors) { _logger.Error($"Property: {failure.PropertyName} failed validation. Error: {failure.ErrorMessage}"); } } context.AddFailures(results); } }); }); }