793dc3d6fc
Fixes [Dependabot Alert 85](https://github.com/twentyhq/twenty/security/dependabot/85) - prototype pollution in lodash. Added a shared pick helper (with unit tests) in twenty-shared and refactored front-end/server code to import { pick } from the shared barrel instead of lodash.pick. --------- Co-authored-by: Félix Malfait <felix.malfait@gmail.com> Co-authored-by: martmull <martmull@hotmail.fr>
63 lines
2.1 KiB
TypeScript
63 lines
2.1 KiB
TypeScript
import { Injectable } from '@nestjs/common';
|
|
|
|
import { type Request } from 'express';
|
|
import { isDefined } from 'twenty-shared/utils';
|
|
|
|
import { MCPMetadataToolsService } from 'src/engine/api/mcp/services/tools/mcp-metadata-tools.service';
|
|
import { validationSchemaManager } from 'src/engine/api/mcp/utils/get-json-schema';
|
|
import { MetadataQueryBuilderFactory } from 'src/engine/api/rest/metadata/query-builder/metadata-query-builder.factory';
|
|
import { type ObjectName } from 'src/engine/api/rest/metadata/types/metadata-entity.type';
|
|
|
|
@Injectable()
|
|
export class CreateToolsService {
|
|
constructor(
|
|
private readonly metadataQueryBuilderFactory: MetadataQueryBuilderFactory,
|
|
private readonly mCPMetadataToolsService: MCPMetadataToolsService,
|
|
) {}
|
|
|
|
get tools() {
|
|
return [
|
|
{
|
|
name: 'create-field-metadata',
|
|
description: 'Create a new field metadata',
|
|
inputSchema:
|
|
this.mCPMetadataToolsService.mergeSchemaWithCommonProperties(
|
|
validationSchemaManager.getSchemas().CreateFieldInput,
|
|
),
|
|
execute: (request: Request) => this.execute(request, 'fields'),
|
|
},
|
|
{
|
|
name: 'create-object-metadata',
|
|
description: 'Create a new object metadata',
|
|
inputSchema:
|
|
this.mCPMetadataToolsService.mergeSchemaWithCommonProperties(
|
|
validationSchemaManager.getSchemas().CreateObjectInput,
|
|
),
|
|
execute: (request: Request) => this.execute(request, 'objects'),
|
|
},
|
|
];
|
|
}
|
|
|
|
async execute(request: Request, objectName: ObjectName) {
|
|
const { fields, objects } = request.body.params.arguments;
|
|
const selectors = {
|
|
...(isDefined(fields) ? { fields } : {}),
|
|
...(isDefined(objects) ? { objects } : {}),
|
|
};
|
|
|
|
const requestContext = {
|
|
body: request.body.params.arguments,
|
|
baseUrl: this.mCPMetadataToolsService.generateBaseUrl(request),
|
|
path: `/rest/metadata/${objectName}`,
|
|
headers: request.headers,
|
|
};
|
|
|
|
const response = await this.mCPMetadataToolsService.send(
|
|
requestContext,
|
|
await this.metadataQueryBuilderFactory.create(requestContext, selectors),
|
|
);
|
|
|
|
return response.data.data;
|
|
}
|
|
}
|