Files
reader/lib/server-api.ts
virtus 41aca718c9 Refactor API integration and data fetching for genre, novel, and chapter pages
- Replace Prisma database calls with API fetches from the reader API in GenreDetailPage, GenresPage, SearchPage, ChapterReaderPage, and NovelDetailPage.
- Introduce new utility functions for API requests in server-api.ts, including error handling.
- Update authentication flow in auth.ts to sync Google login with the reader API.
- Modify NextAuth session and JWT types to include additional user information.
- Clean up unused imports and code related to Prisma and MongoDB connections.
- Adjust the configuration in next.config.mjs to remove unnecessary API routes.
2026-03-30 13:54:51 +07:00

48 lines
1.2 KiB
TypeScript

const apiBaseUrl = (process.env.READER_API_ORIGIN || "http://localhost:8000").replace(/\/+$/, "")
export class ReaderApiError extends Error {
status: number
constructor(status: number, message: string) {
super(message)
this.status = status
}
}
function buildApiUrl(path: string) {
return `${apiBaseUrl}${path.startsWith("/") ? path : `/${path}`}`
}
export async function readerApiFetch<T>(path: string, init?: RequestInit): Promise<T> {
const response = await fetch(buildApiUrl(path), {
...init,
cache: init?.cache ?? "no-store",
headers: {
Accept: "application/json",
...(init?.headers || {}),
},
})
if (!response.ok) {
let detail = response.statusText
try {
const data = await response.json()
detail = data?.detail || data?.error || detail
} catch {}
throw new ReaderApiError(response.status, `Reader API error ${response.status}: ${detail}`)
}
return response.json() as Promise<T>
}
export async function readerApiFetchNullable<T>(path: string, init?: RequestInit): Promise<T | null> {
try {
return await readerApiFetch<T>(path, init)
} catch (error) {
if (error instanceof ReaderApiError && error.status === 404) {
return null
}
throw error
}
}