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
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
8 changed files with 43 additions and 22 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -2,6 +2,8 @@
import { Injectable, LogLevel } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import { Request } from 'express';
import { EmailDriver } from 'src/integrations/email/interfaces/email.interface';
import { LoggerDriverType } from 'src/integrations/logger/interfaces';
@ -86,7 +88,19 @@ export class EnvironmentService {
}
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 {