Files
pak-jabit/storefront/src/app/api/auth/me/route.ts
T
juxtapoandClaude Opus 5 a58a61b98c Pak Jabit: full stack — storefront, Spree customisations, catalogue tooling
A South African men's apparel store on Spree 5.6 + Next.js 15. 160 products
live, three markets, live Malaysian courier rates, customer-owned carts.

What is here:
  storefront/  the Next.js app
  backend/     ONLY the custom Spree code. Spree itself is a prebuilt image
               that mounts no app code, so every file here needs an explicit
               volume entry in docker-compose.yml or it is silently ignored.
  catalogue/   the scripts that loaded and maintain the products
  docs/        manifest, mock registry, napkins

Real .env files are committed deliberately. This lives on the house's private
Gitea, and a clone that runs beats a clone that needs a secrets handover.
LANDMINE.md maps every key, what it opens, and what must be rotated before this
repo goes anywhere less private.

The admin API key used to be a literal in six catalogue scripts. They now read
SPREE_ADMIN_KEY from the environment and refuse to run without it.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
2026-09-15 22:09:55 +08:00

40 lines
1.5 KiB
TypeScript

import { NextRequest, NextResponse } from "next/server";
const SPREE_URL = process.env.NEXT_PUBLIC_SPREE_API_URL || "https://api.jux-lab.com";
const API_KEY = process.env.NEXT_PUBLIC_SPREE_API_KEY || "";
export async function GET(req: NextRequest) {
const token = req.headers.get("Authorization")?.replace("Bearer ", "");
if (!token) return NextResponse.json({ error: "No token" }, { status: 401 });
// Spree's store API wants the store key AND the customer token. Sending only
// the Bearer answers 401 "Valid API key required" — which is what this route
// did from the day it was written, so the profile never loaded at all.
const res = await fetch(`${SPREE_URL}/api/v3/store/customers/me`, {
headers: {
Authorization: `Bearer ${token}`,
"X-Spree-Api-Key": API_KEY,
},
});
const data = await res.json();
return NextResponse.json(data, { status: res.status });
}
export async function PATCH(req: NextRequest) {
const token = req.headers.get("Authorization")?.replace("Bearer ", "");
if (!token) return NextResponse.json({ error: "No token" }, { status: 401 });
const body = await req.json();
const res = await fetch(`${SPREE_URL}/api/v3/store/customers/me`, {
method: "PATCH",
headers: {
Authorization: `Bearer ${token}`,
"Content-Type": "application/json",
"X-Spree-Api-Key": API_KEY,
},
body: JSON.stringify(body),
});
const data = await res.json();
return NextResponse.json(data, { status: res.status });
}