import type { IRequestAdapter } from '~/interfaces/adapter' import type { IController } from '~/interfaces/controller' import type { IRequestHandler, RequestProxyResult } from '~/interfaces/request' import type { SelectFields } from '~/interfaces/types' import type { ModelWithLiked, PaginateResult } from '~/models/base' import type { PostModel } from '~/models/post' import { autoBind } from '~/utils/auto-bind' import { HTTPClient } from '../core/client' declare module '../core/client' { interface HTTPClient< T extends IRequestAdapter = IRequestAdapter, ResponseWrapper = unknown, > { post: PostController } } export type PostListOptions = { select?: SelectFields year?: number sortBy?: 'categoryId' | 'title' | 'created' | 'modified' sortOrder?: 1 | -1 } export class PostController implements IController { constructor(private client: HTTPClient) { autoBind(this) } base = 'posts' name = 'post' public get proxy(): IRequestHandler { return this.client.proxy(this.base) } /** * 获取文章列表分页 * @param page * @param perPage * @returns */ getList(page = 1, perPage = 10, options: PostListOptions = {}) { const { select, sortBy, sortOrder, year } = options return this.proxy.get>({ params: { page, size: perPage, select: select?.join(' '), sortBy, sortOrder, year, }, }) } /** * 根据分类和路径查找文章 * @param categoryName * @param slug */ getPost( categoryName: string, slug: string, ): RequestProxyResult, ResponseWrapper> /** * 根据 ID 查找文章 * @param id */ getPost(id: string): RequestProxyResult getPost(idOrCategoryName: string, slug?: string): any { if (arguments.length == 1) { return this.proxy(idOrCategoryName).get() } else { return this.proxy(idOrCategoryName)(slug).get() } } /** * 获取最新的文章 */ getLatest() { return this.proxy.latest.get>() } }