Пример #1
0
        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());
        }
Пример #2
0
        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());
        }