Add generate openapi schema for rest api (#2923)

* Add generate openapi schema for rest api

* Split method in utils

* Add paramters

* Add error response

* Update description of filter and order by

* Add get/id routes

* Add delete route

* Use components

* Fix Typo

* Add tags

* Add create query

* Add required field

* Add update query

* Add body request example

* Add 201 on create request

* Add servers

* Fix failing test

* Add open-api endpoint

* Update description

* Return base schema if no auth

* Code review returns

* Use open-api/types

* Fix tag

* Use components for parameters

* Improve response examples

* Improve axios error message

* Fix tests
This commit is contained in:
martmull
2023-12-13 14:58:34 +01:00
committed by GitHub
parent 366ae0d448
commit e3e42be723
29 changed files with 957 additions and 13 deletions

View File

@ -1,6 +1,6 @@
import { Test, TestingModule } from '@nestjs/testing';
import { objectMetadataItem } from 'src/core/api-rest/api-rest-query-builder/utils/__tests__/utils';
import { objectMetadataItem } from 'src/utils/utils-test/object-metadata-item';
import { FilterInputFactory } from 'src/core/api-rest/api-rest-query-builder/factories/input-factories/filter-input.factory';
describe('FilterInputFactory', () => {

View File

@ -2,8 +2,8 @@ import { Test, TestingModule } from '@nestjs/testing';
import { OrderByDirection } from 'src/workspace/workspace-query-builder/interfaces/record.interface';
import { objectMetadataItem } from 'src/utils/utils-test/object-metadata-item';
import { OrderByInputFactory } from 'src/core/api-rest/api-rest-query-builder/factories/input-factories/order-by-input.factory';
import { objectMetadataItem } from 'src/core/api-rest/api-rest-query-builder/utils/__tests__/utils';
describe('OrderByInputFactory', () => {
const objectMetadata = { objectMetadataItem: objectMetadataItem };

View File

@ -1,4 +1,4 @@
import { objectMetadataItem } from 'src/core/api-rest/api-rest-query-builder/utils/__tests__/utils';
import { objectMetadataItem } from 'src/utils/utils-test/object-metadata-item';
import { parseFilter } from 'src/core/api-rest/api-rest-query-builder/factories/input-factories/filter-utils/parse-filter.utils';
describe('parseFilter', () => {

View File

@ -1,6 +1,10 @@
import { Conjunctions } from 'src/core/api-rest/api-rest-query-builder/factories/input-factories/filter-utils/parse-filter.utils';
export const DEFAULT_CONJUNCTION = Conjunctions.and;
export const addDefaultConjunctionIfMissing = (filterQuery: string): string => {
if (!(filterQuery.includes('(') && filterQuery.includes(')'))) {
return `and(${filterQuery})`;
return `${DEFAULT_CONJUNCTION}(${filterQuery})`;
}
return filterQuery;

View File

@ -1,6 +1,6 @@
import { BadRequestException } from '@nestjs/common';
enum FilterComparators {
export enum FilterComparators {
eq = 'eq',
neq = 'neq',
in = 'in',

View File

@ -9,7 +9,7 @@ import {
import { formatFieldValue } from 'src/core/api-rest/api-rest-query-builder/factories/input-factories/filter-utils/format-field-values.utils';
import { FieldValue } from 'src/core/api-rest/types/api-rest-field-value.type';
enum Conjunctions {
export enum Conjunctions {
or = 'or',
and = 'and',
not = 'not',

View File

@ -9,7 +9,7 @@ import {
import { checkFields } from 'src/core/api-rest/api-rest-query-builder/utils/fields.utils';
const DEFAULT_ORDER_DIRECTION = OrderByDirection.AscNullsFirst;
export const DEFAULT_ORDER_DIRECTION = OrderByDirection.AscNullsFirst;
@Injectable()
export class OrderByInputFactory {

View File

@ -1,8 +1,8 @@
import { objectMetadataItem } from 'src/utils/utils-test/object-metadata-item';
import {
checkFields,
getFieldType,
} from 'src/core/api-rest/api-rest-query-builder/utils/fields.utils';
import { objectMetadataItem } from 'src/core/api-rest/api-rest-query-builder/utils/__tests__/utils';
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
describe('FieldUtils', () => {

View File

@ -1,11 +1,11 @@
import { mapFieldMetadataToGraphqlQuery } from 'src/core/api-rest/api-rest-query-builder/utils/map-field-metadata-to-graphql-query.utils';
import {
fieldCurrency,
fieldLink,
fieldNumber,
fieldString,
objectMetadataItem,
} from 'src/core/api-rest/api-rest-query-builder/utils/__tests__/utils';
} from 'src/utils/utils-test/object-metadata-item';
import { mapFieldMetadataToGraphqlQuery } from 'src/core/api-rest/api-rest-query-builder/utils/map-field-metadata-to-graphql-query.utils';
describe('mapFieldMetadataToGraphqlQuery', () => {
it('should map properly', () => {

View File

@ -1,33 +0,0 @@
import { FieldMetadataType } from 'src/metadata/field-metadata/field-metadata.entity';
export const fieldNumber = {
name: 'fieldNumber',
type: FieldMetadataType.NUMBER,
targetColumnMap: { value: 'fieldNumber' },
};
export const fieldString = {
name: 'fieldString',
type: FieldMetadataType.TEXT,
targetColumnMap: { value: 'fieldString' },
};
export const fieldLink = {
name: 'fieldLink',
type: FieldMetadataType.LINK,
targetColumnMap: { label: 'fieldLinkLabel', url: 'fieldLinkUrl' },
};
export const fieldCurrency = {
name: 'fieldCurrency',
type: FieldMetadataType.CURRENCY,
targetColumnMap: {
amountMicros: 'fieldCurrencyAmountMicros',
currencyCode: 'fieldCurrencyCurrencyCode',
},
};
export const objectMetadataItem = {
targetTableName: 'testingObject',
fields: [fieldNumber, fieldString, fieldLink, fieldCurrency],
};

View File

@ -28,14 +28,15 @@ export class ApiRestService {
try {
return await axios.post(`${baseUrl}/graphql`, data, {
headers: {
'Content-Type': 'application/json',
Authorization: request.headers.authorization,
},
});
} catch (err) {
return {
data: {
error: `AxiosError: please double check your query and your API key (to generate a new one, see here: ${this.environmentService.getFrontBaseUrl()}/settings/developers/api-keys)`,
status: 400,
error: `${err}. Please check your query.`,
status: err.response.status,
},
};
}