From 6f50106fd3142a5a8c62f412dcdb3b5056cd65b6 Mon Sep 17 00:00:00 2001 From: srgooglo Date: Mon, 3 Jan 2022 18:37:29 +0100 Subject: [PATCH] refactor lib --- .../src/lib/additionsHandler/handlers/essc.js | 11 ++++ .../handlers/vaultItemFlatProperties.js | 6 ++ .../handlers/vaultItemParser.js | 17 ++++++ .../server/src/lib/additionsHandler/index.js | 22 ++++++++ packages/server/src/lib/index.js | 2 +- packages/server/src/lib/schematized/index.js | 56 +++++++++++++++---- packages/server/src/lib/selectValues/index.js | 27 --------- 7 files changed, 102 insertions(+), 39 deletions(-) create mode 100644 packages/server/src/lib/additionsHandler/handlers/essc.js create mode 100644 packages/server/src/lib/additionsHandler/handlers/vaultItemFlatProperties.js create mode 100644 packages/server/src/lib/additionsHandler/handlers/vaultItemParser.js create mode 100644 packages/server/src/lib/additionsHandler/index.js delete mode 100644 packages/server/src/lib/selectValues/index.js diff --git a/packages/server/src/lib/additionsHandler/handlers/essc.js b/packages/server/src/lib/additionsHandler/handlers/essc.js new file mode 100644 index 00000000..5b850d86 --- /dev/null +++ b/packages/server/src/lib/additionsHandler/handlers/essc.js @@ -0,0 +1,11 @@ +import { genV1 } from "../../essc" + +export default (obj) => { + obj.essc = genV1({ + type: obj.vaultItemTypeSelector ?? obj.type, + serial: obj.vaultItemSerial ?? obj.serial, + manufacturer: obj.vaultItemManufacturer ?? obj.manufacturer, + }) + + return obj +} \ No newline at end of file diff --git a/packages/server/src/lib/additionsHandler/handlers/vaultItemFlatProperties.js b/packages/server/src/lib/additionsHandler/handlers/vaultItemFlatProperties.js new file mode 100644 index 00000000..5e5346c3 --- /dev/null +++ b/packages/server/src/lib/additionsHandler/handlers/vaultItemFlatProperties.js @@ -0,0 +1,6 @@ +export default (obj) => { + return { + ...obj, + ...obj.properties, + } +} \ No newline at end of file diff --git a/packages/server/src/lib/additionsHandler/handlers/vaultItemParser.js b/packages/server/src/lib/additionsHandler/handlers/vaultItemParser.js new file mode 100644 index 00000000..91f10393 --- /dev/null +++ b/packages/server/src/lib/additionsHandler/handlers/vaultItemParser.js @@ -0,0 +1,17 @@ +export default (obj) => { + const fixedKeys = { + vaultItemManufacturer: "manufacturer", + vaultItemSerial: "serial", + vaultItemTypeSelector: "type", + vaultItemManufacturedYear: "manufacturedYear", + } + + Object.keys(obj).forEach(key => { + if (fixedKeys[key]) { + obj[fixedKeys[key]] = obj[key] + delete obj[key] + } + }) + + return obj +} \ No newline at end of file diff --git a/packages/server/src/lib/additionsHandler/index.js b/packages/server/src/lib/additionsHandler/index.js new file mode 100644 index 00000000..b4867a50 --- /dev/null +++ b/packages/server/src/lib/additionsHandler/index.js @@ -0,0 +1,22 @@ +export default async (additions, obj) => { + let query = [] + + if (Array.isArray(additions)) { + query = additions + }else { + query.push(additions) + } + + for await(let addition of query) { + try { + let script = await import(`./handlers/${addition}.js`) + script = script.default || script + + obj = await script(obj) + } catch (error) { + + } + } + + return obj +} \ No newline at end of file diff --git a/packages/server/src/lib/index.js b/packages/server/src/lib/index.js index d1e792da..39ac6379 100644 --- a/packages/server/src/lib/index.js +++ b/packages/server/src/lib/index.js @@ -1,3 +1,3 @@ export * as Token from './token' export { default as Schematized } from './schematized' -export { default as selectValues } from './selectValues' \ No newline at end of file +export { default as additionsHandler } from './additionsHandler' \ No newline at end of file diff --git a/packages/server/src/lib/schematized/index.js b/packages/server/src/lib/schematized/index.js index 27d70ceb..3137dcec 100644 --- a/packages/server/src/lib/schematized/index.js +++ b/packages/server/src/lib/schematized/index.js @@ -1,20 +1,54 @@ -export default (schema, fn) => { +export default (schema = {}, fn) => { return async (req, res, next) => { - const missingKeys = [] - const requiredKeys = Array.isArray(schema) ? schema : [] + // if is nullish + req.body = req.body ?? {} + req.query = req.query ?? {} + + if (schema.required) { + if (Array.isArray(schema.required)) { + const missingKeys = [] + const requiredKeys = Array.isArray(schema.required) ? schema.required : [] - for await (let key of requiredKeys) { - if (typeof req.body[key] === "undefined") { - missingKeys.push(key) + for await (let key of requiredKeys) { + if (typeof req.body[key] === "undefined" && typeof req.query[key] === "undefined") { + req.selection[key] = req.body[key] + continue + } + } + + if (missingKeys.length > 0) { + return res.status(400).json({ error: `Missing ${missingKeys}` }) + } + } else { + console.warn("[INVALID SCHEMA] schema.required is defined but is not an array") } } - if (missingKeys.length > 0) { - return res.status(400).json({ error: `Missing required keys > ${missingKeys}` }) - } else { - if (typeof fn === "function") { - return await fn(req, res, next) + if (schema.select) { + if (Array.isArray(schema.select)) { + if (typeof req.selection !== "object") { + req.selection = {} + } + + // assign objects along request body and query. + for await (let key of schema.select) { + if (req.body && typeof req.body[key] !== "undefined") { + req.selection[key] = req.body[key] + continue + } + + if (req.query && typeof req.query[key] !== "undefined") { + req.selection[key] = req.query[key] + continue + } + } + } else { + console.warn("[INVALID SCHEMA] schema.select is defined but is not an array") } } + + if (typeof fn === "function") { + return await fn(req, res, next) + } } } \ No newline at end of file diff --git a/packages/server/src/lib/selectValues/index.js b/packages/server/src/lib/selectValues/index.js deleted file mode 100644 index 641cf3dc..00000000 --- a/packages/server/src/lib/selectValues/index.js +++ /dev/null @@ -1,27 +0,0 @@ -export default (query = [], fn) => { - return async (req, res, next) => { - if (typeof fn === "function") { - const obj = {} - - if (!req.body) { - req.body = {} - } - if (!req.query) { - req.query = {} - } - - if (Array.isArray(query)) { - query.forEach(key => { - const value = req.body[key] ?? req.query[key] - if (typeof value !== "undefined") { - obj[key] = value - } - }) - } - - req.selectedValues = obj - - return await fn(req, res, next) - } - } -} \ No newline at end of file