/** * GraphQL API Endpoint * Powered by GraphQL Yoga */ import type { APIRoute } from "astro"; import { createYoga, createSchema } from "graphql-yoga"; import { typeDefs, resolvers, type GraphQLContext } from "@/lib/graphql"; import { getDatabase, schema } from "@/db"; import { getUserFromRequest } from "@/lib/auth"; import type { NodePgDatabase } from "drizzle-orm/node-postgres"; import { eq } from "drizzle-orm"; // Create GraphQL schema const graphqlSchema = createSchema({ typeDefs, resolvers, }); // Create Yoga instance const yoga = createYoga<{ request: Request }>({ schema: graphqlSchema, graphqlEndpoint: "/api/graphql", // CORS settings cors: { origin: "*", methods: ["GET", "POST", "OPTIONS"], allowedHeaders: ["Content-Type", "Authorization"], }, // Context factory context: async ({ request }): Promise => { const db = getDatabase() as NodePgDatabase; // Get authenticated user if present const tokenPayload = await getUserFromRequest(request); let user = undefined; if (tokenPayload?.userId) { user = await db.query.users.findFirst({ where: eq(schema.users.id, tokenPayload.userId), }) || undefined; } return { db, userId: tokenPayload?.userId, user, }; }, }); // Handle all GraphQL requests const handler: APIRoute = async ({ request }) => { return yoga.handle(request); }; export const GET = handler; export const POST = handler; export const OPTIONS = handler;