mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-10 21:47:02 +03:00
rewrite getLockCategores to new spec
This commit is contained in:
@@ -2,7 +2,6 @@ import {db} from '../databases/databases';
|
|||||||
import {Logger} from '../utils/logger';
|
import {Logger} from '../utils/logger';
|
||||||
import {Request, Response} from 'express';
|
import {Request, Response} from 'express';
|
||||||
import { Category, VideoID } from "../types/segments.model";
|
import { Category, VideoID } from "../types/segments.model";
|
||||||
import { UserID } from '../types/user.model';
|
|
||||||
|
|
||||||
export async function getLockCategories(req: Request, res: Response): Promise<Response> {
|
export async function getLockCategories(req: Request, res: Response): Promise<Response> {
|
||||||
const videoID = req.query.videoID as VideoID;
|
const videoID = req.query.videoID as VideoID;
|
||||||
@@ -14,12 +13,13 @@ export async function getLockCategories(req: Request, res: Response): Promise<Re
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Get existing lock categories markers
|
// Get existing lock categories markers
|
||||||
const lockCategoryList = await db.prepare('all', 'SELECT "category", "userID" from "lockCategories" where "videoID" = ?', [videoID]) as {category: Category, userID: UserID}[];
|
const lockedCategories = await db.prepare('all', 'SELECT "category" from "lockCategories" where "videoID" = ?', [videoID]) as {category: Category}[];
|
||||||
if (lockCategoryList.length === 0 || !lockCategoryList[0]) {
|
if (lockedCategories.length === 0 || !lockedCategories[0]) return res.sendStatus(404);
|
||||||
return res.sendStatus(404);
|
// map to array in JS becaues of SQL incompatibilities
|
||||||
} else {
|
const categories = Object.values(lockedCategories).map((entry) => entry.category);
|
||||||
return res.send(lockCategoryList);
|
return res.send({
|
||||||
}
|
categories
|
||||||
|
});
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
Logger.error(err);
|
Logger.error(err);
|
||||||
return res.sendStatus(500);
|
return res.sendStatus(500);
|
||||||
|
|||||||
@@ -3,7 +3,38 @@ import {Logger} from '../utils/logger';
|
|||||||
import {Request, Response} from 'express';
|
import {Request, Response} from 'express';
|
||||||
import {hashPrefixTester} from '../utils/hashPrefixTester';
|
import {hashPrefixTester} from '../utils/hashPrefixTester';
|
||||||
import { Category, VideoID, VideoIDHash } from "../types/segments.model";
|
import { Category, VideoID, VideoIDHash } from "../types/segments.model";
|
||||||
import { UserID } from '../types/user.model';
|
|
||||||
|
interface byHashLockResult {
|
||||||
|
videoID: VideoID,
|
||||||
|
hash: VideoIDHash,
|
||||||
|
categories: Category[]
|
||||||
|
}
|
||||||
|
|
||||||
|
interface DBLock {
|
||||||
|
videoID: VideoID,
|
||||||
|
hash: VideoIDHash,
|
||||||
|
category: Category
|
||||||
|
}
|
||||||
|
|
||||||
|
const mergeLocks = (source: DBLock[]) => {
|
||||||
|
const dest: byHashLockResult[] = [];
|
||||||
|
for (const obj of source) {
|
||||||
|
// videoID already exists
|
||||||
|
const destMatch = dest.find(s => s.videoID === obj.videoID);
|
||||||
|
if (destMatch) {
|
||||||
|
// push to categories
|
||||||
|
destMatch.categories.push(obj.category);
|
||||||
|
} else {
|
||||||
|
dest.push({
|
||||||
|
videoID: obj.videoID,
|
||||||
|
hash: obj.hash,
|
||||||
|
categories: [obj.category]
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return dest;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
export async function getLockCategoriesByHash(req: Request, res: Response): Promise<Response> {
|
export async function getLockCategoriesByHash(req: Request, res: Response): Promise<Response> {
|
||||||
let hashPrefix = req.params.prefix as VideoIDHash;
|
let hashPrefix = req.params.prefix as VideoIDHash;
|
||||||
@@ -14,12 +45,10 @@ export async function getLockCategoriesByHash(req: Request, res: Response): Prom
|
|||||||
|
|
||||||
try {
|
try {
|
||||||
// Get existing lock categories markers
|
// Get existing lock categories markers
|
||||||
const lockCategoryList = await db.prepare('all', 'SELECT * from "lockCategories" where "hashedVideoID" LIKE ? ORDER BY videoID', [hashPrefix + '%']) as {videoID: VideoID, userID: UserID,category: Category}[];
|
const lockedRows = await db.prepare('all', 'SELECT "videoID", "hashedVideoID" as "hash", "category" from "lockCategories" where "hashedVideoID" LIKE ?', [hashPrefix + '%']) as DBLock[];
|
||||||
if (lockCategoryList.length === 0 || !lockCategoryList[0]) {
|
if (lockedRows.length === 0 || !lockedRows[0]) return res.sendStatus(404);
|
||||||
return res.sendStatus(404);
|
// merge all locks
|
||||||
} else {
|
return res.send(mergeLocks(lockedRows));
|
||||||
return res.send(lockCategoryList);
|
|
||||||
}
|
|
||||||
} catch (err) {
|
} catch (err) {
|
||||||
Logger.error(err);
|
Logger.error(err);
|
||||||
return res.sendStatus(500);
|
return res.sendStatus(500);
|
||||||
|
|||||||
@@ -31,12 +31,12 @@ describe('getLockCategories', () => {
|
|||||||
done("non 200");
|
done("non 200");
|
||||||
} else {
|
} else {
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.length !== 2) {
|
if (data.categories.length !== 2) {
|
||||||
done(`Returned incorrect number of locks "${data.length}"`);
|
done(`Returned incorrect number of locks "${data.categories.length}"`);
|
||||||
} else if (data[0].category !== "sponsor") {
|
} else if (data.categories[0] !== "sponsor") {
|
||||||
done(`Returned incorrect category "${data[0].category}"`);
|
done(`Returned incorrect category "${data.categories[0]}"`);
|
||||||
} else if (data[1].category !== "interaction") {
|
} else if (data.categories[1] !== "interaction") {
|
||||||
done(`Returned incorrect category "${data[1].category}"`);
|
done(`Returned incorrect category "${data.categories[1]}"`);
|
||||||
} else {
|
} else {
|
||||||
done(); // pass
|
done(); // pass
|
||||||
}
|
}
|
||||||
@@ -52,10 +52,10 @@ describe('getLockCategories', () => {
|
|||||||
done("non 200");
|
done("non 200");
|
||||||
} else {
|
} else {
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.length !== 1) {
|
if (data.categories.length !== 1) {
|
||||||
done('Returned incorrect number of locks "' + data.length + '"');
|
done('Returned incorrect number of locks "' + data.categories.length + '"');
|
||||||
} else if (data[0].category !== "preview") {
|
} else if (data.categories[0] !== "preview") {
|
||||||
done(`Returned incorrect category "${data[0].category}"`);
|
done(`Returned incorrect category "${data.categories[0].category}"`);
|
||||||
} else {
|
} else {
|
||||||
done(); // pass
|
done(); // pass
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ describe('getLockCategoriesByHash', () => {
|
|||||||
|
|
||||||
await db.prepare("run", insertLockCategoryQuery, [getHash("VIPUser-getLockCategories"), 'fakehash-1', 'outro', 'b05a20424f24a53dac1b059fb78d861ba9723645026be2174c93a94f9106bb35']);
|
await db.prepare("run", insertLockCategoryQuery, [getHash("VIPUser-getLockCategories"), 'fakehash-1', 'outro', 'b05a20424f24a53dac1b059fb78d861ba9723645026be2174c93a94f9106bb35']);
|
||||||
await db.prepare("run", insertLockCategoryQuery, [getHash("VIPUser-getLockCategories"), 'fakehash-2', 'intro', 'b05acd1cd6ec7dffe5ffea64ada91ae7469d6db2ce21c7e30ad7fa62075d450']);
|
await db.prepare("run", insertLockCategoryQuery, [getHash("VIPUser-getLockCategories"), 'fakehash-2', 'intro', 'b05acd1cd6ec7dffe5ffea64ada91ae7469d6db2ce21c7e30ad7fa62075d450']);
|
||||||
|
await db.prepare("run", insertLockCategoryQuery, [getHash("VIPUser-getLockCategories"), 'fakehash-2', 'preview', 'b05acd1cd6ec7dffe5ffea64ada91ae7469d6db2ce21c7e30ad7fa62075d450']);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Database should be greater or equal to version 18', async () => {
|
it('Database should be greater or equal to version 18', async () => {
|
||||||
@@ -27,19 +28,23 @@ describe('getLockCategoriesByHash', () => {
|
|||||||
else return 'Version isn\'t greater than 18. Version is ' + version;
|
else return 'Version isn\'t greater than 18. Version is ' + version;
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should be able to get multiple locks', (done: Done) => {
|
it('Should be able to get multiple locks in one object', (done: Done) => {
|
||||||
fetch(getbaseURL() + '/api/lockCategories/67a65')
|
fetch(getbaseURL() + '/api/lockCategories/67a65')
|
||||||
.then(async res => {
|
.then(async res => {
|
||||||
if (res.status !== 200) {
|
if (res.status !== 200) {
|
||||||
done("non 200");
|
done("non 200");
|
||||||
} else {
|
} else {
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.length !== 2) {
|
if (data.length !== 1) {
|
||||||
done(`Returned incorrect number of locks "${data.length}"`);
|
done(`Returned incorrect number of videos "${data.length}"`);
|
||||||
} else if (data[0].category !== "sponsor") {
|
} else if (data[0].videoID !== "getLockHash-1") {
|
||||||
done(`Returned incorrect category "${data[0].category}"`);
|
done(`Returned incorrect videoID "${data[0].videoID}"`);
|
||||||
} else if (data[1].category !== "interaction") {
|
} else if (data[0].hash !== getHash("getLockHash-1", 1)) {
|
||||||
done(`Returned incorrect category "${data[1].category}"`);
|
done(`Returned incorrect hash "${data[0].hash}"`);
|
||||||
|
} else if (data[0].categories[0] !== "sponsor") {
|
||||||
|
done(`Returned incorrect category "${data[0].categories[0]}"`);
|
||||||
|
} else if (data[0].categories[1] !== "interaction") {
|
||||||
|
done(`Returned incorrect category "${data[0].categories[1]}"`);
|
||||||
} else {
|
} else {
|
||||||
done(); // pass
|
done(); // pass
|
||||||
}
|
}
|
||||||
@@ -48,7 +53,7 @@ describe('getLockCategoriesByHash', () => {
|
|||||||
.catch(() => ("couldn't call endpoint"));
|
.catch(() => ("couldn't call endpoint"));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should be able to get single locks', (done: Done) => {
|
it('Should be able to get single lock', (done: Done) => {
|
||||||
fetch(getbaseURL() + '/api/lockCategories/dff09')
|
fetch(getbaseURL() + '/api/lockCategories/dff09')
|
||||||
.then(async res => {
|
.then(async res => {
|
||||||
if (res.status !== 200) {
|
if (res.status !== 200) {
|
||||||
@@ -56,9 +61,15 @@ describe('getLockCategoriesByHash', () => {
|
|||||||
} else {
|
} else {
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.length !== 1) {
|
if (data.length !== 1) {
|
||||||
done('Returned incorrect number of locks "' + data.length + '"');
|
done('Returned incorrect number of videos "' + data.length + '"');
|
||||||
} else if (data[0].category !== "preview") {
|
} else if (data[0].videoID !== "getLockHash-2") {
|
||||||
done(`Returned incorrect category "${data[0].category}"`);
|
done(`Returned incorrect videoID "${data[0].videoID}"`);
|
||||||
|
} else if (data[0].hash !== getHash("getLockHash-2", 1)) {
|
||||||
|
done(`Returned incorrect hashedVideoID hash "${data[0].hash}"`);
|
||||||
|
} else if (data[0].categories.length !== 1) {
|
||||||
|
done(`Returned incorrect number of categories "${data[0].categories.length}"`);
|
||||||
|
} else if (data[0].categories[0] !== "preview") {
|
||||||
|
done(`Returned incorrect category "${data[0].categories[0]}"`);
|
||||||
} else {
|
} else {
|
||||||
done(); // pass
|
done(); // pass
|
||||||
}
|
}
|
||||||
@@ -75,9 +86,15 @@ describe('getLockCategoriesByHash', () => {
|
|||||||
} else {
|
} else {
|
||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.length !== 1) {
|
if (data.length !== 1) {
|
||||||
done('Returned incorrect number of locks "' + data.length + '"');
|
done('Returned incorrect number of videos "' + data.length + '"');
|
||||||
} else if (data[0].category !== "nonmusic") {
|
} else if (data[0].videoID !== "getLockHash-3") {
|
||||||
done(`Returned incorrect category "${data[0].category}"`);
|
done(`Returned incorrect videoID "${data[0].videoID}"`);
|
||||||
|
} else if (data[0].hash !== getHash("getLockHash-3", 1)) {
|
||||||
|
done(`Returned incorrect hashedVideoID hash "${data[0].hash}"`);
|
||||||
|
} else if (data[0].categories.length !== 1) {
|
||||||
|
done(`Returned incorrect number of categories "${data[0].categories.length}"`);
|
||||||
|
} else if (data[0].categories[0] !== "nonmusic") {
|
||||||
|
done(`Returned incorrect category "${data[0].categories[0]}"`);
|
||||||
} else {
|
} else {
|
||||||
done(); // pass
|
done(); // pass
|
||||||
}
|
}
|
||||||
@@ -86,7 +103,7 @@ describe('getLockCategoriesByHash', () => {
|
|||||||
.catch(() => ("couldn't call endpoint"));
|
.catch(() => ("couldn't call endpoint"));
|
||||||
});
|
});
|
||||||
|
|
||||||
it('Should be able to get multiple by similar hash', (done: Done) => {
|
it('Should be able to get multiple by similar hash with multiple categories', (done: Done) => {
|
||||||
fetch(getbaseURL() + '/api/lockCategories/b05a')
|
fetch(getbaseURL() + '/api/lockCategories/b05a')
|
||||||
.then(async res => {
|
.then(async res => {
|
||||||
if (res.status !== 200) {
|
if (res.status !== 200) {
|
||||||
@@ -95,9 +112,23 @@ describe('getLockCategoriesByHash', () => {
|
|||||||
const data = await res.json();
|
const data = await res.json();
|
||||||
if (data.length !== 2) {
|
if (data.length !== 2) {
|
||||||
done(`Returned incorrect number of locks "${data.length}"`);
|
done(`Returned incorrect number of locks "${data.length}"`);
|
||||||
} else if (data[0].category !== "outro") {
|
} else if (data[0].videoID !== "fakehash-1") {
|
||||||
|
done(`Returned incorrect videoID "${data[0].videoID}"`);
|
||||||
|
} else if (data[1].videoID !== "fakehash-2") {
|
||||||
|
done(`Returned incorrect videoID "${data[1].videoID}"`);
|
||||||
|
} else if (data[0].hash !== "b05a20424f24a53dac1b059fb78d861ba9723645026be2174c93a94f9106bb35") {
|
||||||
|
done(`Returned incorrect hashedVideoID hash "${data[0].hash}"`);
|
||||||
|
} else if (data[1].hash !== "b05acd1cd6ec7dffe5ffea64ada91ae7469d6db2ce21c7e30ad7fa62075d450") {
|
||||||
|
done(`Returned incorrect hashedVideoID hash "${data[1].hash}"`);
|
||||||
|
} else if (data[0].categories.length !== 1) {
|
||||||
|
done(`Returned incorrect number of categories "${data[0].categories.length}"`);
|
||||||
|
} else if (data[1].categories.length !== 2) {
|
||||||
|
done(`Returned incorrect number of categories "${data[1].categories.length}"`);
|
||||||
|
} else if (data[0].categories[0] !== "outro") {
|
||||||
done(`Returned incorrect category "${data[0].category}"`);
|
done(`Returned incorrect category "${data[0].category}"`);
|
||||||
} else if (data[1].category !== "intro") {
|
} else if (data[1].categories[0] !== "intro") {
|
||||||
|
done(`Returned incorrect category "${data[1].category}"`);
|
||||||
|
} else if (data[1].categories[1] !== "preview") {
|
||||||
done(`Returned incorrect category "${data[1].category}"`);
|
done(`Returned incorrect category "${data[1].category}"`);
|
||||||
} else {
|
} else {
|
||||||
done(); // pass
|
done(); // pass
|
||||||
|
|||||||
Reference in New Issue
Block a user