fix serverurl in openapi docs for self hosted instance (#4390)

* fix serverurl in openapi docs for self hosted instance

* fixed server url slash, moved calculation to enviroment function, fixed openapi path hardcoded api.twenty.com
This commit is contained in:
brendanlaschke
2024-03-13 12:13:45 +01:00
committed by GitHub
parent d8b370720c
commit f847b64fd1
8 changed files with 43 additions and 22 deletions

View File

@ -48,10 +48,13 @@ const TokenForm = ({
await submitToken(event.target.value); await submitToken(event.target.value);
}; };
const updateBaseUrl = (baseUrl) => { const updateBaseUrl = (baseUrl: string) => {
setBaseUrl(baseUrl); const url = baseUrl?.endsWith('/')
submitBaseUrl?.(baseUrl); ? baseUrl.substring(0, baseUrl.length - 1)
localStorage.setItem('baseUrl', JSON.stringify({ baseUrl: baseUrl })); : baseUrl;
setBaseUrl(url);
submitBaseUrl?.(url);
localStorage.setItem('baseUrl', JSON.stringify({ baseUrl: url }));
}; };
const validateToken = (openApiJson) => { const validateToken = (openApiJson) => {

View File

@ -22,9 +22,7 @@ export class ApiRestService {
request: Request, request: Request,
data: ApiRestQuery, data: ApiRestQuery,
): Promise<ApiRestResponse> { ): Promise<ApiRestResponse> {
const baseUrl = const baseUrl = this.environmentService.getBaseUrl(request);
this.environmentService.getServerUrl() ||
`${request.protocol}://${request.get('host')}`;
try { try {
return await this.httpService.axiosRef.post(`${baseUrl}/graphql`, data, { return await this.httpService.axiosRef.post(`${baseUrl}/graphql`, data, {

View File

@ -18,9 +18,7 @@ export class ApiRestMetadataService {
) {} ) {}
async callMetadata(request, data: ApiRestQuery) { async callMetadata(request, data: ApiRestQuery) {
const baseUrl = const baseUrl = this.environmentService.getBaseUrl(request);
this.environmentService.getServerUrl() ||
`${request.protocol}://${request.get('host')}`;
try { try {
return await this.httpService.axiosRef.post(`${baseUrl}/metadata`, data, { return await this.httpService.axiosRef.post(`${baseUrl}/metadata`, data, {

View File

@ -23,7 +23,7 @@ export class OpenApiController {
@Req() request: Request, @Req() request: Request,
@Res() res: Response, @Res() res: Response,
) { ) {
const data = await this.openApiService.generateMetaDataSchema(); const data = await this.openApiService.generateMetaDataSchema(request);
res.send(data); res.send(data);
} }

View File

@ -25,16 +25,20 @@ import {
getSingleResultSuccessResponse, getSingleResultSuccessResponse,
} from 'src/core/open-api/utils/responses.utils'; } from 'src/core/open-api/utils/responses.utils';
import { getRequestBody } from 'src/core/open-api/utils/request-body.utils'; import { getRequestBody } from 'src/core/open-api/utils/request-body.utils';
import { EnvironmentService } from 'src/integrations/environment/environment.service';
@Injectable() @Injectable()
export class OpenApiService { export class OpenApiService {
constructor( constructor(
private readonly tokenService: TokenService, private readonly tokenService: TokenService,
private readonly environmentService: EnvironmentService,
private readonly objectMetadataService: ObjectMetadataService, private readonly objectMetadataService: ObjectMetadataService,
) {} ) {}
async generateCoreSchema(request: Request): Promise<OpenAPIV3_1.Document> { async generateCoreSchema(request: Request): Promise<OpenAPIV3_1.Document> {
const schema = baseSchema('core'); const baseUrl = this.environmentService.getBaseUrl(request);
const schema = baseSchema('core', baseUrl);
let objectMetadataItems; let objectMetadataItems;
@ -86,9 +90,12 @@ export class OpenApiService {
return schema; return schema;
} }
async generateMetaDataSchema(): Promise<OpenAPIV3_1.Document> { async generateMetaDataSchema(
//TODO Add once Rest MetaData api is ready request: Request,
const schema = baseSchema('metadata'); ): Promise<OpenAPIV3_1.Document> {
const baseUrl = this.environmentService.getBaseUrl(request);
const schema = baseSchema('metadata', baseUrl);
schema.tags = [{ name: 'placeholder' }]; schema.tags = [{ name: 'placeholder' }];

View File

@ -4,6 +4,7 @@ import { computeOpenApiPath } from 'src/core/open-api/utils/path.utils';
export const baseSchema = ( export const baseSchema = (
schemaName: 'core' | 'metadata', schemaName: 'core' | 'metadata',
serverUrl: string,
): OpenAPIV3_1.Document => { ): OpenAPIV3_1.Document => {
return { return {
openapi: '3.0.3', openapi: '3.0.3',
@ -23,9 +24,7 @@ export const baseSchema = (
// Testing purposes // Testing purposes
servers: [ servers: [
{ {
url: `https://api.twenty.com/rest/${ url: `${serverUrl}/rest/${schemaName !== 'core' ? schemaName : ''}`,
schemaName !== 'core' ? schemaName : ''
}`,
description: 'Production Development', description: 'Production Development',
}, },
], ],
@ -49,6 +48,6 @@ export const baseSchema = (
description: 'Find out more about **Twenty**', description: 'Find out more about **Twenty**',
url: 'https://twenty.com', url: 'https://twenty.com',
}, },
paths: { [`/open-api/${schemaName}`]: computeOpenApiPath() }, paths: { [`/open-api/${schemaName}`]: computeOpenApiPath(serverUrl) },
}; };
}; };

View File

@ -95,7 +95,9 @@ export const computeSingleResultPath = (
} as OpenAPIV3_1.PathItemObject; } as OpenAPIV3_1.PathItemObject;
}; };
export const computeOpenApiPath = (): OpenAPIV3_1.PathItemObject => { export const computeOpenApiPath = (
serverUrl: string,
): OpenAPIV3_1.PathItemObject => {
return { return {
get: { get: {
tags: ['General'], tags: ['General'],
@ -103,7 +105,7 @@ export const computeOpenApiPath = (): OpenAPIV3_1.PathItemObject => {
operationId: 'GetOpenApiSchema', operationId: 'GetOpenApiSchema',
servers: [ servers: [
{ {
url: 'https://api.twenty.com/', url: serverUrl,
}, },
], ],
responses: { responses: {

View File

@ -2,6 +2,8 @@
import { Injectable, LogLevel } from '@nestjs/common'; import { Injectable, LogLevel } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { Request } from 'express';
import { EmailDriver } from 'src/integrations/email/interfaces/email.interface'; import { EmailDriver } from 'src/integrations/email/interfaces/email.interface';
import { LoggerDriverType } from 'src/integrations/logger/interfaces'; import { LoggerDriverType } from 'src/integrations/logger/interfaces';
@ -86,7 +88,19 @@ export class EnvironmentService {
} }
getServerUrl(): string { getServerUrl(): string {
return this.configService.get<string>('SERVER_URL')!; const url = this.configService.get<string>('SERVER_URL')!;
if (url?.endsWith('/')) {
return url.substring(0, url.length - 1);
}
return url;
}
getBaseUrl(request: Request): string {
return (
this.getServerUrl() || `${request.protocol}://${request.get('host')}`
);
} }
getAccessTokenSecret(): string { getAccessTokenSecret(): string {