From d7b8c32c10b1d6a9862789b826cabe290b44788b Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 15 Jul 2021 12:32:00 -0400 Subject: [PATCH 1/9] Remove lock when undoing vote --- src/routes/voteOnSponsorTime.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/voteOnSponsorTime.ts b/src/routes/voteOnSponsorTime.ts index 7c9251e..eb873a0 100644 --- a/src/routes/voteOnSponsorTime.ts +++ b/src/routes/voteOnSponsorTime.ts @@ -428,7 +428,7 @@ export async function voteOnSponsorTime(req: Request, res: Response): Promise 0 && voteTypeEnum === voteTypes.normal) { // Unide and Lock this submission await db.prepare('run', 'UPDATE "sponsorTimes" SET locked = 1, hidden = 0 WHERE "UUID" = ?', [UUID]); - } else if (isVIP && incrementAmount < 0 && voteTypeEnum === voteTypes.normal) { + } else if (isVIP && incrementAmount <= 0 && voteTypeEnum === voteTypes.normal) { // Unlock if a VIP downvotes it await db.prepare('run', 'UPDATE "sponsorTimes" SET locked = 0 WHERE "UUID" = ?', [UUID]); } From 49e1e38f0516cebdaa824ff5350b84bc70c02318 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 15 Jul 2021 13:15:52 -0400 Subject: [PATCH 2/9] Enable info logs in production --- src/utils/logger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 5871d3b..24f21fa 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -40,7 +40,7 @@ class Logger { private _settings = { ERROR: true, WARN: true, - INFO: false, + INFO: true, DEBUG: false, }; From 72e17b06fc2ced4527a11d5fc4ec1ce18f581831 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 15 Jul 2021 13:55:02 -0400 Subject: [PATCH 3/9] Don't break if cron schedule is missing --- src/cronjob/downvoteSegmentArchiveJob.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/cronjob/downvoteSegmentArchiveJob.ts b/src/cronjob/downvoteSegmentArchiveJob.ts index f5e8e03..478e490 100644 --- a/src/cronjob/downvoteSegmentArchiveJob.ts +++ b/src/cronjob/downvoteSegmentArchiveJob.ts @@ -56,8 +56,12 @@ export const archiveDownvoteSegment = async (dayLimit: number, voteLimit: number }; const DownvoteSegmentArchiveJob = new CronJob( - jobConfig?.schedule || new Date(1), + jobConfig?.schedule || "0 0 * * * 0", () => archiveDownvoteSegment(jobConfig?.timeThresholdInDays, jobConfig?.voteThreshold) ); +if (serverConfig?.crons?.enabled && jobConfig && !jobConfig.schedule) { + Logger.error("Invalid cron schedule for downvoteSegmentArchive"); +} + export default DownvoteSegmentArchiveJob; From 27f406f757021c0681f72e0fd758f7e58c9c463a Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 15 Jul 2021 14:02:08 -0400 Subject: [PATCH 4/9] Fix username existence check --- src/routes/setUsername.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/setUsername.ts b/src/routes/setUsername.ts index cbf2ad3..b31d6c1 100644 --- a/src/routes/setUsername.ts +++ b/src/routes/setUsername.ts @@ -62,7 +62,7 @@ export async function setUsername(req: Request, res: Response): Promise 0) { + if (row?.userName != undefined) { //already exists, update this row oldUserName = row.userName; await db.prepare('run', `UPDATE "userNames" SET "userName" = ?, "locked" = ? WHERE "userID" = ?`, [userName, locked, userID]); From 83a77dfc7414e27ef82ffb40e87b4364af46e6fe Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 15 Jul 2021 14:03:30 -0400 Subject: [PATCH 5/9] Use strict equals --- src/routes/setUsername.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/routes/setUsername.ts b/src/routes/setUsername.ts index b31d6c1..b6a5c29 100644 --- a/src/routes/setUsername.ts +++ b/src/routes/setUsername.ts @@ -62,7 +62,7 @@ export async function setUsername(req: Request, res: Response): Promise Date: Thu, 15 Jul 2021 16:06:04 -0400 Subject: [PATCH 6/9] Disable info logging on production --- src/utils/logger.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/utils/logger.ts b/src/utils/logger.ts index 24f21fa..5871d3b 100644 --- a/src/utils/logger.ts +++ b/src/utils/logger.ts @@ -40,7 +40,7 @@ class Logger { private _settings = { ERROR: true, WARN: true, - INFO: true, + INFO: false, DEBUG: false, }; From 3f6baebd712f250f5a698157ec8a72107abe71e9 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Fri, 16 Jul 2021 16:19:00 -0400 Subject: [PATCH 7/9] Add friendlier message for short userID --- src/routes/postSkipSegments.ts | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/src/routes/postSkipSegments.ts b/src/routes/postSkipSegments.ts index 2065d35..dde758f 100644 --- a/src/routes/postSkipSegments.ts +++ b/src/routes/postSkipSegments.ts @@ -338,11 +338,13 @@ export async function postSkipSegments(req: Request, res: Response): Promise p + (i !== 0 ? ', ' : '') + c, ''); - return res.status(400).send(`No valid ${fields} field(s) provided`); + const formattedFields = invalidFields.reduce((p, c, i) => p + (i !== 0 ? ', ' : '') + c, ''); + const formattedErrors = errors.reduce((p, c, i) => p + (i !== 0 ? '. ' : ' ') + c, ''); + return res.status(400).send(`No valid ${formattedFields} field(s) provided.${formattedErrors}`); } //hash the userID From b98d6fd8caab990095bc8f618e3e623509f1b672 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Fri, 16 Jul 2021 16:22:55 -0400 Subject: [PATCH 8/9] Ignore votes from short ids --- src/routes/voteOnSponsorTime.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/routes/voteOnSponsorTime.ts b/src/routes/voteOnSponsorTime.ts index eb873a0..12e4fc9 100644 --- a/src/routes/voteOnSponsorTime.ts +++ b/src/routes/voteOnSponsorTime.ts @@ -258,6 +258,10 @@ export async function voteOnSponsorTime(req: Request, res: Response): Promise Date: Fri, 16 Jul 2021 16:23:08 -0400 Subject: [PATCH 9/9] Update package lock --- package-lock.json | 70 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 70 insertions(+) diff --git a/package-lock.json b/package-lock.json index 0cbfd17..e5ebcff 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,6 +12,7 @@ "@ajayyy/lru-diskcache": "^1.1.9", "@types/request": "^2.48.6", "better-sqlite3": "^7.4.1", + "cron": "^1.8.2", "express": "^4.17.1", "express-promise-router": "^4.1.0", "express-rate-limit": "^5.3.0", @@ -22,6 +23,7 @@ }, "devDependencies": { "@types/better-sqlite3": "^5.4.3", + "@types/cron": "^1.7.3", "@types/express": "^4.17.13", "@types/express-rate-limit": "^5.1.3", "@types/mocha": "^8.2.3", @@ -371,6 +373,16 @@ "@types/node": "*" } }, + "node_modules/@types/cron": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-1.7.3.tgz", + "integrity": "sha512-iPmUXyIJG1Js+ldPYhOQcYU3kCAQ2FWrSkm1FJPoii2eYSn6wEW6onPukNTT0bfiflexNSRPl6KWmAIqS+36YA==", + "dev": true, + "dependencies": { + "@types/node": "*", + "moment": ">=2.14.0" + } + }, "node_modules/@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -1537,6 +1549,14 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "node_modules/cron": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", + "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", + "dependencies": { + "moment-timezone": "^0.5.x" + } + }, "node_modules/cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -3474,6 +3494,25 @@ "node": ">= 8" } }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.33", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", + "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, "node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -5856,6 +5895,16 @@ "@types/node": "*" } }, + "@types/cron": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/@types/cron/-/cron-1.7.3.tgz", + "integrity": "sha512-iPmUXyIJG1Js+ldPYhOQcYU3kCAQ2FWrSkm1FJPoii2eYSn6wEW6onPukNTT0bfiflexNSRPl6KWmAIqS+36YA==", + "dev": true, + "requires": { + "@types/node": "*", + "moment": ">=2.14.0" + } + }, "@types/express": { "version": "4.17.13", "resolved": "https://registry.npmjs.org/@types/express/-/express-4.17.13.tgz", @@ -6776,6 +6825,14 @@ "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", "dev": true }, + "cron": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/cron/-/cron-1.8.2.tgz", + "integrity": "sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==", + "requires": { + "moment-timezone": "^0.5.x" + } + }, "cross-spawn": { "version": "5.1.0", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", @@ -8229,6 +8286,19 @@ } } }, + "moment": { + "version": "2.29.1", + "resolved": "https://registry.npmjs.org/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" + }, + "moment-timezone": { + "version": "0.5.33", + "resolved": "https://registry.npmjs.org/moment-timezone/-/moment-timezone-0.5.33.tgz", + "integrity": "sha512-PTc2vcT8K9J5/9rDEPe5czSIKgLoGsH8UNpA4qZTVw0Vd/Uz19geE9abbIOQKaAQFcnQ3v5YEXrbSc5BpshH+w==", + "requires": { + "moment": ">= 2.9.0" + } + }, "ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",