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.
This commit is contained in:
@@ -0,0 +1,48 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user