import type { LoaderFunctionArgs } from "@remix-run/node"; import { authenticate } from "../shopify.server"; import db from "../db.server"; import { resolveProductRuleConstraints, resolveProductRefs, productRefsFromCartLines, } from "../services/product-rules.server"; import { parseCartLinesParam, parseProductIdsParam, parseGidListParam } from "../lib/cart-rule-params"; import { resolvePickupLocations } from "../services/pickup-locations.server"; // Standalone list of eligible pickup points (study §3.4 multi-pin pickup). // The same data is also returned inline on `method=PICKUP` availability // responses (`pickupLocations`) — this endpoint stays for callers that just // want the list without asking for a specific location's calendar. Shared // resolution logic lives in pickup-locations.server.ts so the two paths // can't drift. export const loader = async ({ request }: LoaderFunctionArgs) => { const { session, admin } = await authenticate.public.appProxy(request); if (!session) { return Response.json({ error: "Shop not found" }, { status: 404 }); } const url = new URL(request.url); const productIds = parseProductIdsParam(url.searchParams.get("productIds")); const productRefs = admin && productIds.length > 0 ? await resolveProductRefs(admin, productIds) : []; const cartProductRefs = [ ...productRefs, ...productRefsFromCartLines(parseCartLinesParam(url.searchParams.get("cartLines"))), ]; const productRules = await db.productRule.findMany({ where: { shopDomain: session.shop, active: true } }); const ruleConstraints = resolveProductRuleConstraints(productRules, cartProductRefs); // A rule that forbids PICKUP for this cart ⇒ no pickup points at all. if (ruleConstraints.allowedMethods != null && !ruleConstraints.allowedMethods.includes("PICKUP")) { return Response.json({ locations: [] }); } const locations = await resolvePickupLocations(session.shop, { allowedLocationIds: ruleConstraints.allowedLocationIds, admin: admin ?? undefined, productVariantGids: parseGidListParam(url.searchParams.get("variantIds")), }); return Response.json({ locations }); };