5805 typing issue in rest api (#5818)
Fixed types for: - uuid - email - datetime - date - number - currency.amountMicros - select - multiSelect ## Before  ## After 
This commit is contained in:
@ -1,8 +1,17 @@
|
||||
import { computeSchemaComponents } from 'src/engine/core-modules/open-api/utils/components.utils';
|
||||
import { objectMetadataItemMock } from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import {
|
||||
fields,
|
||||
objectMetadataItemMock,
|
||||
} from 'src/engine/api/__mocks__/object-metadata-item.mock';
|
||||
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
|
||||
import { FieldMetadataType } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
|
||||
|
||||
describe('computeSchemaComponents', () => {
|
||||
it('should test all field types', () => {
|
||||
expect(fields.map((field) => field.type)).toEqual(
|
||||
Object.keys(FieldMetadataType),
|
||||
);
|
||||
});
|
||||
it('should compute schema components', () => {
|
||||
expect(
|
||||
computeSchemaComponents([
|
||||
@ -15,12 +24,39 @@ describe('computeSchemaComponents', () => {
|
||||
required: ['fieldNumber'],
|
||||
example: { fieldNumber: '' },
|
||||
properties: {
|
||||
fieldCurrency: {
|
||||
properties: {
|
||||
amountMicros: { type: 'string' },
|
||||
currencyCode: { type: 'string' },
|
||||
},
|
||||
type: 'object',
|
||||
fieldUuid: {
|
||||
type: 'string',
|
||||
format: 'uuid',
|
||||
},
|
||||
fieldText: {
|
||||
type: 'string',
|
||||
},
|
||||
fieldPhone: {
|
||||
type: 'string',
|
||||
},
|
||||
fieldEmail: {
|
||||
type: 'string',
|
||||
format: 'email',
|
||||
},
|
||||
fieldDateTime: {
|
||||
type: 'string',
|
||||
format: 'date',
|
||||
},
|
||||
fieldDate: {
|
||||
type: 'string',
|
||||
format: 'date',
|
||||
},
|
||||
fieldBoolean: {
|
||||
type: 'boolean',
|
||||
},
|
||||
fieldNumber: {
|
||||
type: 'integer',
|
||||
},
|
||||
fieldNumeric: {
|
||||
type: 'number',
|
||||
},
|
||||
fieldProbability: {
|
||||
type: 'number',
|
||||
},
|
||||
fieldLink: {
|
||||
properties: {
|
||||
@ -29,14 +65,83 @@ describe('computeSchemaComponents', () => {
|
||||
},
|
||||
type: 'object',
|
||||
},
|
||||
fieldNumber: {
|
||||
fieldLinks: {
|
||||
properties: {
|
||||
primaryLinkLabel: { type: 'string' },
|
||||
primaryLinkUrl: { type: 'string' },
|
||||
secondaryLinks: { type: 'object' },
|
||||
},
|
||||
type: 'object',
|
||||
},
|
||||
fieldCurrency: {
|
||||
properties: {
|
||||
amountMicros: { type: 'number' },
|
||||
currencyCode: { type: 'string' },
|
||||
},
|
||||
type: 'object',
|
||||
},
|
||||
fieldFullName: {
|
||||
properties: {
|
||||
firstName: {
|
||||
type: 'string',
|
||||
},
|
||||
lastName: {
|
||||
type: 'string',
|
||||
},
|
||||
},
|
||||
type: 'object',
|
||||
},
|
||||
fieldRating: {
|
||||
type: 'number',
|
||||
},
|
||||
fieldSelect: {
|
||||
type: 'string',
|
||||
enum: ['OPTION_1', 'OPTION_2'],
|
||||
},
|
||||
fieldString: {
|
||||
fieldMultiSelect: {
|
||||
type: 'string',
|
||||
enum: ['OPTION_1', 'OPTION_2'],
|
||||
},
|
||||
fieldRelation: {
|
||||
type: 'array',
|
||||
items: {
|
||||
$ref: '#/components/schemas/ToObjectMetadataName',
|
||||
},
|
||||
},
|
||||
fieldPosition: {
|
||||
type: 'number',
|
||||
},
|
||||
fieldAddress: {
|
||||
properties: {
|
||||
addressCity: {
|
||||
type: 'string',
|
||||
},
|
||||
addressCountry: {
|
||||
type: 'string',
|
||||
},
|
||||
addressLat: {
|
||||
type: 'number',
|
||||
},
|
||||
addressLng: {
|
||||
type: 'number',
|
||||
},
|
||||
addressPostcode: {
|
||||
type: 'string',
|
||||
},
|
||||
addressState: {
|
||||
type: 'string',
|
||||
},
|
||||
addressStreet1: {
|
||||
type: 'string',
|
||||
},
|
||||
addressStreet2: {
|
||||
type: 'string',
|
||||
},
|
||||
},
|
||||
type: 'object',
|
||||
},
|
||||
fieldRawJson: {
|
||||
type: 'object',
|
||||
},
|
||||
},
|
||||
},
|
||||
|
||||
@ -19,6 +19,34 @@ type Properties = {
|
||||
[name: string]: Property;
|
||||
};
|
||||
|
||||
const getFieldProperties = (type: FieldMetadataType): Property => {
|
||||
switch (type) {
|
||||
case FieldMetadataType.UUID:
|
||||
return { type: 'string', format: 'uuid' };
|
||||
case FieldMetadataType.TEXT:
|
||||
case FieldMetadataType.PHONE:
|
||||
return { type: 'string' };
|
||||
case FieldMetadataType.EMAIL:
|
||||
return { type: 'string', format: 'email' };
|
||||
case FieldMetadataType.DATE_TIME:
|
||||
case FieldMetadataType.DATE:
|
||||
return { type: 'string', format: 'date' };
|
||||
case FieldMetadataType.NUMBER:
|
||||
return { type: 'integer' };
|
||||
case FieldMetadataType.NUMERIC:
|
||||
case FieldMetadataType.PROBABILITY:
|
||||
case FieldMetadataType.RATING:
|
||||
case FieldMetadataType.POSITION:
|
||||
return { type: 'number' };
|
||||
case FieldMetadataType.BOOLEAN:
|
||||
return { type: 'boolean' };
|
||||
case FieldMetadataType.RAW_JSON:
|
||||
return { type: 'object' };
|
||||
default:
|
||||
return { type: 'string' };
|
||||
}
|
||||
};
|
||||
|
||||
const getSchemaComponentsProperties = (
|
||||
item: ObjectMetadataEntity,
|
||||
): Properties => {
|
||||
@ -26,23 +54,12 @@ const getSchemaComponentsProperties = (
|
||||
let itemProperty = {} as Property;
|
||||
|
||||
switch (field.type) {
|
||||
case FieldMetadataType.UUID:
|
||||
case FieldMetadataType.TEXT:
|
||||
case FieldMetadataType.PHONE:
|
||||
case FieldMetadataType.EMAIL:
|
||||
case FieldMetadataType.DATE_TIME:
|
||||
case FieldMetadataType.DATE:
|
||||
itemProperty.type = 'string';
|
||||
break;
|
||||
case FieldMetadataType.NUMBER:
|
||||
case FieldMetadataType.NUMERIC:
|
||||
case FieldMetadataType.PROBABILITY:
|
||||
case FieldMetadataType.RATING:
|
||||
case FieldMetadataType.POSITION:
|
||||
itemProperty.type = 'number';
|
||||
break;
|
||||
case FieldMetadataType.BOOLEAN:
|
||||
itemProperty.type = 'boolean';
|
||||
case FieldMetadataType.SELECT:
|
||||
case FieldMetadataType.MULTI_SELECT:
|
||||
itemProperty = {
|
||||
type: 'string',
|
||||
enum: field.options.map((option: { value: string }) => option.value),
|
||||
};
|
||||
break;
|
||||
case FieldMetadataType.RELATION:
|
||||
if (field.fromRelationMetadata?.toObjectMetadata.nameSingular) {
|
||||
@ -66,18 +83,14 @@ const getSchemaComponentsProperties = (
|
||||
properties: compositeTypeDefintions
|
||||
.get(field.type)
|
||||
?.properties?.reduce((properties, property) => {
|
||||
// TODO: This should not be statically typed, instead we should do someting recursive
|
||||
properties[property.name] = { type: 'string' };
|
||||
properties[property.name] = getFieldProperties(property.type);
|
||||
|
||||
return properties;
|
||||
}, {} as Properties),
|
||||
};
|
||||
break;
|
||||
case FieldMetadataType.RAW_JSON:
|
||||
itemProperty.type = 'object';
|
||||
break;
|
||||
default:
|
||||
itemProperty.type = 'string';
|
||||
itemProperty = getFieldProperties(field.type);
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user