Modify Decimal Fields to be treated as number in OpenAPI schema. (#11871)
Closes https://github.com/twentyhq/twenty/issues/10807 ## Description This PR will Modify Decimal Fields to be treated as `number` in OpenAPI schema. ## Testing <img width="989" alt="スクリーンショット 2025-05-05 20 49 05" src="https://github.com/user-attachments/assets/2f120317-5860-4c93-91a2-f521a69a1cd5" /> <img width="872" alt="スクリーンショット 2025-05-05 20 49 52" src="https://github.com/user-attachments/assets/0d319785-e30b-4132-be9e-12ed6f3cc46a" /> --------- Co-authored-by: Takuya Kurimoto <takuya004869@gmail.com> Co-authored-by: prastoin <paul@twenty.com>
This commit is contained in:
@ -0,0 +1,106 @@
|
|||||||
|
// Jest Snapshot v1, https://goo.gl/fbAQLP
|
||||||
|
|
||||||
|
exports[`computeSchemaComponents Float without decimals 1`] = `
|
||||||
|
{
|
||||||
|
"ObjectName": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number2": {
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"number2",
|
||||||
|
],
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
"ObjectName for Response": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number2": {
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
"ObjectName for Update": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number2": {
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`computeSchemaComponents Integer dataType with decimals 1`] = `
|
||||||
|
{
|
||||||
|
"ObjectName": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number1": {
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"number1",
|
||||||
|
],
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
"ObjectName for Response": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number1": {
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
"ObjectName for Update": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number1": {
|
||||||
|
"type": "number",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
|
|
||||||
|
exports[`computeSchemaComponents Integer with a 0 decimals 1`] = `
|
||||||
|
{
|
||||||
|
"ObjectName": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number3": {
|
||||||
|
"type": "integer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"required": [
|
||||||
|
"number3",
|
||||||
|
],
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
"ObjectName for Response": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number3": {
|
||||||
|
"type": "integer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
"ObjectName for Update": {
|
||||||
|
"description": undefined,
|
||||||
|
"properties": {
|
||||||
|
"number3": {
|
||||||
|
"type": "integer",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
"type": "object",
|
||||||
|
},
|
||||||
|
}
|
||||||
|
`;
|
||||||
File diff suppressed because it is too large
Load Diff
@ -1,6 +1,11 @@
|
|||||||
import { OpenAPIV3_1 } from 'openapi-types';
|
import { OpenAPIV3_1 } from 'openapi-types';
|
||||||
import { capitalize } from 'twenty-shared/utils';
|
|
||||||
import { FieldMetadataType } from 'twenty-shared/types';
|
import { FieldMetadataType } from 'twenty-shared/types';
|
||||||
|
import { capitalize, isDefined } from 'twenty-shared/utils';
|
||||||
|
|
||||||
|
import {
|
||||||
|
FieldMetadataSettings,
|
||||||
|
NumberDataType,
|
||||||
|
} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
|
||||||
|
|
||||||
import {
|
import {
|
||||||
computeDepthParameters,
|
computeDepthParameters,
|
||||||
@ -36,29 +41,47 @@ const isFieldAvailable = (field: FieldMetadataEntity, forResponse: boolean) => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const getFieldProperties = (type: FieldMetadataType): Property => {
|
const getFieldProperties = (field: FieldMetadataEntity): Property => {
|
||||||
switch (type) {
|
switch (field.type) {
|
||||||
case FieldMetadataType.UUID:
|
case FieldMetadataType.UUID: {
|
||||||
return { type: 'string', format: 'uuid' };
|
return { type: 'string', format: 'uuid' };
|
||||||
|
}
|
||||||
case FieldMetadataType.TEXT:
|
case FieldMetadataType.TEXT:
|
||||||
case FieldMetadataType.RICH_TEXT:
|
case FieldMetadataType.RICH_TEXT: {
|
||||||
return { type: 'string' };
|
return { type: 'string' };
|
||||||
case FieldMetadataType.DATE_TIME:
|
}
|
||||||
|
case FieldMetadataType.DATE_TIME: {
|
||||||
return { type: 'string', format: 'date-time' };
|
return { type: 'string', format: 'date-time' };
|
||||||
case FieldMetadataType.DATE:
|
}
|
||||||
|
case FieldMetadataType.DATE: {
|
||||||
return { type: 'string', format: 'date' };
|
return { type: 'string', format: 'date' };
|
||||||
case FieldMetadataType.NUMBER:
|
}
|
||||||
return { type: 'integer' };
|
case FieldMetadataType.NUMBER: {
|
||||||
case FieldMetadataType.NUMERIC:
|
const settings =
|
||||||
case FieldMetadataType.POSITION:
|
field.settings as FieldMetadataSettings<FieldMetadataType.NUMBER>;
|
||||||
return { type: 'number' };
|
|
||||||
case FieldMetadataType.BOOLEAN:
|
|
||||||
return { type: 'boolean' };
|
|
||||||
case FieldMetadataType.RAW_JSON:
|
|
||||||
return { type: 'object' };
|
|
||||||
|
|
||||||
default:
|
if (
|
||||||
|
settings?.dataType === NumberDataType.FLOAT ||
|
||||||
|
(isDefined(settings?.decimals) && settings.decimals > 0)
|
||||||
|
) {
|
||||||
|
return { type: 'number' };
|
||||||
|
}
|
||||||
|
|
||||||
|
return { type: 'integer' };
|
||||||
|
}
|
||||||
|
case FieldMetadataType.NUMERIC:
|
||||||
|
case FieldMetadataType.POSITION: {
|
||||||
|
return { type: 'number' };
|
||||||
|
}
|
||||||
|
case FieldMetadataType.BOOLEAN: {
|
||||||
|
return { type: 'boolean' };
|
||||||
|
}
|
||||||
|
case FieldMetadataType.RAW_JSON: {
|
||||||
|
return { type: 'object' };
|
||||||
|
}
|
||||||
|
default: {
|
||||||
return { type: 'string' };
|
return { type: 'string' };
|
||||||
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -282,7 +305,7 @@ const getSchemaComponentsProperties = ({
|
|||||||
};
|
};
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
itemProperty = getFieldProperties(field.type);
|
itemProperty = getFieldProperties(field);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user