diff --git a/apps/frontend/lib/api/endpoints/admin.client.ts b/apps/frontend/lib/api/endpoints/admin.client.ts new file mode 100644 index 0000000..38850eb --- /dev/null +++ b/apps/frontend/lib/api/endpoints/admin.client.ts @@ -0,0 +1,208 @@ +import { Resource } from "@/lib/types/resource"; +import { clientFetch } from "../client"; +import { Blog } from "@/lib/types/blog"; +import { BlogPermission } from "@/lib/types/Blog.Permission.enum"; +import { User } from "@/lib/types/user"; + +// ======== Resource ======== +export async function listResources() { + return clientFetch('/api/admin/web/resource') +} + +interface CreateResourceParams { + title: string; + description: string; + imageUrl: string; + link: string; + tags: { + name: string; + type: string; + }[]; +} +export async function createResource(data: CreateResourceParams) { + data.title = data.title.trim(); + data.description = data.description.trim(); + data.imageUrl = data.imageUrl.trim(); + data.link = data.link.trim(); + for (let tag of data.tags) { + tag.name = tag.name.trim(); + } + + return clientFetch('/api/admin/web/resource', { + method: 'POST', + body: JSON.stringify(data) + }) +} + +export async function getResource(id: string) { + return clientFetch(`/api/admin/web/resource/${id}`) +} + +export async function removeResource(id: string) { + return clientFetch(`/api/admin/web/resource/${id}`, { + method: 'DELETE', + }) +} + +interface UpdateResourceParams { + title: string; + description: string; + imageUrl: string; + link: string; + tags: { + name: string; + type: string; + }[]; +} +export async function updateResource(id: string, data: UpdateResourceParams) { + data.title = data.title.trim(); + data.description = data.description.trim(); + data.imageUrl = data.imageUrl.trim(); + data.link = data.link.trim(); + for (let tag of data.tags) { + tag.name = tag.name.trim(); + } + + return clientFetch(`/api/admin/web/resource/${id}`, { + method: 'PUT', + body: JSON.stringify(data) + }) +} + + + +// ======== Blog ======== +interface CreateBlogParams { + title: string; + description: string; + contentUrl: string; +} +export async function createBlog(data: CreateBlogParams) { + return clientFetch('/api/admin/web/blog', { + method: 'POST', + body: JSON.stringify(data) + }) +} + +export async function getBlog(id: string) { + return clientFetch(`/api/admin/web/blog/${id}`) +} + +export async function listBlogs() { + return clientFetch('/api/admin/web/blog') +} + +export async function removeBlogs(id: string) { + // ? Blog + return clientFetch(`/api/admin/web/blog/${id}`, { + method: 'DELETE', + }) +} + + +interface UpdateBlogParams { + title: string; + description: string; + contentUrl: string; + permissions: BlogPermission[], +} +export async function updateBlog(id: string, data: UpdateBlogParams) { + data.title = data.title.trim(); + data.description = data.description.trim(); + data.contentUrl = data.contentUrl.trim(); + + return clientFetch(`/api/admin/web/blog/${id}`, { + method: 'PUT', + body: JSON.stringify(data) + }) +} + +export async function setBlogPassword(id: string, password: string) { + password = password.trim(); + return clientFetch(`/api/admin/web/blog/${id}/password`, { + method: 'POST', + body: JSON.stringify({ + password, + }) + }) +} + + + +// ======== User ======== +interface CreateUserParams { + username: string | null; + nickname: string | null; + email: string | null; + phone: string | null; + password: string | null; +} +export async function createUser(data: CreateUserParams) { + type Keys = keyof CreateUserParams; + for (let key in data) { + data[key as Keys] = data[key as Keys]?.trim() || null; + } + + return clientFetch("/api/admin/user", { + method: "POST", + body: JSON.stringify(data), + }); +} + +export function getUser(id: string) { + return clientFetch(`/api/admin/user/${id}`); +} + +export interface UserListParams { + page?: number + pageSize?: number +} +export interface UserListResponse { + items: User[], + total: number + page: number + pageSize: number +} +export function listUsers(params?: UserListParams): Promise { + const searchParams = new URLSearchParams() + if (params?.page) searchParams.set('page', params.page.toString()) + if (params?.pageSize) searchParams.set('pageSize', params.pageSize.toString()) + + return clientFetch('/api/admin/user') +} + +export async function removeUser(userId: string, soft: boolean = true) { + /** 我也不知道后端返回的是个啥...没报错就当成功吧 */ + return clientFetch(`/api/admin/user/${userId}?soft=${soft}`, { + method: 'DELETE', + }) +} + +export async function setUserPassword(userId: string, password: string) { + password = password.trim(); + + return clientFetch(`/api/admin/user/${userId}/password`, { + method: 'POST', + body: JSON.stringify({ + password, + }), + }) +} + +export interface updateUser { + username: string; + nickname: string; + email: string | null; + phone: string | null; +} +export async function updateUser(userId: string, user: updateUser) { + user.username = user.username.trim(); + user.nickname = user.nickname.trim(); + user.email = user.email?.trim() || null; + user.phone = user.phone?.trim() || null; + + return clientFetch(`/api/admin/user/${userId}`, { + body: JSON.stringify(user), + method: "PUT", + }); +} \ No newline at end of file