mirror of
https://github.com/ajayyy/SponsorBlockServer.git
synced 2025-12-19 14:09:06 +03:00
Merge pull request #421 from HaiDang666/392_getSearchSegments-pagination
add custom pagination in getSearchSegments
This commit is contained in:
@@ -1,8 +1,9 @@
|
||||
import { Request, Response } from "express";
|
||||
import { db } from "../databases/databases";
|
||||
import { ActionType, Category, DBSegment, Service, VideoID } from "../types/segments.model";
|
||||
import { ActionType, Category, DBSegment, Service, VideoID, SortableFields } from "../types/segments.model";
|
||||
import { getService } from "../utils/getService";
|
||||
const segmentsPerPage = 10;
|
||||
const maxSegmentsPerPage = 100;
|
||||
const defaultSegmentsPerPage = 10;
|
||||
|
||||
type searchSegmentResponse = {
|
||||
segmentCount: number,
|
||||
@@ -19,6 +20,42 @@ function getSegmentsFromDBByVideoID(videoID: VideoID, service: Service): Promise
|
||||
) as Promise<DBSegment[]>;
|
||||
}
|
||||
|
||||
function getSortField<T extends string>(...value: T[]): SortableFields {
|
||||
const fieldByName = Object.values(SortableFields).reduce((acc, fieldName) => {
|
||||
acc[fieldName.toLowerCase()] = fieldName;
|
||||
|
||||
return acc;
|
||||
}, {} as Record<string, SortableFields>);
|
||||
|
||||
for (const name of value) {
|
||||
if (name?.trim()?.toLowerCase() in fieldByName) {
|
||||
return fieldByName[name.trim().toLowerCase()];
|
||||
}
|
||||
}
|
||||
|
||||
return SortableFields.timeSubmitted;
|
||||
}
|
||||
|
||||
function getLimit<T extends string>(value: T): number {
|
||||
const limit = Number(value);
|
||||
if (Number.isInteger(limit)
|
||||
&& limit >= 1
|
||||
&& limit <= maxSegmentsPerPage) {
|
||||
return limit;
|
||||
}
|
||||
|
||||
return defaultSegmentsPerPage;
|
||||
}
|
||||
|
||||
function getPage<T extends string>(value: T): number {
|
||||
const page = Number(value);
|
||||
if (Number.isInteger(page) && page >= 0) {
|
||||
return page;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* Returns what would be sent to the client.
|
||||
@@ -62,8 +99,10 @@ async function handleGetSegments(req: Request, res: Response): Promise<searchSeg
|
||||
|
||||
const service = getService(req.query.service, req.body.service);
|
||||
|
||||
let page: number = req.query.page ?? req.body.page ?? 0;
|
||||
page = Number(page);
|
||||
const page: number = getPage(req.query.page ?? req.body.page);
|
||||
const limit: number = getLimit(req.query.limit ?? req.body.limit);
|
||||
const sortBy: SortableFields = getSortField(req.query.sortBy, req.body.sortBy);
|
||||
const sortDir: string = req.query.sortDir ?? req.body.sortDir ?? "asc";
|
||||
|
||||
const minVotes: number = req.query.minVotes ?? req.body.minVotes ?? -3;
|
||||
const maxVotes: number = req.query.maxVotes ?? req.body.maxVotes ?? Infinity;
|
||||
@@ -99,11 +138,11 @@ async function handleGetSegments(req: Request, res: Response): Promise<searchSeg
|
||||
return false;
|
||||
}
|
||||
|
||||
return filterSegments(segments, page, filters);
|
||||
return filterSegments(segments, filters, page, limit, sortBy, sortDir);
|
||||
}
|
||||
function filterSegments(segments: DBSegment[], page: number, filters: Record<string, any>) {
|
||||
const startIndex = 0+(page*segmentsPerPage);
|
||||
const endIndex = segmentsPerPage+(page*segmentsPerPage);
|
||||
function filterSegments(segments: DBSegment[], filters: Record<string, any>, page: number, limit: number, sortBy: SortableFields, sortDir: string) {
|
||||
const startIndex = 0+(page*limit);
|
||||
const endIndex = limit+(page*limit);
|
||||
const filteredSegments = segments.filter((segment) =>
|
||||
!((segment.votes < filters.minVotes || segment.votes > filters.maxVotes)
|
||||
|| (segment.views < filters.minViews || segment.views > filters.maxViews)
|
||||
@@ -114,10 +153,27 @@ function filterSegments(segments: DBSegment[], page: number, filters: Record<str
|
||||
// return false if any of the conditions are met
|
||||
// return true if none of the conditions are met
|
||||
);
|
||||
|
||||
if (sortBy !== SortableFields.timeSubmitted) {
|
||||
filteredSegments.sort((a,b) => {
|
||||
const key = sortDir === "desc" ? 1 : -1;
|
||||
if (a[sortBy] < b[sortBy]) {
|
||||
return key;
|
||||
}
|
||||
|
||||
if (a[sortBy] > b[sortBy]) {
|
||||
return -key;
|
||||
}
|
||||
|
||||
return 0;
|
||||
});
|
||||
}
|
||||
|
||||
return {
|
||||
segmentCount: filteredSegments.length,
|
||||
page,
|
||||
segments: filteredSegments.slice(startIndex, endIndex)
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user