mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-25 08:58:23 +03:00
use shared parseParams helper
This commit is contained in:
75
src/utils/parseParams.ts
Normal file
75
src/utils/parseParams.ts
Normal file
@@ -0,0 +1,75 @@
|
||||
import { Request } from "express";
|
||||
import { ActionType, SegmentUUID, Category } from "../types/segments.model";
|
||||
import { config } from "../config";
|
||||
|
||||
type fn = (req: Request, fallback: any) => any[];
|
||||
|
||||
const syntaxErrorWrapper = (fn: fn, req: Request, fallback: any) => {
|
||||
try { return fn(req, fallback); }
|
||||
catch (e) {
|
||||
return undefined;
|
||||
}
|
||||
};
|
||||
|
||||
const getCategories = (req: Request, fallback: Category[] ): string[] | Category[] =>
|
||||
req.query.categories
|
||||
? JSON.parse(req.query.categories as string)
|
||||
: req.query.category
|
||||
? Array.isArray(req.query.category)
|
||||
? req.query.category
|
||||
: [req.query.category]
|
||||
: fallback;
|
||||
|
||||
const validateString = (array: any[]): any[] => {
|
||||
if (!Array.isArray(array)) return undefined;
|
||||
return array
|
||||
.filter((item: any) => typeof item === "string")
|
||||
.filter((item: string) => !(/[^a-z|_|-]/.test(item)));
|
||||
};
|
||||
|
||||
const filterActionType = (actionTypes: ActionType[]) => {
|
||||
const filterCategories = new Set();
|
||||
for (const [key, value] of Object.entries(config.categorySupport)) {
|
||||
for (const type of actionTypes) {
|
||||
if (value.includes(type)) {
|
||||
filterCategories.add(key as Category);
|
||||
}
|
||||
}
|
||||
}
|
||||
return [...filterCategories];
|
||||
};
|
||||
|
||||
export const filterInvalidCategoryActionType = (categories: Category[], actionTypes: ActionType[]): Category[] =>
|
||||
categories.filter((category: Category) => filterActionType(actionTypes).includes(category));
|
||||
|
||||
const getActionTypes = (req: Request, fallback: ActionType[]): ActionType[] =>
|
||||
req.query.actionTypes
|
||||
? JSON.parse(req.query.actionTypes as string)
|
||||
: req.query.actionType
|
||||
? Array.isArray(req.query.actionType)
|
||||
? req.query.actionType
|
||||
: [req.query.actionType]
|
||||
: fallback;
|
||||
|
||||
// fallback to empty array
|
||||
const getRequiredSegments = (req: Request): SegmentUUID[] =>
|
||||
req.query.requiredSegments
|
||||
? JSON.parse(req.query.requiredSegments as string)
|
||||
: req.query.requiredSegment
|
||||
? Array.isArray(req.query.requiredSegment)
|
||||
? req.query.requiredSegment
|
||||
: [req.query.requiredSegment]
|
||||
: [];
|
||||
|
||||
export const parseCategories = (req: Request, fallback: Category[]): Category[] => {
|
||||
const categories = syntaxErrorWrapper(getCategories, req, fallback);
|
||||
return categories ? validateString(categories) : undefined;
|
||||
};
|
||||
|
||||
export const parseActionTypes = (req: Request, fallback: ActionType[]): ActionType[] => {
|
||||
const actionTypes = syntaxErrorWrapper(getActionTypes, req, fallback);
|
||||
return actionTypes ? validateString(actionTypes) : undefined;
|
||||
};
|
||||
|
||||
export const parseRequiredSegments = (req: Request): SegmentUUID[] | undefined =>
|
||||
syntaxErrorWrapper(getRequiredSegments, req, []); // never fall back
|
||||
@@ -2,42 +2,7 @@ import { Request } from "express";
|
||||
import { ActionType, SegmentUUID, Category, Service } from "../types/segments.model";
|
||||
import { getService } from "./getService";
|
||||
|
||||
type fn = (req: Request) => any[];
|
||||
|
||||
const syntaxErrorWrapper = (fn: fn, req: Request) => {
|
||||
try { return fn(req); }
|
||||
catch (e) { return undefined; }
|
||||
};
|
||||
|
||||
// Default to sponsor
|
||||
const getCategories = (req: Request): Category[] =>
|
||||
req.query.categories
|
||||
? JSON.parse(req.query.categories as string)
|
||||
: req.query.category
|
||||
? Array.isArray(req.query.category)
|
||||
? req.query.category
|
||||
: [req.query.category]
|
||||
: ["sponsor"];
|
||||
|
||||
// Default to skip
|
||||
const getActionTypes = (req: Request): ActionType[] =>
|
||||
req.query.actionTypes
|
||||
? JSON.parse(req.query.actionTypes as string)
|
||||
: req.query.actionType
|
||||
? Array.isArray(req.query.actionType)
|
||||
? req.query.actionType
|
||||
: [req.query.actionType]
|
||||
: [ActionType.Skip];
|
||||
|
||||
// Default to empty array
|
||||
const getRequiredSegments = (req: Request): SegmentUUID[] =>
|
||||
req.query.requiredSegments
|
||||
? JSON.parse(req.query.requiredSegments as string)
|
||||
: req.query.requiredSegment
|
||||
? Array.isArray(req.query.requiredSegment)
|
||||
? req.query.requiredSegment
|
||||
: [req.query.requiredSegment]
|
||||
: [];
|
||||
import { parseCategories, parseActionTypes, parseRequiredSegments } from "./parseParams";
|
||||
|
||||
const errorMessage = (parameter: string) => `${parameter} parameter does not match format requirements.`;
|
||||
|
||||
@@ -48,20 +13,14 @@ export function parseSkipSegments(req: Request): {
|
||||
service: Service;
|
||||
errors: string[];
|
||||
} {
|
||||
let categories: Category[] = syntaxErrorWrapper(getCategories, req);
|
||||
const actionTypes: ActionType[] = syntaxErrorWrapper(getActionTypes, req);
|
||||
const requiredSegments: SegmentUUID[] = syntaxErrorWrapper(getRequiredSegments, req);
|
||||
const categories: Category[] = parseCategories(req, [ "sponsor" as Category ]);
|
||||
const actionTypes: ActionType[] = parseActionTypes(req, [ActionType.Skip]);
|
||||
const requiredSegments: SegmentUUID[] = parseRequiredSegments(req);
|
||||
const service: Service = getService(req.query.service, req.body.services);
|
||||
const errors: string[] = [];
|
||||
if (!Array.isArray(categories)) errors.push(errorMessage("categories"));
|
||||
else {
|
||||
// check category names for invalid characters
|
||||
// and none string elements
|
||||
categories = categories
|
||||
.filter((item: any) => typeof item === "string")
|
||||
.filter((category) => !(/[^a-z|_|-]/.test(category)));
|
||||
if (categories.length === 0) errors.push("No valid categories provided.");
|
||||
}
|
||||
else if (categories.length === 0) errors.push("No valid categories provided.");
|
||||
|
||||
if (!Array.isArray(actionTypes)) errors.push(errorMessage("actionTypes"));
|
||||
if (!Array.isArray(requiredSegments)) errors.push(errorMessage("requiredSegments"));
|
||||
// finished parsing
|
||||
|
||||
Reference in New Issue
Block a user