[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:
@ -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()
|
||||
|
||||
@ -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 };
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user