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