chore(server): remove unused REST→GraphQL HTTP bridge (#20897)

## Summary

Removes the unused `RestApiService` HTTP bridge that posted to
`/graphql` and `/metadata` from inside the server.
This commit is contained in:
Weiko
2026-05-25 21:56:32 +02:00
committed by GitHub
parent f721420705
commit 1188ea9cd5
5 changed files with 0 additions and 118 deletions
@@ -19,14 +19,12 @@ import { RestApiUpdateManyHandler } from 'src/engine/api/rest/core/handlers/rest
import { RestApiUpdateOneHandler } from 'src/engine/api/rest/core/handlers/rest-api-update-one.handler';
import { restToCommonArgsHandlers } from 'src/engine/api/rest/core/rest-to-common-args-handlers/rest-to-common-args-handlers';
import { RestApiCoreService } from 'src/engine/api/rest/core/services/rest-api-core.service';
import { RestApiService } from 'src/engine/api/rest/rest-api.service';
import { ActorModule } from 'src/engine/core-modules/actor/actor.module';
import { ApiKeyModule } from 'src/engine/core-modules/api-key/api-key.module';
import { AuthModule } from 'src/engine/core-modules/auth/auth.module';
import { WorkspaceDomainsModule } from 'src/engine/core-modules/domain/workspace-domains/workspace-domains.module';
import { FeatureFlagModule } from 'src/engine/core-modules/feature-flag/feature-flag.module';
import { RecordTransformerModule } from 'src/engine/core-modules/record-transformer/record-transformer.module';
import { SecureHttpClientModule } from 'src/engine/core-modules/secure-http-client/secure-http-client.module';
import { WorkspaceManyOrAllFlatEntityMapsCacheModule } from 'src/engine/metadata-modules/flat-entity/services/workspace-many-or-all-flat-entity-maps-cache.module';
import { UserRoleModule } from 'src/engine/metadata-modules/user-role/user-role.module';
import { TwentyORMModule } from 'src/engine/twenty-orm/twenty-orm.module';
@@ -66,11 +64,9 @@ const restApiCoreResolvers = [
CoreCommonApiModule,
WorkspaceDomainsModule,
WorkspaceCacheModule,
SecureHttpClientModule,
],
controllers: [RestApiCoreController],
providers: [
RestApiService,
RestApiCoreService,
...restApiCoreResolvers,
...restToCommonArgsHandlers,
@@ -1,14 +0,0 @@
import { type ObjectRecordOrderBy } from 'src/engine/api/graphql/workspace-query-builder/interfaces/object-record.interface';
export type QueryVariables = {
id?: string;
ids?: string[];
data?: object | null;
filter?: object;
orderBy?: ObjectRecordOrderBy;
last?: number;
first?: number;
startingAfter?: string;
endingBefore?: string;
input?: object;
};
@@ -1,6 +0,0 @@
import { type QueryVariables } from 'src/engine/api/rest/core/types/query-variables.type';
export type Query = {
query: string;
variables: QueryVariables;
};
@@ -1,36 +0,0 @@
import { BadRequestException } from '@nestjs/common';
import { type BaseGraphQLError } from 'src/engine/core-modules/graphql/utils/graphql-errors.util';
const formatMessage = (error: BaseGraphQLError) => {
let formattedMessage = error.extensions
? error.extensions.response?.error ||
error.extensions.response ||
error.message
: error.error || error.message;
formattedMessage = formattedMessage
.replace(/"/g, "'")
.replace("Variable '$data' got i", 'I')
.replace("Variable '$input' got i", 'I');
const regex = /Field '[^']+' is not defined by type .*/;
const match = formattedMessage.match(regex);
if (match) {
formattedMessage = match[0];
}
return formattedMessage;
};
export class RestApiException extends BadRequestException {
constructor(errors: BaseGraphQLError[]) {
super({
statusCode: 400,
messages: errors.map((error) => formatMessage(error)),
error: 'Bad Request',
});
}
}
@@ -1,58 +0,0 @@
import { Injectable } from '@nestjs/common';
import { type AxiosResponse } from 'axios';
import { type Query } from 'src/engine/api/rest/core/types/query.type';
import { RestApiException } from 'src/engine/api/rest/errors/RestApiException';
import { type RequestContext } from 'src/engine/api/rest/types/RequestContext';
import { SecureHttpClientService } from 'src/engine/core-modules/secure-http-client/secure-http-client.service';
import { isDefined } from 'twenty-shared/utils';
export enum GraphqlApiType {
CORE = 'core',
METADATA = 'metadata',
}
@Injectable()
export class RestApiService {
constructor(
private readonly secureHttpClientService: SecureHttpClientService,
) {}
async call(
graphqlApiType: GraphqlApiType,
requestContext: RequestContext,
data: Query,
) {
let response: AxiosResponse;
const url = `${requestContext.baseUrl}/${
graphqlApiType === GraphqlApiType.CORE
? 'graphql'
: GraphqlApiType.METADATA
}`;
// Internal request to the server's own GraphQL endpoint
const httpClient = this.secureHttpClientService.getInternalHttpClient();
try {
response = await httpClient.post(url, data, {
headers: {
'Content-Type': 'application/json',
Authorization: requestContext.headers.authorization,
},
});
} catch (err) {
if (isDefined(err.response?.data?.errors)) {
throw new RestApiException(err.response.data.errors);
}
throw err;
}
if (isDefined(response.data.errors) && response.data.errors.length > 0) {
throw new RestApiException(response.data.errors);
}
return response;
}
}