|
|
@ -3,14 +3,7 @@ import { Query, QueryParameter } from "../../../../../definitions/datasource" |
|
|
import { OpenAPIV3 } from "openapi-types" |
|
|
import { OpenAPIV3 } from "openapi-types" |
|
|
import { OpenAPISource } from "./base/openapi" |
|
|
import { OpenAPISource } from "./base/openapi" |
|
|
import { URL } from "url" |
|
|
import { URL } from "url" |
|
|
import { |
|
|
|
|
|
getGlobalDB, |
|
|
|
|
|
getTenantId, |
|
|
|
|
|
isMultiTenant, |
|
|
|
|
|
} from "@budibase/backend-core/tenancy" |
|
|
|
|
|
import { getScopedConfig } from "@budibase/backend-core/db" |
|
|
|
|
|
|
|
|
|
|
|
const jsonMimeType = "application/json" |
|
|
|
|
|
const parameterNotRef = ( |
|
|
const parameterNotRef = ( |
|
|
param: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject |
|
|
param: OpenAPIV3.ParameterObject | OpenAPIV3.ReferenceObject |
|
|
): param is OpenAPIV3.ParameterObject => { |
|
|
): param is OpenAPIV3.ParameterObject => { |
|
|
@ -25,6 +18,13 @@ const requestBodyNotRef = ( |
|
|
return param !== undefined |
|
|
return param !== undefined |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const schemaNotRef = ( |
|
|
|
|
|
param: OpenAPIV3.SchemaObject | OpenAPIV3.ReferenceObject | undefined |
|
|
|
|
|
): param is OpenAPIV3.SchemaObject => { |
|
|
|
|
|
// all refs are deferenced by parser library
|
|
|
|
|
|
return param !== undefined |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
const isOpenAPI3 = (document: any): document is OpenAPIV3.Document => { |
|
|
const isOpenAPI3 = (document: any): document is OpenAPIV3.Document => { |
|
|
return document.openapi.includes("3") |
|
|
return document.openapi.includes("3") |
|
|
} |
|
|
} |
|
|
@ -49,9 +49,25 @@ const getRequestBody = (operation: OpenAPIV3.OperationObject) => { |
|
|
if (requestBodyNotRef(operation.requestBody)) { |
|
|
if (requestBodyNotRef(operation.requestBody)) { |
|
|
const request: OpenAPIV3.RequestBodyObject = |
|
|
const request: OpenAPIV3.RequestBodyObject = |
|
|
operation.requestBody as OpenAPIV3.RequestBodyObject |
|
|
operation.requestBody as OpenAPIV3.RequestBodyObject |
|
|
return request.content[jsonMimeType]?.example |
|
|
const supportedMimeTypes = getMimeTypes(operation) |
|
|
|
|
|
return supportedMimeTypes.length > 0 && |
|
|
|
|
|
schemaNotRef(request.content[supportedMimeTypes[0]].schema) |
|
|
|
|
|
? ( |
|
|
|
|
|
request.content[supportedMimeTypes[0]] |
|
|
|
|
|
.schema as OpenAPIV3.SchemaObject |
|
|
|
|
|
).example |
|
|
|
|
|
: undefined |
|
|
|
|
|
} |
|
|
|
|
|
return undefined |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
const getMimeTypes = (operation: OpenAPIV3.OperationObject): string[] => { |
|
|
|
|
|
if (requestBodyNotRef(operation.requestBody)) { |
|
|
|
|
|
const request: OpenAPIV3.RequestBodyObject = |
|
|
|
|
|
operation.requestBody as OpenAPIV3.RequestBodyObject |
|
|
|
|
|
return Object.keys(request.content) |
|
|
} |
|
|
} |
|
|
return null |
|
|
return [] |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/** |
|
|
/** |
|
|
@ -75,34 +91,6 @@ export class OpenAPI3 extends OpenAPISource { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
getPlatformUrl = async (): Promise<string> => { |
|
|
|
|
|
const db = getGlobalDB() |
|
|
|
|
|
const publicConfig = await getScopedConfig(db, { |
|
|
|
|
|
type: "settings", |
|
|
|
|
|
}) |
|
|
|
|
|
|
|
|
|
|
|
let url = publicConfig.platformUrl |
|
|
|
|
|
if (isMultiTenant()) { |
|
|
|
|
|
url += `/${getTenantId()}` |
|
|
|
|
|
} |
|
|
|
|
|
return url |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
getUrl = async (): Promise<URL> => { |
|
|
|
|
|
const platformUrl = await this.getPlatformUrl() |
|
|
|
|
|
let url = this.document.servers ? this.document.servers[0].url : null |
|
|
|
|
|
if (url) { |
|
|
|
|
|
// check if url is relative or absolute
|
|
|
|
|
|
if (url.includes("http") || url.includes("https")) { |
|
|
|
|
|
return new URL(url) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
return new URL(`${platformUrl}${url}`) |
|
|
|
|
|
} |
|
|
|
|
|
// if the specification doesn't contain a servers object, return the PLATFORM_URM environment variable
|
|
|
|
|
|
return new URL(platformUrl) |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
getInfo = async (): Promise<ImportInfo> => { |
|
|
getInfo = async (): Promise<ImportInfo> => { |
|
|
const name = this.document.info.title || "Swagger Import" |
|
|
const name = this.document.info.title || "Swagger Import" |
|
|
return { |
|
|
return { |
|
|
@ -111,7 +99,9 @@ export class OpenAPI3 extends OpenAPISource { |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
getQueries = async (datasourceId: string): Promise<Query[]> => { |
|
|
getQueries = async (datasourceId: string): Promise<Query[]> => { |
|
|
const url: URL = await this.getUrl() |
|
|
const url: URL | null = this.document.servers |
|
|
|
|
|
? new URL(this.document.servers[0].url) |
|
|
|
|
|
: null |
|
|
const queries: Query[] = [] |
|
|
const queries: Query[] = [] |
|
|
|
|
|
|
|
|
for (let [path, pathItemObject] of Object.entries(this.document.paths)) { |
|
|
for (let [path, pathItemObject] of Object.entries(this.document.paths)) { |
|
|
@ -138,6 +128,11 @@ export class OpenAPI3 extends OpenAPISource { |
|
|
const headers: any = {} |
|
|
const headers: any = {} |
|
|
let requestBody = getRequestBody(operation) |
|
|
let requestBody = getRequestBody(operation) |
|
|
const parameters: QueryParameter[] = [] |
|
|
const parameters: QueryParameter[] = [] |
|
|
|
|
|
const mimeTypes = getMimeTypes(operation) |
|
|
|
|
|
|
|
|
|
|
|
if (mimeTypes.length > 0) { |
|
|
|
|
|
headers["Content-Type"] = mimeTypes[0] |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
// combine the path parameters with the operation parameters
|
|
|
// combine the path parameters with the operation parameters
|
|
|
const operationParams = operation.parameters || [] |
|
|
const operationParams = operation.parameters || [] |
|
|
|