feat: use authedFetch in booksApi for auth-aware requests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-06-16 00:25:47 -06:00
parent 71c31fcf5f
commit 405fcbc0a3

View File

@@ -1,4 +1,5 @@
import type { TeachingBook } from '../domain/teachingDesign' import type { TeachingBook } from '../domain/teachingDesign'
import { authedFetch } from '../composables/useAuth'
export interface BookSummary { export interface BookSummary {
id: string id: string
@@ -25,52 +26,34 @@ export interface GenerateResult {
markdown: string markdown: string
} }
interface ErrorBody {
error?: string
}
async function request<T>(path: string, init?: RequestInit): Promise<T> {
const response = await fetch(path, {
...init,
headers: { 'Content-Type': 'application/json', ...(init?.headers ?? {}) },
})
if (!response.ok) {
const body = (await response.json().catch(() => null)) as ErrorBody | null
throw new Error(body?.error ?? `请求失败(${response.status})。`)
}
return response.json() as Promise<T>
}
export function listBooks(): Promise<BookSummary[]> { export function listBooks(): Promise<BookSummary[]> {
return request('/api/books') return authedFetch('/api/books')
} }
export function createBook(name: string): Promise<BookRecord> { export function createBook(name: string): Promise<BookRecord> {
return request('/api/books', { method: 'POST', body: JSON.stringify({ name }) }) return authedFetch('/api/books', { method: 'POST', body: JSON.stringify({ name }) })
} }
export function getBook(id: string): Promise<BookRecord> { export function getBook(id: string): Promise<BookRecord> {
return request(`/api/books/${id}`) return authedFetch(`/api/books/${id}`)
} }
export function updateBook(id: string, data: TeachingBook): Promise<BookMeta> { export function updateBook(id: string, data: TeachingBook): Promise<BookMeta> {
return request(`/api/books/${id}`, { method: 'PUT', body: JSON.stringify({ data }) }) return authedFetch(`/api/books/${id}`, { method: 'PUT', body: JSON.stringify({ data }) })
} }
export function renameBook(id: string, name: string): Promise<BookMeta> { export function renameBook(id: string, name: string): Promise<BookMeta> {
return request(`/api/books/${id}`, { method: 'PATCH', body: JSON.stringify({ name }) }) return authedFetch(`/api/books/${id}`, { method: 'PATCH', body: JSON.stringify({ name }) })
} }
export function deleteBook(id: string): Promise<{ ok: true }> { export function deleteBook(id: string): Promise<{ ok: true }> {
return request(`/api/books/${id}`, { method: 'DELETE' }) return authedFetch(`/api/books/${id}`, { method: 'DELETE' })
} }
export function generateLesson(topic: string): Promise<GenerateResult> { export function generateLesson(topic: string): Promise<GenerateResult> {
return request('/api/generate', { method: 'POST', body: JSON.stringify({ topic }) }) return authedFetch('/api/generate', { method: 'POST', body: JSON.stringify({ topic }) })
} }
export function generateOutline(theme: string): Promise<{ titles: string[] }> { export function generateOutline(theme: string): Promise<{ titles: string[] }> {
return request('/api/generate/outline', { method: 'POST', body: JSON.stringify({ theme }) }) return authedFetch('/api/generate/outline', { method: 'POST', body: JSON.stringify({ theme }) })
} }