Editting readme for example and linting example.
This commit is contained in:
parent
418c00c52a
commit
169df4f337
|
@ -1,8 +1,24 @@
|
||||||
This is a [Next.js](https://nextjs.org/) project bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
### Budibase API Next.js example
|
||||||
|
|
||||||
|
This is an example of how Budibase can be used as a backend for a Postgres database for a Next.js sales app. You will
|
||||||
|
need to follow the walk-through that has been published on the Budibase blog to set up your Budibase app for this example.
|
||||||
|
|
||||||
|
## Pre-requisites
|
||||||
|
|
||||||
|
To use this example you will need [Docker](https://www.docker.com/), [Docker Compose](https://docs.docker.com/compose/) and [Node.js](https://nodejs.org/en/) installed.
|
||||||
|
|
||||||
## Getting Started
|
## Getting Started
|
||||||
|
|
||||||
First, run the development server:
|
The first step is to set up the database - you can do this by going to the `db/` directory and running the command:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
docker-compose up
|
||||||
|
```
|
||||||
|
|
||||||
|
The next step is to follow the example walk-through and set up a Budibase app as it describes. Once you've done
|
||||||
|
this you can configure the settings in `next.config.js`, specifically the `apiKey`, `host` and `appName`.
|
||||||
|
|
||||||
|
Finally, you can start the dev server with the following command:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm run dev
|
npm run dev
|
||||||
|
@ -10,10 +26,12 @@ npm run dev
|
||||||
yarn dev
|
yarn dev
|
||||||
```
|
```
|
||||||
|
|
||||||
Open [http://localhost:3000](http://localhost:3000) with your browser to see the result.
|
## Accessing the app
|
||||||
|
|
||||||
You can start editing the page by modifying `pages/index.tsx`. The page auto-updates as you edit the file.
|
Open [http://localhost:3001](http://localhost:3001) with your browser to see the sales app.
|
||||||
|
|
||||||
[API routes](https://nextjs.org/docs/api-routes/introduction) can be accessed on [http://localhost:3000/api/hello](http://localhost:3000/api/hello). This endpoint can be edited in `pages/api/hello.ts`.
|
Look in the API routes (`pages/api/sales.ts` and `pages/api/salespeople.ts`) to see how this is integrated with Budibase.
|
||||||
|
There is also a utility file where some core functions and types have been defined, in `utilities/index.ts`.
|
||||||
|
|
||||||
The `pages/api` directory is mapped to `/api/*`. Files in this directory are treated as [API routes](https://nextjs.org/docs/api-routes/introduction) instead of React pages.
|
## Attribution
|
||||||
|
This example was set up using [Next.js](https://nextjs.org/) and bootstrapped with [`create-next-app`](https://github.com/vercel/next.js/tree/canary/packages/create-next-app).
|
|
@ -9,7 +9,7 @@ const notifications = {
|
||||||
title: title,
|
title: title,
|
||||||
dismiss: {
|
dismiss: {
|
||||||
duration: 10000,
|
duration: 10000,
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
},
|
},
|
||||||
success: (message: string, title: string) => {
|
success: (message: string, title: string) => {
|
||||||
|
@ -20,9 +20,9 @@ const notifications = {
|
||||||
title: title,
|
title: title,
|
||||||
dismiss: {
|
dismiss: {
|
||||||
duration: 3000,
|
duration: 3000,
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
export default notifications
|
export default notifications
|
||||||
|
|
|
@ -4,4 +4,4 @@ export type App = components["schemas"]["applicationOutput"]["data"]
|
||||||
export type Table = components["schemas"]["tableOutput"]["data"]
|
export type Table = components["schemas"]["tableOutput"]["data"]
|
||||||
export type TableSearch = components["schemas"]["tableSearch"]
|
export type TableSearch = components["schemas"]["tableSearch"]
|
||||||
export type AppSearch = components["schemas"]["applicationSearch"]
|
export type AppSearch = components["schemas"]["applicationSearch"]
|
||||||
export type RowSearch = components["schemas"]["searchOutput"]
|
export type RowSearch = components["schemas"]["searchOutput"]
|
||||||
|
|
|
@ -3,13 +3,14 @@ const { join } = require("path")
|
||||||
const nextConfig = {
|
const nextConfig = {
|
||||||
reactStrictMode: true,
|
reactStrictMode: true,
|
||||||
sassOptions: {
|
sassOptions: {
|
||||||
includePaths: [join(__dirname, "styles")]
|
includePaths: [join(__dirname, "styles")],
|
||||||
},
|
},
|
||||||
serverRuntimeConfig: {
|
serverRuntimeConfig: {
|
||||||
apiKey: "",
|
apiKey:
|
||||||
|
"bf4d86af933b5ac0af0fdbe4bf7d89ff-f929752a1eeaafb00f4b5e3325097d51a44fe4b39f22ed857923409cc75414b379323a25ebfb4916",
|
||||||
appName: "sales",
|
appName: "sales",
|
||||||
host: "http://localhost:10000"
|
host: "http://localhost:10000",
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = nextConfig
|
module.exports = nextConfig
|
||||||
|
|
|
@ -15,7 +15,7 @@ async function getSales(req: any) {
|
||||||
},
|
},
|
||||||
paginate: true,
|
paginate: true,
|
||||||
bookmark: parseInt(page),
|
bookmark: parseInt(page),
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -43,4 +43,4 @@ export default async function handler(req: any, res: any) {
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
res.status(400).send(err)
|
res.status(400).send(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -11,7 +11,7 @@ async function getSalespeople() {
|
||||||
order: "ascending",
|
order: "ascending",
|
||||||
column: "person_id",
|
column: "person_id",
|
||||||
},
|
},
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -28,4 +28,4 @@ export default async function handler(req: any, res: any) {
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
res.status(400).send(err)
|
res.status(400).send(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,18 +9,23 @@ const host = serverRuntimeConfig["host"]
|
||||||
let APP: App | null = null
|
let APP: App | null = null
|
||||||
let TABLES: { [key: string]: Table } = {}
|
let TABLES: { [key: string]: Table } = {}
|
||||||
|
|
||||||
export async function makeCall(method: string, url: string, opts?: { body?: any, appId?: string }): Promise<any> {
|
export async function makeCall(
|
||||||
|
method: string,
|
||||||
|
url: string,
|
||||||
|
opts?: { body?: any; appId?: string }
|
||||||
|
): Promise<any> {
|
||||||
const fetchOpts: any = {
|
const fetchOpts: any = {
|
||||||
method,
|
method,
|
||||||
headers: {
|
headers: {
|
||||||
"x-budibase-api-key": apiKey,
|
"x-budibase-api-key": apiKey,
|
||||||
}
|
},
|
||||||
}
|
}
|
||||||
if (opts?.appId) {
|
if (opts?.appId) {
|
||||||
fetchOpts.headers["x-budibase-app-id"] = opts.appId
|
fetchOpts.headers["x-budibase-app-id"] = opts.appId
|
||||||
}
|
}
|
||||||
if (opts?.body) {
|
if (opts?.body) {
|
||||||
fetchOpts.body = typeof opts.body !== "string" ? JSON.stringify(opts.body) : opts.body
|
fetchOpts.body =
|
||||||
|
typeof opts.body !== "string" ? JSON.stringify(opts.body) : opts.body
|
||||||
fetchOpts.headers["Content-Type"] = "application/json"
|
fetchOpts.headers["Content-Type"] = "application/json"
|
||||||
}
|
}
|
||||||
const finalUrl = `${host}/api/public/v1/${url}`
|
const finalUrl = `${host}/api/public/v1/${url}`
|
||||||
|
@ -41,17 +46,22 @@ export async function getApp(): Promise<App> {
|
||||||
const apps: AppSearch = await makeCall("post", "applications/search", {
|
const apps: AppSearch = await makeCall("post", "applications/search", {
|
||||||
body: {
|
body: {
|
||||||
name: appName,
|
name: appName,
|
||||||
}
|
},
|
||||||
})
|
})
|
||||||
const app = apps.data.find((app: App) => app.name === appName)
|
const app = apps.data.find((app: App) => app.name === appName)
|
||||||
if (!app) {
|
if (!app) {
|
||||||
throw new Error("Could not find app, please make sure app name in config is correct.")
|
throw new Error(
|
||||||
|
"Could not find app, please make sure app name in config is correct."
|
||||||
|
)
|
||||||
}
|
}
|
||||||
APP = app
|
APP = app
|
||||||
return app
|
return app
|
||||||
}
|
}
|
||||||
|
|
||||||
export async function findTable(appId: string, tableName: string): Promise<Table> {
|
export async function findTable(
|
||||||
|
appId: string,
|
||||||
|
tableName: string
|
||||||
|
): Promise<Table> {
|
||||||
if (TABLES[tableName]) {
|
if (TABLES[tableName]) {
|
||||||
return TABLES[tableName]
|
return TABLES[tableName]
|
||||||
}
|
}
|
||||||
|
@ -63,7 +73,9 @@ export async function findTable(appId: string, tableName: string): Promise<Table
|
||||||
})
|
})
|
||||||
const table = tables.data.find((table: Table) => table.name === tableName)
|
const table = tables.data.find((table: Table) => table.name === tableName)
|
||||||
if (!table) {
|
if (!table) {
|
||||||
throw new Error("Could not find table, please make sure your app is configured with the Postgres datasource correctly.")
|
throw new Error(
|
||||||
|
"Could not find table, please make sure your app is configured with the Postgres datasource correctly."
|
||||||
|
)
|
||||||
}
|
}
|
||||||
TABLES[tableName] = table
|
TABLES[tableName] = table
|
||||||
return table
|
return table
|
||||||
|
|
|
@ -39,7 +39,7 @@
|
||||||
"lint:prettier": "prettier --check \"packages/**/*.{js,ts,svelte}\"",
|
"lint:prettier": "prettier --check \"packages/**/*.{js,ts,svelte}\"",
|
||||||
"lint": "yarn run lint:eslint && yarn run lint:prettier",
|
"lint": "yarn run lint:eslint && yarn run lint:prettier",
|
||||||
"lint:fix:eslint": "eslint --fix packages",
|
"lint:fix:eslint": "eslint --fix packages",
|
||||||
"lint:fix:prettier": "prettier --write \"packages/**/*.{js,ts,svelte}\"",
|
"lint:fix:prettier": "prettier --write \"packages/**/*.{js,ts,svelte}\" && prettier --write \"examples/**/*.{js,ts,svelte}\"",
|
||||||
"lint:fix:ts": "lerna run lint:fix",
|
"lint:fix:ts": "lerna run lint:fix",
|
||||||
"lint:fix": "yarn run lint:fix:ts && yarn run lint:fix:prettier && yarn run lint:fix:eslint",
|
"lint:fix": "yarn run lint:fix:ts && yarn run lint:fix:prettier && yarn run lint:fix:eslint",
|
||||||
"test:e2e": "lerna run cy:test --stream",
|
"test:e2e": "lerna run cy:test --stream",
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue