From 7987d2977c079201fedb93d11a52652940e85f62 Mon Sep 17 00:00:00 2001 From: joostdecock Date: Sat, 25 Feb 2023 18:18:46 +0100 Subject: [PATCH] feat(backend): Added routes for API keys --- sites/backend/src/controllers/apikeys.mjs | 16 ++++++++++++++++ sites/backend/src/models/apikey.mjs | 15 +++++++++++++++ sites/backend/src/routes/apikeys.mjs | 8 ++++++++ 3 files changed, 39 insertions(+) diff --git a/sites/backend/src/controllers/apikeys.mjs b/sites/backend/src/controllers/apikeys.mjs index f45ea186bc4..20cbdddbcbe 100644 --- a/sites/backend/src/controllers/apikeys.mjs +++ b/sites/backend/src/controllers/apikeys.mjs @@ -19,6 +19,22 @@ ApikeysController.prototype.create = async (req, res, tools) => { return Apikey.sendResponse(res) } +/* + * List API keys + * + * This is the endpoint that handles listing of API keys/tokens + * See: https://freesewing.dev/reference/backend/api/apikey + */ +ApikeysController.prototype.list = async (req, res, tools) => { + const Apikey = new ApikeyModel(tools) + const apikeys = await Apikey.userApikeys(req.user.uid) + + if (apikeys) Apikey.setResponse(200, 'success', { apikeys }) + else Apikey.setResponse(404, 'notFound') + + return Apikey.sendResponse(res) +} + /* * Read API key * diff --git a/sites/backend/src/models/apikey.mjs b/sites/backend/src/models/apikey.mjs index 11ee22979fc..d6c5903a548 100644 --- a/sites/backend/src/models/apikey.mjs +++ b/sites/backend/src/models/apikey.mjs @@ -102,6 +102,21 @@ ApikeyModel.prototype.unguardedDelete = async function () { return this.setExists() } +ApikeyModel.prototype.userApikeys = async function (uid) { + if (!uid) return false + let keys + try { + keys = await this.prisma.apikey.findMany({ where: { userId: uid } }) + } catch (err) { + log.warn(`Failed to search apikeys for user ${uid}: ${err}`) + } + + return keys.map((key) => { + delete key.secret + return key + }) +} + ApikeyModel.prototype.create = async function ({ body, user }) { if (Object.keys(body).length < 1) return this.setResponse(400, 'postBodyMissing') if (!body.name) return this.setResponse(400, 'nameMissing') diff --git a/sites/backend/src/routes/apikeys.mjs b/sites/backend/src/routes/apikeys.mjs index 5b70d1256bf..b3906c41a1e 100644 --- a/sites/backend/src/routes/apikeys.mjs +++ b/sites/backend/src/routes/apikeys.mjs @@ -15,6 +15,14 @@ export function apikeysRoutes(tools) { Apikeys.create(req, res, tools) ) + // List Apikeys + app.get('/apikeys/jwt', passport.authenticate(...jwt), (req, res) => + Apikeys.list(req, res, tools) + ) + app.get('/apikeys/:id/key', passport.authenticate(...bsc), (req, res) => + Apikeys.list(req, res, tools) + ) + // Read Apikey app.get('/apikeys/:id/jwt', passport.authenticate(...jwt), (req, res) => Apikeys.read(req, res, tools)