50 lines
1.6 KiB
TypeScript
50 lines
1.6 KiB
TypeScript
import { apiClient } from "@/lib/api-client"
|
|
import type { PaginatedResponse, ApiResponse } from "@/types/api"
|
|
import type { SkillTreeChapter, SkillTreeFormData } from "@/types/skill-tree"
|
|
|
|
export interface FetchChaptersParams {
|
|
page?: number
|
|
limit?: number
|
|
categoryId?: string
|
|
}
|
|
|
|
export async function fetchChapters(
|
|
params: FetchChaptersParams = {}
|
|
): Promise<PaginatedResponse<SkillTreeChapter>> {
|
|
const searchParams = new URLSearchParams()
|
|
if (params.page) searchParams.set("page", String(params.page))
|
|
if (params.limit) searchParams.set("limit", String(params.limit))
|
|
if (params.categoryId) searchParams.set("categoryId", params.categoryId)
|
|
|
|
return apiClient
|
|
.get("skill-tree", { searchParams })
|
|
.json<PaginatedResponse<SkillTreeChapter>>()
|
|
}
|
|
|
|
export async function createChapter(
|
|
data: SkillTreeFormData
|
|
): Promise<ApiResponse<SkillTreeChapter>> {
|
|
return apiClient.post("skill-tree", { json: data }).json<ApiResponse<SkillTreeChapter>>()
|
|
}
|
|
|
|
export async function updateChapter(
|
|
id: string,
|
|
data: Partial<SkillTreeFormData>
|
|
): Promise<ApiResponse<SkillTreeChapter>> {
|
|
return apiClient
|
|
.put(`skill-tree/${id}`, { json: data })
|
|
.json<ApiResponse<SkillTreeChapter>>()
|
|
}
|
|
|
|
export async function deleteChapter(id: string): Promise<ApiResponse<{ id: string }>> {
|
|
return apiClient.delete(`skill-tree/${id}`).json<ApiResponse<{ id: string }>>()
|
|
}
|
|
|
|
export async function reorderChapters(
|
|
items: { id: string; sortOrder: number }[]
|
|
): Promise<ApiResponse<void>> {
|
|
return apiClient
|
|
.patch("skill-tree/reorder", { json: { items } })
|
|
.json<ApiResponse<void>>()
|
|
}
|