tidying up redis' remains while shifting to sqlite, DRYer 500 responses

This commit is contained in:
Kaushik Narayan R 2024-07-24 20:09:54 +05:30
parent 5803c997b2
commit 40cf0c2e2b
8 changed files with 1285 additions and 114 deletions

3
.gitignore vendored
View File

@ -104,3 +104,6 @@ dist
# TernJS port file # TernJS port file
.tern-port .tern-port
# SQLite db
*.db

View File

@ -11,7 +11,7 @@ const __controller_func = async (req, res) => {
} catch (error) { } catch (error) {
logger.error('__controller_func', { error }); logger.error('__controller_func', { error });
return res.status(500).send({ message: "Server Error. Try again." }); return res.sendStatus(500);
} }
} }

View File

@ -29,7 +29,7 @@ const login = (_req, res) => {
); );
} catch (error) { } catch (error) {
logger.error('login', { error }); logger.error('login', { error });
return res.status(500).send({ message: "Server Error. Try again." }); return res.sendStatus(500);
} }
} }
@ -68,7 +68,7 @@ const callback = async (req, res) => {
logger.info('New login.'); logger.info('New login.');
req.session.accessToken = response.data.access_token; req.session.accessToken = response.data.access_token;
req.session.refreshToken = response.data.refresh_token; req.session.refreshToken = response.data.refresh_token;
req.session.cookie.maxAge = 7776000000 // 90 days, arbitrary req.session.cookie.maxAge = 7 * 24 * 60 * 60 * 1000 // 1 week
req.session.save((err) => { req.session.save((err) => {
if (err) { if (err) {
@ -87,7 +87,7 @@ const callback = async (req, res) => {
} }
} catch (error) { } catch (error) {
logger.error('callback', { error }); logger.error('callback', { error });
return res.status(500).send({ message: "Server Error. Try again." }); return res.sendStatus(500);
} }
} }
@ -110,7 +110,7 @@ const refresh = async (req, res) => {
if (response.status === 200) { if (response.status === 200) {
req.session.accessToken = response.data.access_token; req.session.accessToken = response.data.access_token;
req.session.refreshToken = response.data.refresh_token ?? req.session.refreshToken; // refresh token rotation req.session.refreshToken = response.data.refresh_token ?? req.session.refreshToken; // refresh token rotation
req.session.cookie.maxAge = 7776000000 // 90 days, arbitrary req.session.cookie.maxAge = 7 * 24 * 60 * 60 * 1000 // 1 week
logger.info(`Access token refreshed${(response.data.refresh_token !== null) ? ' and refresh token updated' : ''}.`); logger.info(`Access token refreshed${(response.data.refresh_token !== null) ? ' and refresh token updated' : ''}.`);
return res.status(200).send({ return res.status(200).send({
@ -122,7 +122,7 @@ const refresh = async (req, res) => {
} }
} catch (error) { } catch (error) {
logger.error('refresh', { error }); logger.error('refresh', { error });
return res.status(500).send({ message: "Server Error. Try again." }); return res.sendStatus(500);
} }
}; };
@ -134,7 +134,7 @@ const refresh = async (req, res) => {
const logout = async (req, res) => { const logout = async (req, res) => {
try { try {
const delSession = req.session.destroy((err) => { const delSession = req.session.destroy((err) => {
if (Object.keys(err).length) { // err is empty obj if no error if (err) {
logger.error("Error while logging out", { err }); logger.error("Error while logging out", { err });
return res.sendStatus(500); return res.sendStatus(500);
} else { } else {
@ -145,7 +145,7 @@ const logout = async (req, res) => {
}) })
} catch (error) { } catch (error) {
logger.error('logout', { error }); logger.error('logout', { error });
return res.status(500).send({ message: "Server Error. Try again." }); return res.sendStatus(500);
} }
} }

View File

@ -73,7 +73,7 @@ const getUserPlaylists = async (req, res) => {
return res.status(200).send(playlists); return res.status(200).send(playlists);
} catch (error) { } catch (error) {
logger.error('getUserPlaylists', { error }); logger.error('getUserPlaylists', { error });
return res.status(500).send({ message: "Server Error. Try again." }); return res.sendStatus(500);
} }
} }
@ -155,7 +155,7 @@ const getPlaylistDetails = async (req, res) => {
return res.status(200).send(playlist); return res.status(200).send(playlist);
} catch (error) { } catch (error) {
logger.error('getPlaylistDetails', { error }); logger.error('getPlaylistDetails', { error });
return res.status(500).send({ message: "Server Error. Try again." }); return res.sendStatus(500);
} }
} }

View File

@ -8,8 +8,7 @@ const cors = require('cors');
const cookieParser = require('cookie-parser'); const cookieParser = require('cookie-parser');
const helmet = require("helmet"); const helmet = require("helmet");
const redis = require('redis'); const SQLiteStore = require("connect-sqlite3")(session);
const RedisStore = require("connect-redis").default;
const logger = require("./utils/logger")(module); const logger = require("./utils/logger")(module);
@ -18,26 +17,15 @@ const app = express();
// Enable this if you run behind a proxy (e.g. nginx) // Enable this if you run behind a proxy (e.g. nginx)
app.set('trust proxy', process.env.TRUST_PROXY); app.set('trust proxy', process.env.TRUST_PROXY);
// Configure Redis client and connect // Configure SQLite store file
const redisClient = redis.createClient({ const sqliteStore = new SQLiteStore({
host: process.env.REDIS_HOST, table: "session_store",
port: process.env.REDIS_PORT, db: "spotify-manager.db"
}); });
redisClient.connect()
.then(() => {
logger.info("Connected to Redis store");
})
.catch((error) => {
logger.error("Redis connection error", { error });
cleanupFunc();
});
const redisStore = new RedisStore({ client: redisClient });
// Configure session middleware // Configure session middleware
app.use(session({ app.use(session({
store: redisStore, store: sqliteStore,
secret: process.env.SESSION_SECRET, secret: process.env.SESSION_SECRET,
resave: false, resave: false,
saveUninitialized: false, saveUninitialized: false,
@ -84,7 +72,6 @@ const server = app.listen(port, () => {
const cleanupFunc = (signal) => { const cleanupFunc = (signal) => {
Promise.allSettled([ Promise.allSettled([
redisClient.disconnect,
util.promisify(server.close), util.promisify(server.close),
]).then(() => { ]).then(() => {
if (signal) if (signal)

View File

@ -13,9 +13,9 @@ const isAuthenticated = (req, res, next) => {
next() next()
} else { } else {
const delSession = req.session.destroy((err) => { const delSession = req.session.destroy((err) => {
if (Object.keys(err).length) { if (err) {
logger.error("Error while destroying session.", { err }); logger.error("Error while destroying session.", { err });
return res.status(500).send("Server error, try later."); return res.sendStatus(500);
} else { } else {
logger.info("Session invalid, destroyed.", { sessionID: delSession.id }); logger.info("Session invalid, destroyed.", { sessionID: delSession.id });
res.clearCookie("connect.sid"); res.clearCookie("connect.sid");

1344
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -19,7 +19,7 @@
"homepage": "https://github.com/20kaushik02/spotify-manager#readme", "homepage": "https://github.com/20kaushik02/spotify-manager#readme",
"dependencies": { "dependencies": {
"axios": "^1.5.0", "axios": "^1.5.0",
"connect-redis": "^7.1.0", "connect-sqlite3": "^0.9.15",
"cookie-parser": "^1.4.6", "cookie-parser": "^1.4.6",
"cors": "^2.8.5", "cors": "^2.8.5",
"dotenv-flow": "^3.3.0", "dotenv-flow": "^3.3.0",
@ -27,7 +27,6 @@
"express-session": "^1.17.3", "express-session": "^1.17.3",
"express-validator": "^7.0.1", "express-validator": "^7.0.1",
"helmet": "^7.0.0", "helmet": "^7.0.0",
"redis": "^4.6.10",
"winston": "^3.10.0" "winston": "^3.10.0"
}, },
"devDependencies": { "devDependencies": {