From 93c69248d9ddd08f7b9656e752953ede6db270ad Mon Sep 17 00:00:00 2001 From: Haidang666 Date: Mon, 13 Sep 2021 14:49:17 +0700 Subject: [PATCH] Add getService helper function --- src/routes/getSearchSegments.ts | 6 ++---- src/routes/getSkipSegments.ts | 6 ++---- src/routes/getSkipSegmentsByHash.ts | 6 ++---- src/routes/postClearCache.ts | 3 ++- src/routes/postSkipSegments.ts | 6 ++---- src/utils/getService.ts | 16 ++++++++++++++++ test/cases/getService.ts | 29 +++++++++++++++++++++++++++++ 7 files changed, 55 insertions(+), 17 deletions(-) create mode 100644 src/utils/getService.ts create mode 100644 test/cases/getService.ts diff --git a/src/routes/getSearchSegments.ts b/src/routes/getSearchSegments.ts index 5a86b55..684386b 100644 --- a/src/routes/getSearchSegments.ts +++ b/src/routes/getSearchSegments.ts @@ -1,6 +1,7 @@ import { Request, Response } from "express"; import { db } from "../databases/databases"; import { ActionType, Category, DBSegment, Service, VideoID } from "../types/segments.model"; +import { getService } from "../utils/getService"; const segmentsPerPage = 10; type searchSegmentResponse = { @@ -59,10 +60,7 @@ async function handleGetSegments(req: Request, res: Response): Promise val == service)) { - service = Service.YouTube; - } + const service = getService(req.query.service, req.body.service); let page: number = req.query.page ?? req.body.page ?? 0; page = Number(page); diff --git a/src/routes/getSkipSegments.ts b/src/routes/getSkipSegments.ts index 9968726..895ea64 100644 --- a/src/routes/getSkipSegments.ts +++ b/src/routes/getSkipSegments.ts @@ -10,6 +10,7 @@ import { getIP } from "../utils/getIP"; import { Logger } from "../utils/logger"; import { QueryCacher } from "../utils/queryCacher"; import { getReputation } from "../utils/reputation"; +import { getService } from "../utils/getService"; async function prepareCategorySegments(req: Request, videoID: VideoID, category: Category, segments: DBSegment[], cache: SegmentCache = {shadowHiddenSegmentIPs: {}}): Promise { @@ -317,10 +318,7 @@ async function handleGetSegments(req: Request, res: Response): Promise val == service)) { - service = Service.YouTube; - } + const service = getService(req.query.service, req.body.service); const segments = await getSegmentsByVideoID(req, videoID, categories, actionTypes, requiredSegments, service); diff --git a/src/routes/getSkipSegmentsByHash.ts b/src/routes/getSkipSegmentsByHash.ts index 6b8f00c..39ef9e6 100644 --- a/src/routes/getSkipSegmentsByHash.ts +++ b/src/routes/getSkipSegmentsByHash.ts @@ -2,6 +2,7 @@ import {hashPrefixTester} from "../utils/hashPrefixTester"; import {getSegmentsByHash} from "./getSkipSegments"; import {Request, Response} from "express"; import { ActionType, Category, SegmentUUID, Service, VideoIDHash } from "../types/segments.model"; +import { getService } from "../utils/getService"; export async function getSkipSegmentsByHash(req: Request, res: Response): Promise { let hashPrefix = req.params.prefix as VideoIDHash; @@ -58,10 +59,7 @@ export async function getSkipSegmentsByHash(req: Request, res: Response): Promis return res.status(400).send("Bad parameter: requiredSegments (invalid JSON)"); } - let service: Service = req.query.service ?? req.body.service ?? Service.YouTube; - if (!Object.values(Service).some((val) => val == service)) { - service = Service.YouTube; - } + const service = getService(req.query.service, req.body.service); // filter out none string elements, only flat array with strings is valid categories = categories.filter((item: any) => typeof item === "string"); diff --git a/src/routes/postClearCache.ts b/src/routes/postClearCache.ts index 5a15ee7..8835ddd 100644 --- a/src/routes/postClearCache.ts +++ b/src/routes/postClearCache.ts @@ -6,11 +6,12 @@ import { Service, VideoID } from "../types/segments.model"; import { QueryCacher } from "../utils/queryCacher"; import { isUserVIP } from "../utils/isUserVIP"; import { VideoIDHash } from "../types/segments.model"; +import { getService } from "../utils/getService"; export async function postClearCache(req: Request, res: Response): Promise { const videoID = req.query.videoID as VideoID; const userID = req.query.userID as UserID; - const service = req.query.service as Service ?? Service.YouTube; + const service = getService(req.query.service as Service); const invalidFields = []; if (typeof videoID !== "string") { diff --git a/src/routes/postSkipSegments.ts b/src/routes/postSkipSegments.ts index f726cfa..5420271 100644 --- a/src/routes/postSkipSegments.ts +++ b/src/routes/postSkipSegments.ts @@ -19,6 +19,7 @@ import { APIVideoData, APIVideoInfo } from "../types/youtubeApi.model"; import { UserID } from "../types/user.model"; import { isUserVIP } from "../utils/isUserVIP"; import { parseUserAgent } from "../utils/userAgent"; +import { getService } from "../utils/getService"; type CheckResult = { pass: boolean, @@ -545,10 +546,7 @@ function proxySubmission(req: Request) { function preprocessInput(req: Request) { const videoID = req.query.videoID || req.body.videoID; const userID = req.query.userID || req.body.userID; - let service: Service = req.query.service ?? req.body.service ?? Service.YouTube; - if (!Object.values(Service).some((val) => val === service)) { - service = Service.YouTube; - } + const service = getService(req.query.service, req.body.service); const videoDurationParam: VideoDuration = (parseFloat(req.query.videoDuration || req.body.videoDuration) || 0) as VideoDuration; const videoDuration = videoDurationParam; diff --git a/src/utils/getService.ts b/src/utils/getService.ts new file mode 100644 index 0000000..980f240 --- /dev/null +++ b/src/utils/getService.ts @@ -0,0 +1,16 @@ +import { Service } from "../types/segments.model"; + +export function getService(...value: T[]): Service { + for (const name of value) { + if (name) { + const service = Object.values(Service).find( + (val) => val.toLowerCase() === name.trim().toLowerCase() + ); + if (service) { + return service; + } + } + } + + return Service.YouTube; +} diff --git a/test/cases/getService.ts b/test/cases/getService.ts new file mode 100644 index 0000000..a223247 --- /dev/null +++ b/test/cases/getService.ts @@ -0,0 +1,29 @@ +import { getService } from "../../src/utils/getService"; +import { Service } from "../../src/types/segments.model"; + +import assert from "assert"; + +describe("getService", () => { + it("Should return youtube if not match", () => { + assert.strictEqual(getService(), Service.YouTube); + assert.strictEqual(getService(""), Service.YouTube); + assert.strictEqual(getService("test", "not exist"), Service.YouTube); + assert.strictEqual(getService(null, null), Service.YouTube); + assert.strictEqual(getService(undefined, undefined), Service.YouTube); + assert.strictEqual(getService(undefined), Service.YouTube); + }); + + it("Should return Youtube", () => { + assert.strictEqual(getService("youtube"), Service.YouTube); + assert.strictEqual(getService(" Youtube "), Service.YouTube); + assert.strictEqual(getService(" YouTube "), Service.YouTube); + assert.strictEqual(getService(undefined, " YouTube "), Service.YouTube); + }); + + it("Should return PeerTube", () => { + assert.strictEqual(getService("PeerTube"), Service.PeerTube); + assert.strictEqual(getService(" PeerTube "), Service.PeerTube); + assert.strictEqual(getService(" peertube "), Service.PeerTube); + assert.strictEqual(getService(undefined, " PeerTube "), Service.PeerTube); + }); +});