71 lines
2.0 KiB
TypeScript
71 lines
2.0 KiB
TypeScript
|
import { App, AppSearch, Table, TableSearch } from "../definitions"
|
||
|
import getConfig from "next/config"
|
||
|
|
||
|
const { serverRuntimeConfig } = getConfig()
|
||
|
const apiKey = serverRuntimeConfig["apiKey"]
|
||
|
const appName = serverRuntimeConfig["appName"]
|
||
|
const host = serverRuntimeConfig["host"]
|
||
|
|
||
|
let APP: App | null = null
|
||
|
let TABLES: { [key: string]: Table } = {}
|
||
|
|
||
|
export async function makeCall(method: string, url: string, opts?: { body?: any, appId?: string }): Promise<any> {
|
||
|
const fetchOpts: any = {
|
||
|
method,
|
||
|
headers: {
|
||
|
"x-budibase-api-key": apiKey,
|
||
|
}
|
||
|
}
|
||
|
if (opts?.appId) {
|
||
|
fetchOpts.headers["x-budibase-app-id"] = opts.appId
|
||
|
}
|
||
|
if (opts?.body) {
|
||
|
fetchOpts.body = typeof opts.body !== "string" ? JSON.stringify(opts.body) : opts.body
|
||
|
fetchOpts.headers["Content-Type"] = "application/json"
|
||
|
}
|
||
|
const finalUrl = `${host}/api/public/v1/${url}`
|
||
|
const response = await fetch(finalUrl, fetchOpts)
|
||
|
if (response.ok) {
|
||
|
return response.json()
|
||
|
} else {
|
||
|
const error = await response.text()
|
||
|
console.error("Budibase server error - ", error)
|
||
|
throw new Error(error)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export async function getApp(): Promise<App> {
|
||
|
if (APP) {
|
||
|
return APP
|
||
|
}
|
||
|
const apps: AppSearch = await makeCall("post", "applications/search", {
|
||
|
body: {
|
||
|
name: appName,
|
||
|
}
|
||
|
})
|
||
|
const app = apps.data.find((app: App) => app.name === appName)
|
||
|
if (!app) {
|
||
|
throw new Error("Could not find app, please make sure app name in config is correct.")
|
||
|
}
|
||
|
APP = app
|
||
|
return app
|
||
|
}
|
||
|
|
||
|
export async function findTable(appId: string, tableName: string): Promise<Table> {
|
||
|
if (TABLES[tableName]) {
|
||
|
return TABLES[tableName]
|
||
|
}
|
||
|
const tables: TableSearch = await makeCall("post", "tables/search", {
|
||
|
body: {
|
||
|
name: tableName,
|
||
|
},
|
||
|
appId,
|
||
|
})
|
||
|
const table = tables.data.find((table: Table) => table.name === tableName)
|
||
|
if (!table) {
|
||
|
throw new Error("Could not find table, please make sure your app is configured with the Postgres datasource correctly.")
|
||
|
}
|
||
|
TABLES[tableName] = table
|
||
|
return table
|
||
|
}
|