Example #1
0
        public async Task <QuerySaveResult> InitialSaveAsync(QuerySave query)
        {
            var urn        = QueryUrn.Create(query.QueryId);
            var conceptids = query.Resources.Concepts.Select(c => c.Id.Value).Where(c => c != Guid.Empty);
            var queryids   = query.Resources.Queries.Select(q => q.Id.Value);

            using (var cn = new SqlConnection(dbOpts.ConnectionString))
            {
                await cn.OpenAsync();

                var qsr = await cn.QueryFirstOrDefaultAsync <QuerySaveResultRecord>(
                    initialQuerySave,
                    new
                {
                    queryid    = query.QueryId,
                    urn        = urn.ToString(),
                    name       = query.Name,
                    category   = query.Category,
                    conceptids = ResourceIdTable.From(conceptids),
                    queryids   = ResourceIdTable.From(queryids),
                    definition = query.Definition,
                    user       = user.UUID
                },
                    commandType : CommandType.StoredProcedure,
                    commandTimeout : dbOpts.DefaultTimeout
                    );

                if (qsr == null)
                {
                    return(null);
                }

                return(new QuerySaveResult(query.QueryId, QueryUrn.From(qsr.UniversalId), qsr.Ver));
            }
        }
Example #2
0
 async Task <QuerySaveResult> ImplSaveAsync(QuerySave query)
 {
     if (query.UniversalId == null)
     {
         return(await service.InitialSaveAsync(query));
     }
     return(await service.UpsertSaveAsync(query));
 }
Example #3
0
 public async Task <QuerySaveResult> Save(QuerySave query)
 {
     if (query.UniversalId == null)
     {
         return(await InitialSave(query));
     }
     return(await UpsertSave(query));
 }
Example #4
0
        async Task <QuerySaveResult> UpsertSave(QuerySave query)
        {
            var conceptids = query.Resources.Concepts.Select(c => c.Id.Value);
            var queryids   = query.Resources.Queries.Select(q => q.Id.Value);

            try
            {
                using (var cn = new SqlConnection(dbOpts.ConnectionString))
                {
                    await cn.OpenAsync();

                    var qsr = await cn.QueryFirstOrDefaultAsync <QuerySaveResultRecord>(
                        upsertQuerySave,
                        new
                    {
                        queryid    = query.QueryId,
                        urn        = query.UniversalId.ToString(),
                        ver        = query.Ver,
                        name       = query.Name,
                        category   = query.Category,
                        conceptids = ResourceIdTable.From(conceptids),
                        queryids   = ResourceIdTable.From(queryids),
                        definition = query.Definition,
                        user       = user.UUID
                    },
                        commandType : CommandType.StoredProcedure,
                        commandTimeout : dbOpts.DefaultTimeout
                        );

                    if (qsr == null)
                    {
                        return(null);
                    }

                    return(new QuerySaveResult(query.QueryId, QueryUrn.From(qsr.UniversalId), qsr.Ver));
                }
            }
            catch (SqlException se)
            {
                logger.LogError("Could not save query. Query:{@Query} Code:{Code} Error:{Error}", query, se.ErrorCode, se.Message);
                se.MapThrow();
                throw;
            }
        }
