Skip to content

Commit

Permalink
Merge node-redis-upgrade
Browse files Browse the repository at this point in the history
commit 3392d67
Author: benb116 <[email protected]>
Date:   Sun Dec 5 23:14:57 2021 -0500

    Use legacy redis client for session store

commit 96b4b88
Author: benb116 <[email protected]>
Date:   Wed Dec 1 22:15:24 2021 -0500

    Fix redis in tests

    Correct set, get, keys, and ttl functions. Also wait for client ready in global setup

commit 3d9f31b
Author: benb116 <[email protected]>
Date:   Wed Dec 1 22:14:17 2021 -0500

    Fix HSET

commit 0e23d90
Author: benb116 <[email protected]>
Date:   Wed Dec 1 22:11:51 2021 -0500

    Fix redis key ttl setting

commit 7bc261e
Author: benb116 <[email protected]>
Date:   Wed Dec 1 17:14:23 2021 -0500

    Switch to node-redis 4.0.0

    Not fully ready, other dependencies need to upgrade to match. Specifically connect-redis (tj/connect-redis#336)

commit 0af210c
Author: benb116 <[email protected]>
Date:   Wed Dec 1 17:10:48 2021 -0500

    Get current week not through redis
  • Loading branch information
benb116 committed Dec 8, 2021
1 parent bc25f71 commit f9e8b74
Show file tree
Hide file tree
Showing 35 changed files with 229 additions and 193 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,3 +9,4 @@ server/.env
nginx.conf
server/logs/
**/*.log
coverage/
4 changes: 2 additions & 2 deletions development.yml
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ services:
- dbdata:/data/db

redis:
ports:
- 6379:6379 # Expose ports
ports:
- 6379:6379 # Expose ports

networks:
app-network:
Expand Down
3 changes: 1 addition & 2 deletions server/db/dbpopulate.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

const models = require('../models');
const logger = require('../utilities/logger');
const { get } = require('./redis');

async function PopulateDB() {
logger.info('Populating DB with initial data');
Expand All @@ -25,7 +24,7 @@ async function PopulateDB() {
verified: (u !== '[email protected]' && u !== '[email protected]'),
})));

const curweek = await get.CurrentWeek();
const curweek = Number(process.env.WEEK);
// Define existing contest
const con = {
name: 'Ball Street Big One',
Expand Down
3 changes: 1 addition & 2 deletions server/db/playerscraper.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
const axios = require('axios');
const { NFLPlayer } = require('../models');
const secret = require('../secret');
const { get } = require('./redis');

// Yahoo team ID numbers
const teammap = {
Expand Down Expand Up @@ -59,7 +58,7 @@ let currentweek = 3;
// Pull player info
// If price, include constant pre- and post-prices
async function scrape(price) {
currentweek = await get.CurrentWeek();
currentweek = Number(process.env.WEEK);
// Set all existing player records to inactive, will update if duplicated
await NFLPlayer.update({ active: false }, { where: { active: true } });

Expand Down
68 changes: 10 additions & 58 deletions server/db/redis.js
Original file line number Diff line number Diff line change
@@ -1,37 +1,20 @@
// Set up redis connections and utilities

const { promisify } = require('util');
const redis = require('redis');
const logger = require('../utilities/logger');
const { createClient } = require('redis');

const REDIS_HOST = (process.env.REDIS_HOST || 'localhost');
const REDIS_PORT = (process.env.REDIS_PORT || 6379);

// Used for all commands and publishing
const client = (function createClient() {
return redis.createClient(
REDIS_PORT,
REDIS_HOST,
);
}());

// Used for subscribing (must be separate client)
const subscriber = (function createClient() {
return redis.createClient(
REDIS_PORT,
REDIS_HOST,
);
}());
const connObj = {
url: `redis://${REDIS_HOST}:${REDIS_PORT}`,
socket: { connectTimeout: 10000 },
};
const client = createClient(connObj);
client.connect();
const subscriber = client.duplicate();

const queueOptions = { redis: { port: REDIS_PORT, host: REDIS_HOST } };

const getAsync = promisify(client.get).bind(client);
const setAsync = promisify(client.set).bind(client);
const delAsync = promisify(client.del).bind(client);
const hsetAsync = promisify(client.hset).bind(client);
const hgetAsync = promisify(client.hget).bind(client);
const hgetallAsync = promisify(client.hgetall).bind(client);

// Define redis keys for various entries
function leaderHash(contestID) {
return `contest${contestID}:leaderboard`;
Expand Down Expand Up @@ -73,19 +56,6 @@ function passReset(rand) {
return `passReset:${rand}`;
}

// Functions for setting or getting config values
async function getCurrentWeek() {
return Number(process.env.WEEK);
}

async function setCurrentWeek(weeknum) {
if (Number.isInteger(weeknum)) {
return setAsync(currentWeek(), weeknum.toString());
}
logger.error(`Can't set weeknum to ${weeknum}`);
return Promise.reject();
}

const rediskeys = {
bestbidHash,
bestaskHash,
Expand All @@ -99,29 +69,11 @@ const rediskeys = {
passReset,
};

const get = {
CurrentWeek: getCurrentWeek,
key: getAsync,
hkey: hgetAsync,
hkeyall: hgetallAsync,
};

const set = {
CurrentWeek: setCurrentWeek,
key: setAsync,
hkey: hsetAsync,
};

const del = {
key: delAsync,
};

module.exports = {
client,
subscriber,
queueOptions,
rediskeys,
get,
set,
del,
REDIS_HOST,
REDIS_PORT,
};
3 changes: 1 addition & 2 deletions server/features/contest/services/createContest.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const u = require('../../util/util');
const { Contest } = require('../../../models');
const { validators } = require('../../util/util.schema');
const { errorHandler } = require('../../util/util.service');
const { get } = require('../../../db/redis');

const schema = Joi.object({
user: validators.user,
Expand All @@ -30,7 +29,7 @@ async function createContest(req) {
const value = u.validate(req, schema);
return Contest.create({
name: value.body.name,
nflweek: await get.CurrentWeek(),
nflweek: Number(process.env.WEEK),
budget: value.body.budget,
}).catch(errorHandler({
default: ['Contest could not be created', 500],
Expand Down
3 changes: 1 addition & 2 deletions server/features/entry/services/createEntry.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const u = require('../../util/util');
const { Entry, Contest } = require('../../../models');
const { errorHandler } = require('../../util/util.service');
const { validators } = require('../../util/util.schema');
const { get } = require('../../../db/redis');

const schema = Joi.object({
user: validators.user,
Expand All @@ -24,7 +23,7 @@ async function createEntry(req) {
obj.ContestId = value.params.contestID;
const thecontest = await Contest.findByPk(value.params.contestID).then(u.dv);
if (!thecontest) { u.Error('No contest found', 404); }
const theweek = await get.CurrentWeek();
const theweek = Number(process.env.WEEK);
if (theweek !== thecontest.nflweek) u.Error('Incorrect week', 406);
obj.pointtotal = thecontest.budget;
return Entry.create(obj).then(u.dv)
Expand Down
3 changes: 1 addition & 2 deletions server/features/entry/services/getWeekEntries.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,12 +3,11 @@ const { Op } = require('sequelize');
const u = require('../../util/util');

const { Entry, Contest, User } = require('../../../models');
const { get } = require('../../../db/redis');

async function getWeekEntries() {
const weekcontests = await Contest.findAll({
where: {
nflweek: await get.CurrentWeek(),
nflweek: Number(process.env.WEEK),
},
})
.then(u.dv)
Expand Down
3 changes: 1 addition & 2 deletions server/features/nflgame/services/getNFLGames.service.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
const { get } = require('../../../db/redis');
const { NFLGame, NFLTeam } = require('../../../models');
const u = require('../../util/util');

async function getNFLGames() {
const currentweek = await get.CurrentWeek();
const currentweek = Number(process.env.WEEK);
return NFLGame.findAll({
include: [{
model: NFLTeam,
Expand Down
3 changes: 1 addition & 2 deletions server/features/offer/services/createOffer.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ const sequelize = require('../../../db');
const {
Offer, Entry, NFLPlayer, NFLGame,
} = require('../../../models');
const { get } = require('../../../db/redis');

const { queueOptions } = require('../../../db/redis');
const { errorHandler } = require('../../util/util.service');
Expand Down Expand Up @@ -90,7 +89,7 @@ async function createOffer(req) {
const gamedata = await NFLGame.findOne({
where: {
[Op.or]: [{ HomeId: playerdata.NFLTeamId }, { AwayId: playerdata.NFLTeamId }],
week: await get.CurrentWeek(),
week: Number(process.env.WEEK),
},
}, { transaction: t }).then(u.dv);
if (!gamedata) u.Error('Could not find game data for this player', 404);
Expand Down
3 changes: 1 addition & 2 deletions server/features/trade/services/tradeAdd.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const u = require('../../util/util');
const { validators } = require('../../util/util.schema');

const { Entry, NFLPlayer, NFLGame } = require('../../../models');
const { get } = require('../../../db/redis');

const schema = Joi.object({
user: validators.user,
Expand Down Expand Up @@ -74,7 +73,7 @@ async function tradeAdd(req, t) {
const gamedata = await NFLGame.findOne({
where: {
[Op.or]: [{ HomeId: playerdata.NFLTeamId }, { AwayId: playerdata.NFLTeamId }],
week: await get.CurrentWeek(),
week: Number(process.env.WEEK),
},
}, { transaction: t }).then(u.dv);
if (!gamedata) u.Error('Could not find game data for this player', 404);
Expand Down
3 changes: 1 addition & 2 deletions server/features/trade/services/tradeDrop.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@ const u = require('../../util/util');
const { validators } = require('../../util/util.schema');

const { Entry, NFLPlayer, NFLGame } = require('../../../models');
const { get } = require('../../../db/redis');

const schema = Joi.object({
user: validators.user,
Expand Down Expand Up @@ -51,7 +50,7 @@ async function tradeDrop(req, t) {
const gamedata = await NFLGame.findOne({
where: {
[Op.or]: [{ HomeId: playerdata.NFLTeamId }, { AwayId: playerdata.NFLTeamId }],
week: await get.CurrentWeek(),
week: Number(process.env.WEEK),
},
}, { transaction: t }).then(u.dv);
if (!gamedata) u.Error('Could not find game data for this player', 404);
Expand Down
6 changes: 3 additions & 3 deletions server/features/user/services/evalPassReset.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ const bcrypt = require('bcrypt');
const Joi = require('joi');

const u = require('../../util/util');
const { rediskeys, get, del } = require('../../../db/redis');
const { rediskeys, client } = require('../../../db/redis');
const config = require('../../../config');
const { User } = require('../../../models');
const { validators } = require('../../util/util.schema');
Expand All @@ -20,10 +20,10 @@ const schema = Joi.object({
async function evalPassReset(req) {
const { token, password, confirmPassword } = u.validate(req, schema);
if (u.OnCompare(password, confirmPassword)) u.Error('Passwords do not match', 403);
const email = await get.key(rediskeys.passReset(token));
const email = await client.GET(rediskeys.passReset(token));
if (!email) u.Error('Reset key could not be found, please try again', 404);

del.key(rediskeys.passReset(token));
client.DEL(rediskeys.passReset(token));
const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash(password, salt);
const theuser = await User.update({ pwHash: hash }, { where: { email } });
Expand Down
6 changes: 3 additions & 3 deletions server/features/user/services/evalVerify.service.js
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
const Joi = require('joi');

const u = require('../../util/util');
const { rediskeys, get, del } = require('../../../db/redis');
const { rediskeys, client } = require('../../../db/redis');
const config = require('../../../config');
const { User } = require('../../../models');

Expand All @@ -15,9 +15,9 @@ const schema = Joi.object({

async function evalVerify(req) {
const { token } = u.validate(req, schema);
const email = await get.key(rediskeys.emailVer(token));
const email = await client.GET(rediskeys.emailVer(token));
if (!email) u.Error('Email could not be verified', 404);
del.key(rediskeys.emailVer(token));
client.DEL(rediskeys.emailVer(token));
const user = await User.update({ verified: true }, {
where: { email }, returning: true, plain: true,
});
Expand Down
4 changes: 2 additions & 2 deletions server/features/user/services/genPassReset.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const Joi = require('joi');

const u = require('../../util/util');
const { validators } = require('../../util/util.schema');
const { set, rediskeys } = require('../../../db/redis');
const { client, rediskeys } = require('../../../db/redis');
const config = require('../../../config');

const schema = Joi.object({
Expand All @@ -14,7 +14,7 @@ async function genPassReset(req) {
const { email } = u.validate(req, schema);
try {
const rand = cryptoRandomString({ length: config.verificationTokenLength, type: 'url-safe' });
await set.key(rediskeys.passReset(rand), email, 'EX', config.verificationTimeout * 60);
await client.SET(rediskeys.passReset(rand), email, { EX: config.verificationTimeout * 60 });
return await sendPassResetEmail(email, rand);
} catch (err) {
return u.Error('genPassReset Error', 406);
Expand Down
4 changes: 2 additions & 2 deletions server/features/user/services/genVerify.service.js
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ const Joi = require('joi');

const u = require('../../util/util');
const { validators } = require('../../util/util.schema');
const { set, rediskeys } = require('../../../db/redis');
const { client, rediskeys } = require('../../../db/redis');
const config = require('../../../config');

const schema = Joi.object({
Expand All @@ -14,7 +14,7 @@ async function genVerify(req) {
const { email } = u.validate(req, schema);
try {
const rand = cryptoRandomString({ length: config.verificationTokenLength, type: 'url-safe' });
await set.key(rediskeys.emailVer(rand), email, 'EX', config.verificationTimeout * 60);
await client.SET(rediskeys.emailVer(rand), email, { EX: config.verificationTimeout * 60 });
return sendVerificationEmail(email, rand);
} catch (err) {
return u.Error('genVerify Error', 406);
Expand Down
Loading

0 comments on commit f9e8b74

Please sign in to comment.