Renamed class
parent
43e4edc75c
commit
91209c55da
|
@ -0,0 +1,98 @@
|
||||||
|
// Public modules from npm
|
||||||
|
import validator from 'class-validator';
|
||||||
|
|
||||||
|
// Modules from file
|
||||||
|
import { urls } from "../constants/url.js";
|
||||||
|
import PrefixParser from './prefix-parser.js';
|
||||||
|
import { IQuery, TCategory } from "../interfaces";
|
||||||
|
|
||||||
|
// Type definitions
|
||||||
|
type TOrder = "date" | "likes" | "views" | "title" | "rating";
|
||||||
|
type TDate = 365 | 180 | 90 | 30 | 14 | 7 | 3 | 1;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Query used to search handiwork in the "Latest" tab.
|
||||||
|
*/
|
||||||
|
export default class LatestSearchQuery implements IQuery {
|
||||||
|
|
||||||
|
//#region Private fields
|
||||||
|
private static MAX_TAGS = 5;
|
||||||
|
private static MIN_PAGE = 1;
|
||||||
|
//#endregion Private fields
|
||||||
|
|
||||||
|
//#region Properties
|
||||||
|
public category: TCategory = 'games';
|
||||||
|
/**
|
||||||
|
* Ordering type.
|
||||||
|
*
|
||||||
|
* Default: `date`.
|
||||||
|
*/
|
||||||
|
public order: TOrder = 'date';
|
||||||
|
/**
|
||||||
|
* Date limit in days, to be understood as "less than".
|
||||||
|
* Use `1` to indicate "today" or `null` to indicate "anytime".
|
||||||
|
*
|
||||||
|
* Default: `null`
|
||||||
|
*/
|
||||||
|
public date: TDate = null;
|
||||||
|
|
||||||
|
@validator.ArrayMaxSize(LatestSearchQuery.MAX_TAGS, {
|
||||||
|
message: "Too many tags: $value instead of $constraint1"
|
||||||
|
})
|
||||||
|
public includedTags: string[] = [];
|
||||||
|
|
||||||
|
public includedPrefixes: string[] = [];
|
||||||
|
|
||||||
|
@validator.IsInt({
|
||||||
|
message: "$property expect an integer, received $value"
|
||||||
|
})
|
||||||
|
@validator.Min(LatestSearchQuery.MIN_PAGE, {
|
||||||
|
message: "The minimum $property value must be $constraint1, received $value"
|
||||||
|
})
|
||||||
|
public page = LatestSearchQuery.MIN_PAGE;
|
||||||
|
//#endregion Properties
|
||||||
|
|
||||||
|
//#region Public methods
|
||||||
|
/**
|
||||||
|
* Verify that the query values are valid.
|
||||||
|
*/
|
||||||
|
public validate(): boolean {
|
||||||
|
return validator.validateSync(this).length === 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* From the query values it generates the corresponding URL for the platform.
|
||||||
|
* If the query is invalid it throws an exception.
|
||||||
|
*/
|
||||||
|
public createURL(): URL {
|
||||||
|
// Check if the query is valid
|
||||||
|
if (!this.validate()) {
|
||||||
|
throw new Error("Invalid query")
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create the URL
|
||||||
|
const url = new URL(urls.F95_LATEST_PHP);
|
||||||
|
url.searchParams.set("cmd", "list");
|
||||||
|
|
||||||
|
// Set the category
|
||||||
|
url.searchParams.set("cat", this.category);
|
||||||
|
|
||||||
|
// Add tags and prefixes
|
||||||
|
const parser = new PrefixParser();
|
||||||
|
for (const tag of parser.prefixesToIDs(this.includedTags)) {
|
||||||
|
url.searchParams.append("tags[]", tag.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const p of parser.prefixesToIDs(this.includedPrefixes)) {
|
||||||
|
url.searchParams.append("prefixes[]", p.toString());
|
||||||
|
}
|
||||||
|
|
||||||
|
// Set the other values
|
||||||
|
url.searchParams.set("sort", this.order.toString());
|
||||||
|
url.searchParams.set("page", this.page.toString());
|
||||||
|
if (this.date) url.searchParams.set("date", this.date.toString());
|
||||||
|
|
||||||
|
return url;
|
||||||
|
}
|
||||||
|
//#endregion Public methods
|
||||||
|
}
|
Loading…
Reference in New Issue