Skip to content

12660 bugapi create one person post api request example is returning 400 in playground #12787

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,9 @@ exports[`computeSchemaComponents Float without decimals 1`] = `
{
"ObjectName": {
"description": undefined,
"example": {
"number2": 692.1852368365229,
},
"properties": {
"number2": {
"type": "number",
Expand All @@ -25,6 +28,9 @@ exports[`computeSchemaComponents Float without decimals 1`] = `
},
"ObjectNameForUpdate": {
"description": undefined,
"example": {
"number2": 316.2001153750569,
},
"properties": {
"number2": {
"type": "number",
Expand All @@ -39,6 +45,9 @@ exports[`computeSchemaComponents Integer dataType with decimals 1`] = `
{
"ObjectName": {
"description": undefined,
"example": {
"number1": 957.9316406203515,
},
"properties": {
"number1": {
"type": "number",
Expand All @@ -60,6 +69,9 @@ exports[`computeSchemaComponents Integer dataType with decimals 1`] = `
},
"ObjectNameForUpdate": {
"description": undefined,
"example": {
"number1": 533.6321196880441,
},
"properties": {
"number1": {
"type": "number",
Expand All @@ -74,6 +86,9 @@ exports[`computeSchemaComponents Integer with a 0 decimals 1`] = `
{
"ObjectName": {
"description": undefined,
"example": {
"number3": 686.8144267539021,
},
"properties": {
"number3": {
"type": "integer",
Expand All @@ -95,6 +110,9 @@ exports[`computeSchemaComponents Integer with a 0 decimals 1`] = `
},
"ObjectNameForUpdate": {
"description": undefined,
"example": {
"number3": 834.7910462254755,
},
"properties": {
"number3": {
"type": "integer",
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { EachTestingContext } from 'twenty-shared/testing';
import { FieldMetadataType } from 'twenty-shared/types';
import { faker } from '@faker-js/faker';

import { NumberDataType } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';

Expand All @@ -9,6 +10,7 @@ import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';

describe('computeSchemaComponents', () => {
faker.seed(1);
it('should compute schema components', () => {
expect(
computeSchemaComponents([
Expand All @@ -18,6 +20,36 @@ describe('computeSchemaComponents', () => {
{
"ObjectName": {
"description": undefined,
"example": {
"fieldCurrency": {
"amountMicros": 284000000,
"currencyCode": "EUR",
},
"fieldEmails": {
"additionalEmails": null,
"primaryEmail": "[email protected]",
},
"fieldFullName": {
"firstName": "Shad",
"lastName": "Osinski",
},
"fieldLinks": {
"additionalLinks": [],
"primaryLinkLabel": "",
"primaryLinkUrl": "https://narrow-help.net/",
},
"fieldMultiSelect": [
"OPTION_1",
],
"fieldNumber": 346.2151663160047,
"fieldPhones": {
"additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "06 10 20 30 40",
},
"fieldSelect": "OPTION_1",
},
"properties": {
"fieldActor": {
"properties": {
Expand Down Expand Up @@ -444,6 +476,36 @@ describe('computeSchemaComponents', () => {
},
"ObjectNameForUpdate": {
"description": undefined,
"example": {
"fieldCurrency": {
"amountMicros": 253000000,
"currencyCode": "EUR",
},
"fieldEmails": {
"additionalEmails": null,
"primaryEmail": "[email protected]",
},
"fieldFullName": {
"firstName": "Shad",
"lastName": "Jones",
},
"fieldLinks": {
"additionalLinks": [],
"primaryLinkLabel": "",
"primaryLinkUrl": "https://unlawful-blowgun.biz",
},
"fieldMultiSelect": [
"OPTION_1",
],
"fieldNumber": 692.6302930536448,
"fieldPhones": {
"additionalPhones": [],
"primaryPhoneCallingCode": "+33",
"primaryPhoneCountryCode": "FR",
"primaryPhoneNumber": "06 10 20 30 40",
},
"fieldSelect": "OPTION_1",
},
"properties": {
"fieldActor": {
"properties": {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import {
NumberDataType,
} from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-settings.interface';
import { RelationType } from 'src/engine/metadata-modules/field-metadata/interfaces/relation-type.interface';
import { FieldMetadataDefaultValue } from 'src/engine/metadata-modules/field-metadata/interfaces/field-metadata-default-value.interface';

import {
computeDepthParameters,
Expand All @@ -20,13 +21,17 @@ import {
import { FieldMetadataEntity } from 'src/engine/metadata-modules/field-metadata/field-metadata.entity';
import { ObjectMetadataEntity } from 'src/engine/metadata-modules/object-metadata/object-metadata.entity';
import { isFieldMetadataEntityOfType } from 'src/engine/utils/is-field-metadata-of-type.util';
import { camelToTitleCase } from 'src/utils/camel-to-title-case';
import { generateRandomFieldValue } from 'src/engine/core-modules/open-api/utils/generate-random-field-value.utils';

type Property = OpenAPIV3_1.SchemaObject;

type Properties = {
[name: string]: Property;
};

type OpenApiExample = Record<string, FieldMetadataDefaultValue>;

const isFieldAvailable = (field: FieldMetadataEntity, forResponse: boolean) => {
if (forResponse) {
return true;
Expand Down Expand Up @@ -86,6 +91,47 @@ const getFieldProperties = (field: FieldMetadataEntity): Property => {
}
};

const getSchemaComponentsExample = (
item: ObjectMetadataEntity,
): OpenApiExample => {
return item.fields.reduce((node, field) => {
// If field is required
if (!field.isNullable && field.defaultValue === null) {
return { ...node, [field.name]: generateRandomFieldValue({ field }) };
}

switch (field.type) {
case FieldMetadataType.TEXT: {
if (field.name !== 'name') {
return node;
}

return {
...node,
[field.name]: `${camelToTitleCase(item.nameSingular)} name`,
};
}

case FieldMetadataType.EMAILS:
case FieldMetadataType.LINKS:
case FieldMetadataType.CURRENCY:
case FieldMetadataType.FULL_NAME:
case FieldMetadataType.SELECT:
case FieldMetadataType.MULTI_SELECT:
case FieldMetadataType.PHONES: {
return {
...node,
[field.name]: generateRandomFieldValue({ field }),
};
}

default: {
return node;
}
}
}, {});
};

const getSchemaComponentsProperties = ({
item,
forResponse,
Expand All @@ -105,12 +151,13 @@ const getSchemaComponentsProperties = ({
isFieldMetadataEntityOfType(field, FieldMetadataType.RELATION) &&
field.settings?.relationType === RelationType.MANY_TO_ONE
) {
node[`${field.name}Id`] = {
type: 'string',
format: 'uuid',
return {
...node,
[`${field.name}Id`]: {
type: 'string',
format: 'uuid',
},
};

return node;
}

if (
Expand Down Expand Up @@ -333,7 +380,7 @@ const getSchemaComponentsProperties = ({
}

if (Object.keys(itemProperty).length) {
node[field.name] = itemProperty;
return { ...node, [field.name]: itemProperty };
}

return node;
Expand Down Expand Up @@ -379,7 +426,7 @@ const getSchemaComponentsRelationProperties = (
}

if (Object.keys(itemProperty).length) {
node[field.name] = itemProperty;
return { ...node, [field.name]: itemProperty };
}

return node;
Expand All @@ -400,20 +447,23 @@ const getRequiredFields = (item: ObjectMetadataEntity): string[] => {

const computeSchemaComponent = ({
item,
withRequiredFields,
forResponse,
withRelations,
forUpdate,
}: {
item: ObjectMetadataEntity;
withRequiredFields: boolean;
forResponse: boolean;
withRelations: boolean;
forUpdate: boolean;
}): OpenAPIV3_1.SchemaObject => {
const result = {
const withRelations = forResponse && !forUpdate;

const withRequiredFields = !forResponse && !forUpdate;

const result: OpenAPIV3_1.SchemaObject = {
type: 'object',
description: item.description,
properties: getSchemaComponentsProperties({ item, forResponse }),
} as OpenAPIV3_1.SchemaObject;
...(!forResponse ? { example: getSchemaComponentsExample(item) } : {}),
};

if (withRelations) {
result.properties = {
Expand Down Expand Up @@ -442,23 +492,20 @@ export const computeSchemaComponents = (
(schemas, item) => {
schemas[capitalize(item.nameSingular)] = computeSchemaComponent({
item,
withRequiredFields: true,
forResponse: false,
withRelations: false,
forUpdate: false,
});
schemas[capitalize(item.nameSingular) + 'ForUpdate'] =
computeSchemaComponent({
item,
withRequiredFields: false,
forResponse: false,
withRelations: false,
forUpdate: true,
});
schemas[capitalize(item.nameSingular) + 'ForResponse'] =
computeSchemaComponent({
item,
withRequiredFields: false,
forResponse: true,
withRelations: true,
forUpdate: false,
});

return schemas;
Expand Down
Loading
Loading