mirror of https://github.com/Budibase/budibase.git
7 changed files with 132 additions and 1 deletions
@ -0,0 +1,55 @@ |
|||
<script> |
|||
import { Input, Button } from "@budibase/bbui" |
|||
import { store } from "builderStore" |
|||
import api from "builderStore/api" |
|||
import Title from "../TabTitle.svelte" |
|||
|
|||
let keys = { budibase: "", sendGrid: "" } |
|||
|
|||
async function updateKey([key, value]) { |
|||
const response = await api.put(`/api/keys/${key}`, { value }) |
|||
const res = await response.json() |
|||
keys = { ...keys, ...res } |
|||
} |
|||
|
|||
// Get Keys |
|||
async function fetchKeys() { |
|||
const response = await api.get(`/api/keys/`) |
|||
const res = await response.json() |
|||
keys = res |
|||
} |
|||
|
|||
fetchKeys() |
|||
</script> |
|||
|
|||
<Title>API Keys</Title> |
|||
<div class="container"> |
|||
<div class="background"> |
|||
<Input |
|||
on:save={e => updateKey(['budibase', e.detail])} |
|||
thin |
|||
edit |
|||
value={keys.budibase} |
|||
label="Budibase" /> |
|||
</div> |
|||
<div class="background"> |
|||
<Input |
|||
on:save={e => updateKey(['sendgrid', e.detail])} |
|||
thin |
|||
edit |
|||
value={keys.sendgrid} |
|||
label="Sendgrid" /> |
|||
</div> |
|||
</div> |
|||
|
|||
<style> |
|||
.container { |
|||
display: grid; |
|||
grid-gap: var(--space); |
|||
} |
|||
.background { |
|||
border-radius: 5px; |
|||
background-color: var(--light-grey); |
|||
padding: 12px 12px 18px 12px; |
|||
} |
|||
</style> |
|||
@ -0,0 +1,52 @@ |
|||
const fs = require("fs") |
|||
const readline = require("readline") |
|||
const { budibaseAppsDir } = require("../../utilities/budibaseDir") |
|||
const ENV_FILE_PATH = "/.env" |
|||
|
|||
exports.fetch = async function(ctx) { |
|||
ctx.status = 200 |
|||
ctx.body = { |
|||
budibase: process.env.BUDIBASE_API_KEY, |
|||
sendgrid: process.env.SENDGRID_API_KEY, |
|||
} |
|||
} |
|||
|
|||
exports.update = async function(ctx) { |
|||
const key = `${ctx.params.key.toUpperCase()}_API_KEY` |
|||
const value = ctx.request.body.value |
|||
// Set process.env
|
|||
process.env[key] = value |
|||
|
|||
// Write to file
|
|||
await updateValues([key, value]) |
|||
|
|||
ctx.status = 200 |
|||
ctx.message = `Updated ${ctx.params.key} API key succesfully.` |
|||
ctx.body = { [ctx.params.key]: ctx.request.body.value } |
|||
} |
|||
|
|||
async function updateValues([key, value]) { |
|||
let newContent = "" |
|||
let keyExists = false |
|||
const readInterface = readline.createInterface({ |
|||
input: fs.createReadStream(`${budibaseAppsDir()}/${ENV_FILE_PATH}`), |
|||
output: process.stdout, |
|||
console: false, |
|||
}) |
|||
readInterface.on("line", function(line) { |
|||
// Mutate lines and change API Key
|
|||
if (line.startsWith(key)) { |
|||
line = `${key}=${value}` |
|||
keyExists = true |
|||
} |
|||
newContent = `${newContent}\n${line}` |
|||
}) |
|||
readInterface.on("close", function() { |
|||
// Write file here
|
|||
if (!keyExists) { |
|||
// Add API Key if it doesn't exist in the file at all
|
|||
newContent = `${newContent}\n${key}=${value}` |
|||
} |
|||
fs.writeFileSync(`${budibaseAppsDir()}/${ENV_FILE_PATH}`, newContent) |
|||
}) |
|||
} |
|||
@ -0,0 +1,12 @@ |
|||
const Router = require("@koa/router") |
|||
const controller = require("../controllers/apikeys") |
|||
const authorized = require("../../middleware/authorized") |
|||
const { BUILDER } = require("../../utilities/accessLevels") |
|||
|
|||
const router = Router() |
|||
|
|||
router |
|||
.get("/api/keys", authorized(BUILDER), controller.fetch) |
|||
.put("/api/keys/:key", authorized(BUILDER), controller.update) |
|||
|
|||
module.exports = router |
|||
Loading…
Reference in new issue