From c51ed1ba8ff9ee32859b4079836bc3d2f0b720b0 Mon Sep 17 00:00:00 2001 From: "Peter.Morton" Date: Thu, 12 Oct 2023 20:34:26 -0500 Subject: [PATCH] Added configurable store for local-storage or redis --- .env | 1 + package-lock.json | 27 +++++++++++++++ package.json | 1 + src/api/routes/auth.js | 4 +-- src/api/routes/interactions-flow.js | 2 +- src/api/routes/tps.js | 2 +- src/utils/store.js | 51 +++++++++++++++++++++++++---- 7 files changed, 77 insertions(+), 11 deletions(-) diff --git a/.env b/.env index b4e2dd9..b8fea6a 100644 --- a/.env +++ b/.env @@ -9,4 +9,5 @@ EO_API_UDG_URL = unified-data-gateway/default/graphql JWT_SECRET = 12356789 PORT = 3000 +STORE = local-storage REDIS_URL = redis://localhost:6379 \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index af5f2bf..ed4cf75 100644 --- a/package-lock.json +++ b/package-lock.json @@ -25,6 +25,7 @@ "local-storage": "^2.0.0", "morgan": "^1.10.0", "nodemon": "^3.0.1", + "promise": "^8.3.0", "query-string": "^7.1.1", "redis": "^4.6.7", "winston": "^3.9.0" @@ -483,6 +484,11 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "node_modules/asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -3128,6 +3134,14 @@ "url": "https://github.com/prettier/prettier?sponsor=1" } }, + "node_modules/promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "dependencies": { + "asap": "~2.0.6" + } + }, "node_modules/proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", @@ -4345,6 +4359,11 @@ "es-shim-unscopables": "^1.0.0" } }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "asn1.js": { "version": "5.4.1", "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-5.4.1.tgz", @@ -6295,6 +6314,14 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true }, + "promise": { + "version": "8.3.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-8.3.0.tgz", + "integrity": "sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==", + "requires": { + "asap": "~2.0.6" + } + }, "proxy-addr": { "version": "2.0.7", "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", diff --git a/package.json b/package.json index 9b1bea0..a0f2d23 100644 --- a/package.json +++ b/package.json @@ -32,6 +32,7 @@ "local-storage": "^2.0.0", "morgan": "^1.10.0", "nodemon": "^3.0.1", + "promise": "^8.3.0", "query-string": "^7.1.1", "redis": "^4.6.7", "winston": "^3.9.0" diff --git a/src/api/routes/auth.js b/src/api/routes/auth.js index 4513d78..3055713 100644 --- a/src/api/routes/auth.js +++ b/src/api/routes/auth.js @@ -78,13 +78,13 @@ router.all("/", (req, res, next) => { `Adding agent ${verified.sub} to store for environment ${authDataString}}` ); store - .hSet(verified.sub, authData) + .set(verified.sub, authData) .then(() => { if (sessionIdentifier && sessionIdentifier.length > 0) { logger.info( `Adding sessionIdentifier ${sessionIdentifier} to store for environment ${authDataString}` ); - return store.hSet(sessionIdentifier, authData); + return store.set(sessionIdentifier, authData); } }) .then(() => { diff --git a/src/api/routes/interactions-flow.js b/src/api/routes/interactions-flow.js index d9830da..0b7eb73 100644 --- a/src/api/routes/interactions-flow.js +++ b/src/api/routes/interactions-flow.js @@ -33,7 +33,7 @@ router.get("/", async (req, res) => { // FIX for 'endTime' parameter cannot be later than one minute prior to now. endTime.setMinutes(endTime.getMinutes() - 1); - const auth = await store.hGetAll(req.query.authKey); + const auth = await store.get(req.query.authKey); const { host, tenant, token } = auth; axios .post( diff --git a/src/api/routes/tps.js b/src/api/routes/tps.js index 6ea71d9..54621ce 100644 --- a/src/api/routes/tps.js +++ b/src/api/routes/tps.js @@ -6,7 +6,7 @@ import createHttpError from "http-errors"; const router = Router(); router.get("/", async (req, res, next) => { - const auth = await store.hGetAll(req.query.authKey); + const auth = await store.get(req.query.authKey); if (isEmpty(auth)) { next( diff --git a/src/utils/store.js b/src/utils/store.js index 1cc7033..3fed32e 100644 --- a/src/utils/store.js +++ b/src/utils/store.js @@ -1,14 +1,51 @@ import { createClient } from "redis"; +import localStorage from "local-storage"; import config from "../config/index.js"; import { logger } from "./index.js"; +import Promise from "promise"; -const client = createClient({ - url: config.redis.url, -}); +const store = await createStore(); -client.on("error", (err) => logger.error("Redis Client Error", err)); +async function createStore() { + if (process.env.STORE === "redis") { + return { + client: await createRedisClient(), -await client.connect(); -logger.info(`Connect store to ${config.redis.url}`); + set: async function (key, value) { + return this.client.hSet(key, value); + }, + get: async function (key) { + return this.client.hGetAll(key); + }, + }; + } else { + return { + set: function (key, value) { + return new Promise(function (resolve, reject) { + if (localStorage(key, value)) resolve(true); + else reject(Error("unable to set using local-storage")); + }); + }, + get: function (key) { + return new Promise(function (resolve) { + resolve(localStorage(key)); + }); + }, + }; + } +} -export default client; +async function createRedisClient() { + const client = createClient({ + url: config.redis.url, + }); + + client.on("error", (err) => logger.error("Redis Client Error", err)); + + await client.connect(); + logger.info(`Connect store to ${config.redis.url}`); + + return client; +} + +export default store;