Files
2026-03-16 09:32:35 -05:00

56 lines
2.0 KiB
TypeScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import { NextRequest, NextResponse } from "next/server";
import { getAdminToken } from "@/app/lib/pocketbase/admin";
import { getPocketBaseConfig } from "@/config/services.config";
import { getSalonApi } from "@/app/lib/salonApi";
/** 获取志愿者列表 - 优先 salonapi回退直连 PocketBase */
export async function GET(request: NextRequest) {
try {
const { status, data } = await getSalonApi(request, "/api/salon/join/volunteers", {
timeoutMs: 8000,
});
if (status === 200 && data && typeof data === "object") {
const v = (data as { volunteer?: unknown }).volunteer;
const payload = v && typeof v === "object" ? { volunteer: v } : { volunteer: null };
return NextResponse.json(payload);
}
} catch {
// salonapi 不可用,回退直连 PocketBase
}
const token = await getAdminToken();
if (!token) {
return NextResponse.json({ ok: true, volunteer: null }, { status: 200 });
}
const pb = getPocketBaseConfig();
const base = pb.url.replace(/\/$/, "");
try {
const filter = encodeURIComponent("is_volunteer = true && is_approved = true");
const res = await fetch(
`${base}/api/collections/${pb.joinCollection}/records?filter=${filter}&sort=-created&perPage=20`,
{
headers: { Authorization: `Bearer ${token}` },
cache: "no-store",
}
);
if (!res.ok) {
return NextResponse.json({ ok: true, volunteer: null }, { status: 200 });
}
const data = await res.json();
const items = Array.isArray(data?.items) ? data.items : [];
const rec = items[0] ?? null;
const volunteer = rec
? {
nickname: String(rec?.xiaohongshu_nickname || rec?.nickname || "").trim() || "志愿者",
avatar: String(rec?.media || "").trim() || undefined,
xiaohongshu_url: String(rec?.xiaohongshu_url || "").trim() || undefined,
}
: null;
return NextResponse.json({ ok: true, volunteer });
} catch {
return NextResponse.json({ ok: true, volunteer: null }, { status: 200 });
}
}