diff --git a/modules/dataquery/static/schema.yml b/modules/dataquery/static/schema.yml new file mode 100644 index 00000000000..7d310050fc4 --- /dev/null +++ b/modules/dataquery/static/schema.yml @@ -0,0 +1,331 @@ +openapi: 3.0.1 +info: + title: LORIS Data Query Tool API endpoints + description: |- + This is the API for the parts of the Loris data query module which are intended to be used as an API. + contact: + name: LORIS Development Team + url: 'https://github.com/aces/Loris' + license: + name: 'GNU Public License, Version 3' + url: 'https://opensource.org/licenses/GPL-3.0' + version: "3.0" +servers: + - url: /dataquery/ +security: + - ApiKeyAuth: [] +paths: + /queries: + get: + summary: Get a list of a recent, shared, and study (top) queries to display. + responses: + '200': + description: Successfully operation + content: + application/json: + schema: + $ref: '#/components/schemas/AllQueries' + '403': + description: Permission denied + post: + description: Create a new query and return the QueryID. If the same query (fields and criteria) already exists, the same QueryID will be returned instead of a new one being created. + requestBody: + description: A Query object (without the QueryID) + content: + application/json: + schema: + $ref: '#/components/schemas/Query' + responses: + '200': + description: Query successfully created + content: + application/json: + schema: + type: object + properties: + QueryID: + type: integer + '400': + description: An invalid body was supplied + content: + application/json: + schema: + type: object + properties: + error: + type: string + /queries/{QueryID}: + parameters: + - name: QueryID + in: path + description: the QueryID returned by posting to /queries + required: true + style: simple + schema: + type: integer + get: + responses: + '200': + description: The Query was successfully retrieved + content: + application/json: + schema: + $ref: '#/components/schemas/Query' + '403': + description: Permission denied + patch: + parameters: + - name: share + in: query + style: spaceDelimited + schema: + type: boolean + + - name: unshare + in: query + style: spaceDelimited + schema: + type: boolean + - name: star + in: query + style: spaceDelimited + schema: + type: boolean + - name: unstar + in: query + style: spaceDelimited + schema: + type: boolean + - name: type + in: query + style: spaceDelimited + schema: + type: string + enum: ['top', 'untop', 'dashboard'] + - name: name + in: query + style: pipeDelimited + schema: + type: string + responses: + '400': + description: Bad request. Most likely caused by one or more incompatible patches to be done at the same time. + /queries/{QueryID}/run: + parameters: + - name: QueryID + in: path + description: the QueryID returned by posting to /queries + required: true + style: simple + schema: + type: integer + get: + description: |- + Run the query QueryID and returns the results. + + This endpoint will result in a new query run being generated, which will be returned in the 'recent' queries of the user on the /queries endpoint. + responses: + '200': + description: The query was able to be successfully run + content: + application/octet-stream: + schema: + $ref: '#/components/schemas/QueryResults' + '500': + description: Something went wrong on the server running the query + /queries/{QueryID}/count: + parameters: + - name: QueryID + in: path + description: the QueryID returned by posting to /queries + required: true + style: simple + schema: + type: integer + get: + responses: + '200': + description: |- + A count of the number of candidate matches that would be returned if the query were to be run by the current user right now. + + This endpoint does *not* result in a new query run being generated or run the query, it only returns the count of how many candidates would match if the query *were* to be run. + content: + application/json: + schema: + type: object + properties: + count: + type: integer + description: The number of candidates that match the filters + example: 34 + /queries/{QueryID}/run/{QueryRunID}: + description: |- + Returns the cached results of a previously run query + + Note: This endpoint is aspirational. + parameters: + - name: QueryID + in: path + description: the QueryID returned by posting to /queries + required: true + style: simple + schema: + type: integer + - name: QueryRunID + in: path + description: the identifier of a previous run for this QueryID. + required: true + style: simple + schema: + type: integer + get: + responses: + '500': + description: Not implemented + content: + application/json: + schema: + type: object + +components: + schemas: + AllQueries: + type: object + properties: + recent: + type: array + items: + $ref: '#/components/schemas/QueryRun' + shared: + type: array + items: + $ref: '#/components/schemas/Query' + topqueries: + type: array + items: + $ref: '#/components/schemas/Query' + + Query: + type: object + properties: + type: + type: string + enum: ['candidates'] + example: "candidates" + Name: + type: string + example: "My Query" + SharedBy: + type: array + items: + type: string + example: "admin" + Starred: + type: boolean + Shared: + type: boolean + QueryID: + type: integer + example: 3 + fields: + type: array + items: + $ref: '#/components/schemas/QueryField' + criteria: + $ref: '#/components/schemas/QueryCriteriaGroup' + required: + - type + - fields + QueryRun: + type: object + properties: + RunTime: + type: string + example: "2022-11-02 15:34:38" + Query: + $ref: '#/components/schemas/Query' + QueryField: + type: object + properties: + module: + type: string + example: "candidate_parameters" + category: + type: string + example: "Identifiers" + field: + type: string + example: "CandID" + required: + - module + - category + - field + QueryCriteriaGroup: + type: object + description: An and/or group used for filtering, all items in the group must be the same operator (but an item in the group may be a query criteria subgroup using a different operator) + properties: + operator: + type: string + enum: ['and', 'or'] + description: The operator to connect the items in group + group: + type: array + items: + $ref: '#/components/schemas/QueryGroupField' + QueryGroupField: + type: object + properties: + module: + type: string + example: "candidate_parameters" + category: + type: string + example: "Identifiers" + fieldname: + type: string + example: "CandID" + op: + type: string + enum: + # Standard operators + - 'lt' + - 'lte' + - 'eq' + - 'neq' + - 'gte' + - 'gt' + # Enum operator + - 'in' + # String operators + - 'startsWith' + - 'endsWith' + - 'contains' + # Optional cardinality operators + - 'isnotnull' + - 'isnull' + # Many cardinality operators + - 'exists' + - 'notexists' + - 'numberof' + value: + type: string + required: + - module + - category + - fieldname + - op + - value + QueryResults: + description: |- + The result of running a query. + + The result is a stream of data for each CandID that matched by the query. Candidates are separated by an ASCII record separator (0x??). Each cell within the candidate is separated by an ASCII ?? separateor (0x??). Each row should have the exact number of fields that were in the query fields attribute. + + Within each cell, the format of the data varies based on the dictionary of the field type. If the data is candidate scoped, a value is directly returned. If it is session scoped variable or has cardinality of many:one, a JSON object is returned. + + securitySchemes: + ApiKeyAuth: + type: apiKey + name: Authorization + in: header +