Files
core/packages/api-client/controllers/note.ts
Innei b22666694a chore: lint
Signed-off-by: Innei <tukon479@gmail.com>
2023-06-10 16:36:14 +08:00

134 lines
3.3 KiB
TypeScript

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 { PaginateResult } from '~/models/base'
import type {
NoteModel,
NoteWrappedPayload,
NoteWrappedWithLikedPayload,
} from '~/models/note'
import type { HTTPClient } from '../core/client'
import type { SortOptions } from './base'
import { autoBind } from '~/utils/auto-bind'
declare module '../core/client' {
interface HTTPClient<
T extends IRequestAdapter = IRequestAdapter,
ResponseWrapper = unknown,
> {
note: NoteController<ResponseWrapper>
}
}
export type NoteListOptions = {
select?: SelectFields<keyof NoteModel>
year?: number
sortBy?: 'weather' | 'mood' | 'title' | 'created' | 'modified'
sortOrder?: 1 | -1
}
export class NoteController<ResponseWrapper> implements IController {
base = 'notes'
name = 'note'
constructor(private client: HTTPClient) {
autoBind(this)
}
get proxy(): IRequestHandler<ResponseWrapper> {
return this.client.proxy(this.base)
}
/**
* 最新日记
*/
getLatest() {
return this.proxy.latest.get<NoteWrappedWithLikedPayload>()
}
/**
* 获取一篇日记,根据 Id 查询需要鉴权
* @param id id | nid
* @param password 访问密码
*/
getNoteById(
id: string,
): Promise<RequestProxyResult<NoteModel, ResponseWrapper>>
getNoteById(id: number): Promise<NoteWrappedPayload>
getNoteById(id: number, password: string): Promise<NoteWrappedPayload>
getNoteById(
id: number,
password: undefined,
singleResult: true,
): Promise<RequestProxyResult<NoteModel, ResponseWrapper>>
getNoteById(
id: number,
password: string,
singleResult: true,
): Promise<RequestProxyResult<NoteModel, ResponseWrapper>>
getNoteById(...rest: any[]): any {
const [id, password = undefined, singleResult = false] = rest
if (typeof id === 'number') {
return this.proxy.nid(id.toString()).get<NoteWrappedWithLikedPayload>({
params: { password, single: singleResult ? '1' : undefined },
})
} else {
return this.proxy(id).get<NoteModel>()
}
}
/**
* 日记列表分页
*/
getList(page = 1, perPage = 10, options: NoteListOptions = {}) {
const { select, sortBy, sortOrder, year } = options
return this.proxy.get<PaginateResult<NoteModel>>({
params: {
page,
size: perPage,
select: select?.join(' '),
sortBy,
sortOrder,
year,
},
})
}
/**
* 获取当前日记的上下各 n / 2 篇日记
*/
getMiddleList(id: string, size = 5) {
return this.proxy.list(id).get<{
data: Pick<NoteModel, 'id' | 'title' | 'nid' | 'created'>[]
size: number
}>({
params: { size },
})
}
/**
* 喜欢这篇日记
*/
likeIt(id: string | number) {
return this.proxy.like(id).get<never>()
}
/**
* 获取专栏内的所有日记
*/
getNoteByTopicId(
topicId: string,
page = 1,
size = 10,
sortOptions: SortOptions = {},
) {
return this.proxy.topics(topicId).get<PaginateResult<NoteModel>>({
params: { page, size, ...sortOptions },
})
}
}