public async Task <IActionResult> Submit([FromBody] Models.MeasureSubmissionViewModel data) { if (User.Identity.IsAuthenticated == false) { return(BadRequest(new Models.ApiErrorResult("User must be authenticated to view measures."))); } if (data == null) { return(BadRequest(new Models.ApiErrorResult("Invalid measure data."))); } if (!User.Claims.Any(cl => cl.Type == Identity.Claims.SubmitMeasure_Key)) { return(BadRequest(new Models.ApiErrorResult("The user does not have permission to submit measures."))); } List <string> errors = new List <string>(); if (!ValidateSubmission(data, errors)) { return(BadRequest(new { errors })); } var user = await _modelDB.Users.FindAsync(Guid.Parse(User.Claims.Where(x => x.Type == ClaimTypes.NameIdentifier).Select(x => x.Value).FirstOrDefault())); MeasurementMeta measure = new MeasurementMeta { CommonDataModel = data.CommonDataModel, DatabaseSystem = data.DatabaseSystem, DataSource = data.DataSource, DataSourceID = data.DataSourceID, DateRangeEnd = data.DateRangeEnd.Value, DateRangeStart = data.DateRangeStart.Value, MetricID = data.MetricID.Value, Network = data.Network, Organization = data.Organization, OrganizationID = data.OrganizationID, RunDate = data.RunDate.Value, SubmittedByID = user.ID, SubmittedOn = DateTime.UtcNow, CommonDataModelVersion = data.CommonDataModelVersion, ResultsDelimiter = data.ResultsDelimiter, ResultsTypeID = await _modelDB.MetricResultTypes.Where(rt => rt.Metrics.Any(m => m.ID == data.MetricID.Value)).Select(rt => rt.ID).FirstOrDefaultAsync(), SupportingResources = data.SupportingResources }; measure.Measurements = new HashSet <Measurement>(data.Measures.Select(i => new Measurement { MetadataID = measure.ID, RawValue = i.RawValue, Definition = string.IsNullOrEmpty(i.Definition) ? i.RawValue : i.Definition, Measure = i.Measure.HasValue ? i.Measure.Value : 0f, Total = i.Total }).ToArray()); _modelDB.MeasurementMeta.Add(measure); await _modelDB.SaveChangesAsync(); return(Ok()); }
public async Task <IActionResult> AcceptMeasure([FromRoute] string fileUid) { if (User.Identity.IsAuthenticated == false) { return(BadRequest(new Models.ApiErrorResult("User must be authenticated to view measures."))); } if (!User.Claims.Any(cl => cl.Type == Identity.Claims.SubmitMeasure_Key)) { return(BadRequest(new Models.ApiErrorResult("The user does not have permission to submit measures."))); } try { var user = await _modelDB.Users.FindAsync(Guid.Parse(User.Claims.Where(x => x.Type == ClaimTypes.NameIdentifier).Select(x => x.Value).FirstOrDefault())); Models.MeasureSubmissionViewModel import; using (var stream = _fileService.ReturnTempFileStream(fileUid)) using (var sr = new System.IO.StreamReader(stream)) using (var jr = new Newtonsoft.Json.JsonTextReader(sr)) { var serializer = new Newtonsoft.Json.JsonSerializer(); serializer.DateFormatString = "yyyy'-'MM'-'dd"; import = serializer.Deserialize <Models.MeasureSubmissionViewModel>(jr); } MeasurementMeta measure = new MeasurementMeta { CommonDataModel = import.CommonDataModel, DatabaseSystem = import.DatabaseSystem, DataSource = import.DataSource, DataSourceID = import.DataSourceID, DateRangeEnd = import.DateRangeEnd.Value, DateRangeStart = import.DateRangeStart.Value, MetricID = import.MetricID.Value, Network = import.Network, Organization = import.Organization, OrganizationID = import.OrganizationID, RunDate = import.RunDate.Value, SubmittedByID = user.ID, SubmittedOn = DateTime.UtcNow, CommonDataModelVersion = import.CommonDataModelVersion, ResultsDelimiter = import.ResultsDelimiter, ResultsTypeID = await _modelDB.MetricResultTypes.Where(rt => rt.Metrics.Any(m => m.ID == import.MetricID.Value)).Select(rt => rt.ID).FirstOrDefaultAsync(), SupportingResources = import.SupportingResources }; measure.Measurements = new HashSet <Measurement>(import.Measures.Select(i => new Measurement { MetadataID = measure.ID, RawValue = i.RawValue, Definition = string.IsNullOrEmpty(i.Definition) ? i.RawValue : i.Definition, Measure = i.Measure.HasValue ? i.Measure.Value : 0f, Total = i.Total }).ToArray()); _modelDB.MeasurementMeta.Add(measure); await _modelDB.SaveChangesAsync(); } catch (Exception ex) { _logger.LogError(ex, "There was an error procesing the Measure upload with fileUid of:" + fileUid); BadRequest(new Models.ApiErrorResult("There was an error processing the Measure.")); } finally { try { await _fileService.DeleteTempFileChunkAsync(fileUid); } catch (Exception ex) { //do not throw since either the save of the measure failed which will require a reupload anyhow, or the cleanup failed and the service will handle in a couple of hours. _logger.LogError(ex, "There was an error deleting the temp file for the Measure upload with fileUid of:" + fileUid); } } return(Ok()); }