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:
@ -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) => {
|
||||||
|
|||||||
@ -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, {
|
||||||
|
|||||||
@ -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, {
|
||||||
|
|||||||
@ -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);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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' }];
|
||||||
|
|
||||||
|
|||||||
@ -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) },
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|||||||
@ -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: {
|
||||||
|
|||||||
@ -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 {
|
||||||
|
|||||||
Reference in New Issue
Block a user