Example #5
0
        public async Task <ActionResult <QuerySaveResponseDTO> > Save(
            string id,
            [FromBody] QuerySaveDTO querySave,
            [FromServices] IPanelConverterService panelConverter,
            [FromServices] IPanelValidator panelValidator,
            CancellationToken cancelToken
            )
        {
            try
            {
                // federated user submitting an initial save request
                if (!user.IsInstutional && QueryUrn.From(querySave.UniversalId) == null)
                {
                    return(BadRequest("Initial save requests must be made to home node."));
                }

                var ctx = await panelConverter.GetPanelsAsync(querySave, cancelToken);

                if (!ctx.PreflightPassed)
                {
                    return(BadRequest(new QuerySaveResponseDTO {
                        Preflight = new PreflightCheckDTO(ctx.PreflightCheck)
                    }));
                }
                var query = panelValidator.Validate(ctx);

                cancelToken.ThrowIfCancellationRequested();

                if (!user.IsInstutional)
                {
                    panelConverter.LocalizeDefinition(querySave, query);
                }


                var toSave = new QuerySave
                {
                    QueryId     = new Guid(id),
                    UniversalId = ctx.UniversalId,
                    Name        = querySave.Name,
                    Category    = querySave.Category,
                    Definition  = QueryDefinitionDTO.JSON(querySave),
                    Resources   = query.Panels.GetResources()
                };
                if (querySave.Ver.HasValue)
                {
                    toSave.Ver = querySave.Ver.Value;
                }

                var saved = await queryService.Save(toSave);

                if (saved == null)
                {
                    return(NotFound());
                }

                var response = new QuerySaveResponseDTO
                {
                    Preflight = new PreflightCheckDTO(ctx.PreflightCheck),
                    Query     = new QuerySaveResultDTO(saved)
                };

                return(Ok(response));
            }
            catch (InvalidOperationException ie)
            {
                log.LogError("Unrecoverable validation error in query. Error:{Error}", ie.Message);
                return(BadRequest());
            }
            catch (FormatException fe)
            {
                log.LogError("Malformed query identifier. Id:{Id} UniversalId:{UniversalId} Error:{Error}", id, querySave.UniversalId, fe.Message);
                return(BadRequest());
            }
            catch (OperationCanceledException)
            {
                log.LogInformation("Request cancelled.");
                return(NoContent());
            }
            catch (LeafDbException lde)
            {
                return(StatusCode(lde.StatusCode));
            }
            catch (Exception e)
            {
                log.LogError("Could not save query. QueryId:{QueryId} Query:{@Query} Error:{Error}", id, querySave, e.ToString());
                return(StatusCode(StatusCodes.Status500InternalServerError));
            }
        }
Example #6
0
        public async Task <SaveResult> SaveAsync(Guid id, IQuerySaveDTO ast, Func <IQueryDefinition, string> json, CancellationToken cancel)
        {
            log.LogInformation("Saving query. Id:{Id} Ast:{Ast}", id, ast);

            var ctx = await converter.GetPanelsAsync(ast, cancel);

            log.LogInformation("Save query panel validation context. Context:{@Context}", ctx);

            if (!ctx.PreflightPassed)
            {
                return(new SaveResult {
                    State = SaveState.Preflight, Preflight = ctx.PreflightCheck
                });
            }
            var query = validator.Validate(ctx);

            cancel.ThrowIfCancellationRequested();

            if (!user.IsInstitutional)
            {
                converter.LocalizeDefinition(ast, query);
                log.LogInformation("Localized federated query. Id:{Id} Ast:{Ast}", id, ast);
            }

            var toSave = new QuerySave
            {
                QueryId     = id,
                UniversalId = ctx.UniversalId,
                Name        = ast.Name,
                Category    = ast.Category,
                Definition  = json(ast),
                Resources   = query.Panels.GetResources()
            };

            // if ast already has an assive version, use it
            if (ast.Ver.HasValue)
            {
                toSave.Ver = ast.Ver.Value;
            }

            try
            {
                log.LogInformation("Saving query. Query:{Query} Payload:{@Payload}", id, toSave);

                var saved = await ImplSaveAsync(toSave);

                if (saved == null)
                {
                    log.LogError("Could not save query, not found. Query:{Query}", id);
                    return(new SaveResult
                    {
                        State = SaveState.NotFound,
                        Preflight = ctx.PreflightCheck,
                        Result = null
                    });
                }
                log.LogInformation("Saved query. Query:{@Query}", toSave);
                return(new SaveResult
                {
                    State = SaveState.Ok,
                    Preflight = ctx.PreflightCheck,
                    Result = saved
                });
            }
            catch (DbException de)
            {
                log.LogError("Failed to save query. Query:{@Query} Code:{Code} Error:{Error}", toSave, de.ErrorCode, de.Message);
                de.MapThrow();
                throw;
            }
        }