diff --git a/.gitignore b/.gitignore index 8fa7201..e329b30 100644 --- a/.gitignore +++ b/.gitignore @@ -89,9 +89,13 @@ typings/ # Databases databases/sponsorTimes.db +databases/sponsorTimes.db-shm +databases/sponsorTimes.db-wal databases/private.db databases/sponsorTimesReal.db test/databases/sponsorTimes.db +test/databases/sponsorTimes.db-shm +test/databases/sponsorTimes.db-wal test/databases/private.db # Config files diff --git a/config.json.example b/config.json.example index d771410..b8a9d79 100644 --- a/config.json.example +++ b/config.json.example @@ -1,4 +1,6 @@ { + // Remove all comments from the config when using it! + "port": 80, "globalSalt": "[global salt (pepper) that is added to every ip before hashing to make it even harder for someone to decode the ip]", "adminUserID": "[the hashed id of the user who can perform admin actions]", @@ -8,6 +10,9 @@ "behindProxy": true, "db": "./databases/sponsorTimes.db", "privateDB": "./databases/private.db", + "createDatabaseIfNotExist": true, //This will run on startup every time (unless readOnly is true) - so ensure "create table if not exists" is used in the schema + "dbSchema": "./databases/_sponsorTimes.db.sql", + "privateDBSchema": "./databases/_private.db.sql", "mode": "development", "readOnly": false -} \ No newline at end of file +} diff --git a/src/databases/databases.js b/src/databases/databases.js index 8676292..d01d01f 100644 --- a/src/databases/databases.js +++ b/src/databases/databases.js @@ -3,7 +3,8 @@ var Sqlite3 = require('better-sqlite3'); var fs = require('fs'); let options = { - readonly: config.readOnly + readonly: config.readOnly, + fileMustExist: !config.createDatabaseIfNotExist }; var db = new Sqlite3(config.db, options); diff --git a/src/routes/getSavedTimeForUser.js b/src/routes/getSavedTimeForUser.js index 0b874ce..ea23dc6 100644 --- a/src/routes/getSavedTimeForUser.js +++ b/src/routes/getSavedTimeForUser.js @@ -1,4 +1,5 @@ var db = require('../databases/databases.js').db; +var getHash = require('../utils/getHash.js'); module.exports = function getSavedTimeForUser (req, res) { let userID = req.query.userID; diff --git a/src/routes/submitSponsorTimes.js b/src/routes/submitSponsorTimes.js index 30b1f0f..a550f00 100644 --- a/src/routes/submitSponsorTimes.js +++ b/src/routes/submitSponsorTimes.js @@ -168,6 +168,16 @@ module.exports = async function submitSponsorTimes(req, res) { } }] } + }, (err, res) => { + if (err) { + console.log("Failed to send first time submission Discord hook."); + console.log(JSON.stringify(err)); + console.log("\n"); + } else if (res && res.statusCode >= 400) { + console.log("Error sending first time submission Discord hook"); + console.log(JSON.stringify(res)); + console.log("\n"); + } }); }); } diff --git a/src/routes/voteOnSponsorTime.js b/src/routes/voteOnSponsorTime.js index 79c73d6..bc9a326 100644 --- a/src/routes/voteOnSponsorTime.js +++ b/src/routes/voteOnSponsorTime.js @@ -119,6 +119,16 @@ module.exports = async function voteOnSponsorTime(req, res) { } }] } + }, (err, res) => { + if (err) { + console.log("Failed to send reported submission Discord hook."); + console.log(JSON.stringify(err)); + console.log("\n"); + } else if (res && res.statusCode >= 400) { + console.log("Error sending reported submission Discord hook"); + console.log(JSON.stringify(res)); + console.log("\n"); + } }); }); } diff --git a/test/cases/getSavedTimeForUser.js b/test/cases/getSavedTimeForUser.js new file mode 100644 index 0000000..5488c67 --- /dev/null +++ b/test/cases/getSavedTimeForUser.js @@ -0,0 +1,20 @@ +var request = require('request'); +var utils = require('../utils.js'); +var db = require('../../src/databases/databases.js').db; +var getHash = require('../../src/utils/getHash.js'); + +describe('getSavedTimeForUser', () => { + before(() => { + db.exec("INSERT INTO sponsorTimes VALUES ('getSavedTimeForUser', 1, 11, 2, 'abc1239999', '"+getHash("testman")+"', 0, 50, 0)"); + }); + + it('Should be able to get a 200', (done) => { + request.get(utils.getbaseURL() + + "/api/getSavedTimeForUser?userID=testman", null, + (err, res, body) => { + if (err) done(false); + else if (res.statusCode !== 200) done("non 200"); + else done(); + }); + }); +}); \ No newline at end of file diff --git a/test/cases/getSponsorTime.js b/test/cases/getSponsorTime.js index d0fc21e..0565d28 100644 --- a/test/cases/getSponsorTime.js +++ b/test/cases/getSponsorTime.js @@ -19,7 +19,8 @@ var utils = require('../utils.js'); describe('getVideoSponsorTime', () => { before(() => { - db.exec("INSERT INTO sponsorTimes VALUES ('testtesttest', 1, 11, 2, 'abc123', 'testman', 0, 50, 0)"); + db.exec("INSERT INTO sponsorTimes VALUES ('testtesttest', 1, 11, 2, 'uuid-0', 'testman', 0, 50, 0)"); + db.exec("INSERT INTO sponsorTimes VALUES ('testtesttest,test', 1, 11, 2, 'uuid-1', 'testman', 0, 50, 0)"); }); it('Should be able to get a time', (done) => { @@ -32,6 +33,37 @@ describe('getVideoSponsorTime', () => { }); }); + it('Should return 404 if no segment found', (done) => { + request.get(utils.getbaseURL() + + "/api/getVideoSponsorTimes?videoID=notarealvideo", null, + (err, res, body) => { + if (err) done(false); + else if (res.statusCode !== 404) done("non 404 respone code: " + res.statusCode); + else done(); + }); + }); + + + it('Should be possible to send unexpected query parameters', (done) => { + request.get(utils.getbaseURL() + + "/api/getVideoSponsorTimes?videoID=testtesttest&fakeparam=hello", null, + (err, res, body) => { + if (err) done(false); + else if (res.statusCode !== 200) done("non 200"); + else done(); + }); + }); + + it('Should be able send a comma in a query param', (done) => { + request.get(utils.getbaseURL() + + "/api/getVideoSponsorTimes?videoID=testtesttest,test", null, + (err, res, body) => { + if (err) done(false); + else if (res.statusCode !== 200) done("non 200 response: " + res.statusCode); + else (JSON.parse(body).UUIDs[0] === 'uuid-1') && done(); + }); + }); + it('Should be able to get the correct time', (done) => { request.get(utils.getbaseURL() + "/api/getVideoSponsorTimes?videoID=testtesttest", null, @@ -42,7 +74,7 @@ describe('getVideoSponsorTime', () => { let parsedBody = JSON.parse(body); if (parsedBody.sponsorTimes[0][0] === 1 && parsedBody.sponsorTimes[0][1] === 11 - && parsedBody.UUIDs[0] === 'abc123') { + && parsedBody.UUIDs[0] === 'uuid-0') { done(); } else { done("Wrong data was returned + " + parsedBody); diff --git a/test/mocks.js b/test/mocks.js index a124646..df19c8a 100644 --- a/test/mocks.js +++ b/test/mocks.js @@ -4,10 +4,12 @@ var app = express(); var config = require('../src/config.js'); app.post('/ReportChannelWebhook', (req, res) => { + console.log("report mock hit"); res.status(200); }); app.post('/FirstTimeSubmissionsWebhook', (req, res) => { + console.log("first time submisson mock hit"); res.status(200); });