forked from tsai/budibase
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