import { Router } from "express"; import type { Request } from "express"; import { graphqlClient } from "../lib/graphqlClient"; import { respondWithError } from "../lib/error"; import { GetAuthorDocument, AuthorsDocument, CreateAuthorDocument, type AuthorsQuery, type GetAuthorQuery, type CreateAuthorMutation, } from "../../shared/generated/graphql"; const router = Router(); // GET /api/authors interface GqlRequest extends Request { gql?: typeof graphqlClient; } router.get("/", async (req: GqlRequest, res) => { try { const variables = { limit: req.query.limit ? Number(req.query.limit) : undefined, offset: req.query.offset ? Number(req.query.offset) : undefined, search: req.query.search as string | undefined, countryId: req.query.countryId as string | undefined, }; const client = req.gql || graphqlClient; const { authors } = await client.request( AuthorsDocument, variables ); res.json(authors); } catch (error) { respondWithError(res, error, "Failed to fetch authors"); } }); // GET /api/authors/:id (use id instead of slug to align with GraphQL schema) router.get("/:id", async (req: GqlRequest, res) => { try { const client = req.gql || graphqlClient; const { author } = await client.request( GetAuthorDocument, { id: req.params.id, } ); if (!author) return res.status(404).json({ message: "Author not found" }); res.json(author); } catch (error) { respondWithError(res, error, "Failed to fetch author"); } }); // POST /api/authors router.post("/", async (req: GqlRequest, res) => { try { const client = req.gql || graphqlClient; const { createAuthor } = await client.request( CreateAuthorDocument, { input: req.body, } ); res.status(201).json(createAuthor); } catch (error) { respondWithError(res, error, "Failed to create author"); } }); export default router;