You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
wattpad-deno/src/classes/Search.ts

74 lines
1.9 KiB

import { SearchResults, Session } from "../types.d.ts";
import Work from "./Story.ts";
export interface SearchParameters {
query: string | string[];
type: "text" | "title" | "tag";
sort?: string;
limit?: number;
}
export interface PrivateSearchParameters {
query: string | string[];
type: "text" | "title" | "tag";
limit: number;
sort: string;
}
export default class Search {
#opts: PrivateSearchParameters = {
query: "",
type: "text",
limit: 30,
sort: "hot",
};
#session: Session;
results: Work[] = [];
constructor(
opts: SearchParameters,
session: Session,
) {
this.#session = session;
Object.assign(this.#opts, opts);
switch (this.#opts.type) {
case "title":
this.#opts.query = "title:" + this.#opts.query;
break;
case "tag":
if (this.#opts.query.constructor === Array) {
this.#opts.query = "#" + this.#opts.query.join(" #");
}
break;
case "text":
default:
break;
}
}
async update(pageNum: number) {
this.results = [];
const res = await (await this.#session.get("/v4/stories", false, {
params: new URLSearchParams({
fields: "stories(id)",
query: this.#opts.query as string,
filter: this.#opts.sort,
limit: this.#opts.limit.toString(),
offset: (pageNum * this.#opts.limit).toString(),
mature: "1",
}),
})).json() as SearchResults;
for (let i = 0; i < res.stories.length; i++) {
const work = new Work(
res.stories[i].id,
this.#session,
);
this.results.push(work);
}
}
}