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:
TakuyaKurimoto
2025-05-05 22:48:23 +09:00
committed by GitHub
parent 6128d660c2
commit 5f8040af5d
3 changed files with 812 additions and 581 deletions

View File

@ -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",
},
}
`;

View File

@ -1,6 +1,11 @@
import { OpenAPIV3_1 } from 'openapi-types';
import { capitalize } from 'twenty-shared/utils';
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 {
computeDepthParameters,
@ -36,29 +41,47 @@ const isFieldAvailable = (field: FieldMetadataEntity, forResponse: boolean) => {
}
};
const getFieldProperties = (type: FieldMetadataType): Property => {
switch (type) {
case FieldMetadataType.UUID:
const getFieldProperties = (field: FieldMetadataEntity): Property => {
switch (field.type) {
case FieldMetadataType.UUID: {
return { type: 'string', format: 'uuid' };
}
case FieldMetadataType.TEXT:
case FieldMetadataType.RICH_TEXT:
case FieldMetadataType.RICH_TEXT: {
return { type: 'string' };
case FieldMetadataType.DATE_TIME:
}
case FieldMetadataType.DATE_TIME: {
return { type: 'string', format: 'date-time' };
case FieldMetadataType.DATE:
}
case FieldMetadataType.DATE: {
return { type: 'string', format: 'date' };
case FieldMetadataType.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' };
}
case FieldMetadataType.NUMBER: {
const settings =
field.settings as FieldMetadataSettings<FieldMetadataType.NUMBER>;
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' };
}
}
};
@ -282,7 +305,7 @@ const getSchemaComponentsProperties = ({
};
break;
default:
itemProperty = getFieldProperties(field.type);
itemProperty = getFieldProperties(field);
break;
}