diff --git a/src/app.js b/src/app.js index a102a76..14e9dbd 100644 --- a/src/app.js +++ b/src/app.js @@ -25,6 +25,7 @@ var getTopUsers = require('./routes/getTopUsers.js'); var getTotalStats = require('./routes/getTotalStats.js'); var getDaysSavedFormatted = require('./routes/getDaysSavedFormatted.js'); var postNoSegments = require('./routes/postNoSegments.js'); +var deleteNoSegments = require('./routes/deleteNoSegments.js'); var getIsUserVIP = require('./routes/getIsUserVIP.js'); // Old Routes @@ -99,6 +100,8 @@ app.get('/api/getDaysSavedFormatted', getDaysSavedFormatted); //submit video containing no segments app.post('/api/noSegments', postNoSegments); +app.delete('/api/noSegments', deleteNoSegments); + //get if user is a vip app.get('/api/isUserVIP', getIsUserVIP); diff --git a/src/routes/deleteNoSegments.js b/src/routes/deleteNoSegments.js new file mode 100644 index 0000000..adb44ba --- /dev/null +++ b/src/routes/deleteNoSegments.js @@ -0,0 +1,43 @@ +const db = require('../databases/databases.js').db; +const getHash = require('../utils/getHash.js'); +const isUserVIP = require('../utils/isUserVIP.js'); +const logger = require('../utils/logger.js'); + +module.exports = (req, res) => { + // Collect user input data + let videoID = req.body.videoID; + let userID = req.body.userID; + let categories = req.body.categories; + + // Check input data is valid + if (!videoID + || !userID + || !categories + || !Array.isArray(categories) + || categories.length === 0 + ) { + res.status(400).json({ + message: 'Bad Format' + }); + return; + } + + // Check if user is VIP + userID = getHash(userID); + let userIsVIP = isUserVIP(userID); + + if (!userIsVIP) { + res.status(403).json({ + message: 'Must be a VIP to mark videos.' + }); + return; + } + + db.prepare("all", 'SELECT * FROM noSegments WHERE videoID = ?', [videoID]).filter((entry) => { + return (categories.indexOf(entry.category) !== -1); + }).forEach((entry) => { + db.prepare('run', 'DELETE FROM noSegments WHERE videoID = ? AND category = ?', [videoID, entry.category]); + }); + + res.status(200).json({message: 'Removed no segments entrys for video ' + videoID}); +}; \ No newline at end of file diff --git a/test/cases/noSegmentRecords.js b/test/cases/noSegmentRecords.js index f922d12..4167688 100644 --- a/test/cases/noSegmentRecords.js +++ b/test/cases/noSegmentRecords.js @@ -17,6 +17,11 @@ describe('noSegmentRecords', () => { db.exec("INSERT INTO noSegments (userID, videoID, category) VALUES ('" + getHash("VIPUser-noSegments") + "', 'no-segments-video-id-1', 'sponsor')"); db.exec("INSERT INTO noSegments (userID, videoID, category) VALUES ('" + getHash("VIPUser-noSegments") + "', 'no-segments-video-id-1', 'intro')"); db.exec("INSERT INTO noSegments (userID, videoID, category) VALUES ('" + getHash("VIPUser-noSegments") + "', 'noSubmitVideo', 'sponsor')"); + + db.exec("INSERT INTO noSegments (userID, videoID, category) VALUES ('" + getHash("VIPUser-noSegments") + "', 'delete-record', 'sponsor')"); + + db.exec("INSERT INTO noSegments (userID, videoID, category) VALUES ('" + getHash("VIPUser-noSegments") + "', 'delete-record-1', 'sponsor')"); + db.exec("INSERT INTO noSegments (userID, videoID, category) VALUES ('" + getHash("VIPUser-noSegments") + "', 'delete-record-1', 'intro')"); }); it('Should update the database version when starting the application', (done) => { @@ -309,6 +314,59 @@ describe('noSegmentRecords', () => { }); }); + it('Should be able to delete a noSegment record', (done) => { + let json = { + videoID: 'delete-record', + userID: 'VIPUser-noSegments', + categories: [ + 'sponsor' + ] + }; + + request.delete(utils.getbaseURL() + + "/api/noSegments", {json}, + (err, res, body) => { + if (err) done(err); + else if (res.statusCode === 200) { + let result = db.prepare('all', 'SELECT * FROM noSegments WHERE videoID = ?', ['delete-record']); + if (result.length === 0) { + done(); + } else { + done("Didn't delete record"); + } + } else { + done("Status code was " + res.statusCode); + } + }); + }); + + it('Should be able to delete one noSegment record without removing another', (done) => { + let json = { + videoID: 'delete-record-1', + userID: 'VIPUser-noSegments', + categories: [ + 'sponsor' + ] + }; + + request.delete(utils.getbaseURL() + + "/api/noSegments", {json}, + (err, res, body) => { + if (err) done(err); + else if (res.statusCode === 200) { + let result = db.prepare('all', 'SELECT * FROM noSegments WHERE videoID = ?', ['delete-record-1']); + if (result.length === 1) { + done(); + } else { + done("Didn't delete record"); + } + } else { + done("Status code was " + res.statusCode); + } + }); + }); + + /* * Submission tests in this file do not check database records, only status codes. * To test the submission code properly see ./test/cases/postSkipSegments.js