[2/n]: Rest API -> TwentyORM migration POST rest/* (#9986)

# This PR

- Addressing #3644 
- Migrates the `POST rest/*` endpoint to use TwentyORM directly
- Adds integration tests
- Refactors common login in the v2 service file
- Refactors test utility files
This commit is contained in:
P A C · 先生
2025-02-04 13:36:52 +02:00
committed by GitHub
parent 40f43a4076
commit a5e27aa751
6 changed files with 195 additions and 64 deletions

View File

@ -15,10 +15,10 @@ import { Request, Response } from 'express';
import { RestApiCoreServiceV2 } from 'src/engine/api/rest/core/rest-api-core-v2.service';
import { RestApiCoreService } from 'src/engine/api/rest/core/rest-api-core.service';
import { RestApiExceptionFilter } from 'src/engine/api/rest/rest-api-exception.filter';
import { cleanGraphQLResponse } from 'src/engine/api/rest/utils/clean-graphql-response.utils';
import { JwtAuthGuard } from 'src/engine/guards/jwt-auth.guard';
import { WorkspaceAuthGuard } from 'src/engine/guards/workspace-auth.guard';
import { RestApiExceptionFilter } from 'src/engine/api/rest/rest-api-exception.filter';
@Controller('rest/*')
@UseGuards(JwtAuthGuard, WorkspaceAuthGuard)
@ -53,10 +53,11 @@ export class RestApiCoreController {
}
@Post()
@UseFilters(RestApiExceptionFilter)
async handleApiPost(@Req() request: Request, @Res() res: Response) {
const result = await this.restApiCoreService.createOne(request);
const result = await this.restApiCoreServiceV2.createOne(request);
res.status(201).send(cleanGraphQLResponse(result.data.data));
res.status(201).send(result);
}
@Patch()

View File

@ -15,39 +15,16 @@ export class RestApiCoreServiceV2 {
) {}
async delete(request: Request) {
const { workspace } = request;
const { object: parsedObject, id: recordId } = parseCorePath(request);
const objectMetadata = await this.coreQueryBuilderFactory.getObjectMetadata(
request,
parsedObject,
);
if (!objectMetadata) {
throw new BadRequestException('Object metadata not found');
}
const { id: recordId } = parseCorePath(request);
if (!recordId) {
throw new BadRequestException('Record ID not found');
}
const objectMetadataNameSingular =
objectMetadata.objectMetadataItem.nameSingular;
if (!workspace?.id) {
throw new BadRequestException('Workspace not found');
}
const repository =
await this.twentyORMGlobalManager.getRepositoryForWorkspace(
workspace.id,
objectMetadataNameSingular,
);
const { objectMetadataNameSingular, repository } =
await this.getRepositoryAndMetadataOrFail(request);
const recordToDelete = await repository.findOneOrFail({
where: {
id: recordId,
},
where: { id: recordId },
});
await repository.delete(recordId);
@ -57,6 +34,20 @@ export class RestApiCoreServiceV2 {
});
}
async createOne(request: Request) {
const { body } = request;
const { objectMetadataNameSingular, repository } =
await this.getRepositoryAndMetadataOrFail(request);
const createdRecord = await repository.save(body);
return this.formatResult(
'create',
objectMetadataNameSingular,
createdRecord,
);
}
private formatResult<T>(
operation: 'delete' | 'create' | 'update' | 'find',
objectNameSingular: string,
@ -70,4 +61,32 @@ export class RestApiCoreServiceV2 {
return result;
}
private async getRepositoryAndMetadataOrFail(request: Request) {
const { workspace } = request;
const { object: parsedObject } = parseCorePath(request);
const objectMetadata = await this.coreQueryBuilderFactory.getObjectMetadata(
request,
parsedObject,
);
if (!objectMetadata) {
throw new BadRequestException('Object metadata not found');
}
if (!workspace?.id) {
throw new BadRequestException('Workspace not found');
}
const objectMetadataNameSingular =
objectMetadata.objectMetadataItem.nameSingular;
const repository =
await this.twentyORMGlobalManager.getRepositoryForWorkspace(
workspace.id,
objectMetadataNameSingular,
);
return { objectMetadataNameSingular, repository };
}
}