From 9b43ce0ab7a694497bea60222343b15612d599f9 Mon Sep 17 00:00:00 2001 From: Haidang666 Date: Thu, 24 Jun 2021 12:27:21 +0700 Subject: [PATCH 1/4] Add purge all segments of VideoId --- src/app.ts | 6 ++- src/routes/postPurgeAllSegments.ts | 41 +++++++++++++++ test/cases/postPurgeAllSegments.ts | 81 ++++++++++++++++++++++++++++++ 3 files changed, 127 insertions(+), 1 deletion(-) create mode 100644 src/routes/postPurgeAllSegments.ts create mode 100644 test/cases/postPurgeAllSegments.ts diff --git a/src/app.ts b/src/app.ts index 3ce004f..6d2406b 100644 --- a/src/app.ts +++ b/src/app.ts @@ -31,6 +31,7 @@ import dumpDatabase, {redirectLink} from './routes/dumpDatabase'; import {endpoint as getSegmentInfo} from './routes/getSegmentInfo'; import {postClearCache} from './routes/postClearCache'; import { addUnlistedVideo } from './routes/addUnlistedVideo'; +import {postPurgeAllSegments} from './routes/postPurgeAllSegments'; export function createServer(callback: () => void) { // Create a service (the app object is just a callback). @@ -139,7 +140,7 @@ function setupRoutes(app: Express) { app.get('/api/segmentInfo', getSegmentInfo); //clear cache as VIP - app.post('/api/clearCache', postClearCache) + app.post('/api/clearCache', postClearCache); app.post('/api/unlistedVideo', addUnlistedVideo) @@ -152,4 +153,7 @@ function setupRoutes(app: Express) { res.sendFile("./databases/sponsorTimes.db", {root: "./"}); }); } + + //purge all segments for VIP + app.post('/api/purgeAllSegments', postPurgeAllSegments); } diff --git a/src/routes/postPurgeAllSegments.ts b/src/routes/postPurgeAllSegments.ts new file mode 100644 index 0000000..9a05f4b --- /dev/null +++ b/src/routes/postPurgeAllSegments.ts @@ -0,0 +1,41 @@ +import {Logger} from '../utils/logger'; +import {getHash} from '../utils/getHash'; +import {isUserVIP} from '../utils/isUserVIP'; +import {Request, Response} from 'express'; +import {HashedUserID, UserID} from '../types/user.model'; +import {VideoID} from "../types/segments.model"; +import {db} from '../databases/databases'; + +export async function postPurgeAllSegments(req: Request, res: Response): Promise { + const userID = req.body.userID as UserID; + const videoID = req.body.videoID as VideoID; + + if (userID == undefined) { + //invalid request + res.sendStatus(400); + return; + } + + //hash the userID + const hashedUserID: HashedUserID = getHash(userID); + + try { + let vipState = await isUserVIP(hashedUserID); + if (!vipState) { + res.status(403).json({ + message: 'Must be a VIP to perform this action.', + }); + return; + } + + await db.prepare('run', `UPDATE "sponsorTimes" SET "hidden" = 1 WHERE "videoID" = ?`, [videoID]); + + } catch (err) { + Logger.error(err); + res.sendStatus(500); + + return; + } + + res.sendStatus(200); +} diff --git a/test/cases/postPurgeAllSegments.ts b/test/cases/postPurgeAllSegments.ts new file mode 100644 index 0000000..8161952 --- /dev/null +++ b/test/cases/postPurgeAllSegments.ts @@ -0,0 +1,81 @@ +import fetch from 'node-fetch'; +import {Done, getbaseURL} from '../utils'; +import {db} from '../../src/databases/databases'; +import {getHash} from '../../src/utils/getHash'; +import {IDatabase} from '../../src/databases/IDatabase'; + +async function dbSponsorTimesAdd(db: IDatabase, videoID: string, startTime: number, endTime: number, UUID: string, category: string) { + const votes = 0, + userID = 0, + timeSubmitted = 0, + views = 0, + shadowHidden = 0, + hidden = 0, + hashedVideoID = `hash_${UUID}`; + await db.prepare("run", `INSERT INTO + "sponsorTimes" ("videoID", "startTime", "endTime", "votes", "UUID", + "userID", "timeSubmitted", "views", "category", "shadowHidden", "hashedVideoID", "hidden") + VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)`, + [videoID, startTime, endTime, votes, UUID, userID, timeSubmitted, views, category, shadowHidden, hashedVideoID, hidden]); +} + +async function dbSponsorTimesCompareExpect(db: IDatabase, videoId: string) { + let seg = await db.prepare('get', `SELECT "hidden", "UUID" FROM "sponsorTimes" WHERE "videoId" = ?`, [videoId]); + for (let i = 0, len = seg.length; i < len; i++) { + if (seg.hidden !== 1) { + return `${seg.UUID} hidden expected to be 1 but found ${seg.hidden}`; + } + } + return; +} + +describe('postPurgeAllSegments', function () { + const privateVipUserID = 'VIPUser-purgeAll'; + const route = '/api/purgeAllSegments'; + const vipUserID = getHash(privateVipUserID); + const baseURL = getbaseURL(); + + before(async function () { + // startTime and endTime get set in beforeEach for consistency + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid01', 'intro'); + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid02', 'sponsor'); + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid03', 'interaction'); + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid04', 'outro'); + await db.prepare("run", `INSERT INTO "vipUsers" ("userID") VALUES (?)`, [vipUserID]); + }); + + it('Reject none VIP user', function (done: Done) { + fetch(`${baseURL}${route}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + videoID: 'vsegpurge01', + userID: 'segshift_randomuser001', + }), + }) + .then(async res => { + done(res.status === 403 ? undefined : res.status); + }) + .catch(err => done(err)); + }); + + it('Purge all segments success', function (done: Done) { + fetch(`${baseURL}${route}`, { + method: 'POST', + headers: { + 'Content-Type': 'application/json', + }, + body: JSON.stringify({ + videoID: 'vsegpurge01', + userID: privateVipUserID, + }), + }) + .then(async res => { + if (res.status !== 200) return done(`Status code was ${res.status}`); + done(await dbSponsorTimesCompareExpect(db, 'vsegpurge01')); + }) + .catch(err => done(err)); + }); +}); From 0bbb2aa60d283d8173ea7ebabe5eac087fddf301 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 24 Jun 2021 01:36:54 -0400 Subject: [PATCH 2/4] Add one more check in tests --- test/cases/postPurgeAllSegments.ts | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/test/cases/postPurgeAllSegments.ts b/test/cases/postPurgeAllSegments.ts index 8161952..45086ec 100644 --- a/test/cases/postPurgeAllSegments.ts +++ b/test/cases/postPurgeAllSegments.ts @@ -19,11 +19,11 @@ async function dbSponsorTimesAdd(db: IDatabase, videoID: string, startTime: numb [videoID, startTime, endTime, votes, UUID, userID, timeSubmitted, views, category, shadowHidden, hashedVideoID, hidden]); } -async function dbSponsorTimesCompareExpect(db: IDatabase, videoId: string) { +async function dbSponsorTimesCompareExpect(db: IDatabase, videoId: string, expectdHidden: number) { let seg = await db.prepare('get', `SELECT "hidden", "UUID" FROM "sponsorTimes" WHERE "videoId" = ?`, [videoId]); for (let i = 0, len = seg.length; i < len; i++) { - if (seg.hidden !== 1) { - return `${seg.UUID} hidden expected to be 1 but found ${seg.hidden}`; + if (seg.hidden !== expectdHidden) { + return `${seg.UUID} hidden expected to be ${expectdHidden} but found ${seg.hidden}`; } } return; @@ -37,14 +37,15 @@ describe('postPurgeAllSegments', function () { before(async function () { // startTime and endTime get set in beforeEach for consistency - await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid01', 'intro'); - await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid02', 'sponsor'); - await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid03', 'interaction'); - await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 0, 'vsegpurgetest01uuid04', 'outro'); + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 1, 'vsegpurgetest01uuid01', 'intro'); + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 2, 'vsegpurgetest01uuid02', 'sponsor'); + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 3, 'vsegpurgetest01uuid03', 'interaction'); + await dbSponsorTimesAdd(db, 'vsegpurge01', 0, 4, 'vsegpurgetest01uuid04', 'outro'); + await dbSponsorTimesAdd(db, 'vseg-not-purged01', 0, 5, 'vsegpurgetest01uuid05', 'outro'); await db.prepare("run", `INSERT INTO "vipUsers" ("userID") VALUES (?)`, [vipUserID]); }); - it('Reject none VIP user', function (done: Done) { + it('Reject non-VIP user', function (done: Done) { fetch(`${baseURL}${route}`, { method: 'POST', headers: { @@ -74,7 +75,7 @@ describe('postPurgeAllSegments', function () { }) .then(async res => { if (res.status !== 200) return done(`Status code was ${res.status}`); - done(await dbSponsorTimesCompareExpect(db, 'vsegpurge01')); + done(await dbSponsorTimesCompareExpect(db, 'vsegpurge01', 1) || await dbSponsorTimesCompareExpect(db, 'vseg-not-purged01', 0)); }) .catch(err => done(err)); }); From 8312cfc0aadb248f81d21ba012fb96419a3559c4 Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 24 Jun 2021 01:37:50 -0400 Subject: [PATCH 3/4] Move purgeAllSegments up in app.ts --- src/app.ts | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/app.ts b/src/app.ts index 6d2406b..71a85bd 100644 --- a/src/app.ts +++ b/src/app.ts @@ -142,7 +142,10 @@ function setupRoutes(app: Express) { //clear cache as VIP app.post('/api/clearCache', postClearCache); - app.post('/api/unlistedVideo', addUnlistedVideo) + //purge all segments for VIP + app.post('/api/purgeAllSegments', postPurgeAllSegments); + + app.post('/api/unlistedVideo', addUnlistedVideo); if (config.postgres) { app.get('/database', (req, res) => dumpDatabase(req, res, true)); @@ -153,7 +156,4 @@ function setupRoutes(app: Express) { res.sendFile("./databases/sponsorTimes.db", {root: "./"}); }); } - - //purge all segments for VIP - app.post('/api/purgeAllSegments', postPurgeAllSegments); } From 3c3c963fd3ae911f8c26c848ab6039e33a53d9bf Mon Sep 17 00:00:00 2001 From: Ajay Ramachandran Date: Thu, 24 Jun 2021 02:16:26 -0400 Subject: [PATCH 4/4] Fixed captialization error --- test/cases/postPurgeAllSegments.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/cases/postPurgeAllSegments.ts b/test/cases/postPurgeAllSegments.ts index 45086ec..b9eef50 100644 --- a/test/cases/postPurgeAllSegments.ts +++ b/test/cases/postPurgeAllSegments.ts @@ -20,7 +20,7 @@ async function dbSponsorTimesAdd(db: IDatabase, videoID: string, startTime: numb } async function dbSponsorTimesCompareExpect(db: IDatabase, videoId: string, expectdHidden: number) { - let seg = await db.prepare('get', `SELECT "hidden", "UUID" FROM "sponsorTimes" WHERE "videoId" = ?`, [videoId]); + let seg = await db.prepare('get', `SELECT "hidden", "UUID" FROM "sponsorTimes" WHERE "videoID" = ?`, [videoId]); for (let i = 0, len = seg.length; i < len; i++) { if (seg.hidden !== expectdHidden) { return `${seg.UUID} hidden expected to be ${expectdHidden} but found ${seg.hidden}`;