This commit is contained in:
eric
2026-03-26 11:22:55 -05:00
parent 17768ba033
commit 8c865cf0e8
4 changed files with 89 additions and 55 deletions

View File

@@ -1,6 +1,10 @@
import { SITE_ID, getPocketBaseConfig } from "@/config/services.config";
const VIP_EMAIL_LINK_COLLECTION = "vip_email_link";
const PB_FETCH_TIMEOUT = Number(process.env.POCKETBASE_FETCH_TIMEOUT) || 10000;
const PB_ADMIN_TOKEN_TTL_MS = Number(process.env.POCKETBASE_ADMIN_TOKEN_TTL_MS) || 55_000;
let adminTokenCache: { token: string; expiresAt: number } | null = null;
type PBRecord = Record<string, unknown>;
@@ -22,6 +26,11 @@ function uniqueStrings(values: Array<string | null | undefined>): string[] {
);
}
async function pbFetch(input: string, init: RequestInit = {}): Promise<Response> {
const signal = init.signal ?? AbortSignal.timeout(PB_FETCH_TIMEOUT);
return fetch(input, { ...init, signal });
}
async function listRecords(
collection: string,
filter: string,
@@ -35,7 +44,7 @@ async function listRecords(
url.searchParams.set("sort", options.sort);
}
const res = await fetch(url.toString(), {
const res = await pbFetch(url.toString(), {
headers: { Authorization: `Bearer ${adminToken}` },
cache: "no-store",
});
@@ -52,7 +61,7 @@ async function createRecord(
adminToken: string,
body: Record<string, unknown>
): Promise<void> {
await fetch(`${getPBBaseUrl()}/api/collections/${collection}/records`, {
await pbFetch(`${getPBBaseUrl()}/api/collections/${collection}/records`, {
method: "POST",
headers: {
"Content-Type": "application/json",
@@ -69,7 +78,7 @@ async function patchRecord(
adminToken: string,
body: Record<string, unknown>
): Promise<void> {
await fetch(
await pbFetch(
`${getPBBaseUrl()}/api/collections/${collection}/records/${recordId}`,
{
method: "PATCH",
@@ -88,7 +97,7 @@ async function deleteRecord(
recordId: string,
adminToken: string
): Promise<void> {
await fetch(
await pbFetch(
`${getPBBaseUrl()}/api/collections/${collection}/records/${recordId}`,
{
method: "DELETE",
@@ -103,7 +112,7 @@ async function getRecord(
recordId: string,
adminToken: string
): Promise<PBRecord | null> {
const res = await fetch(
const res = await pbFetch(
`${getPBBaseUrl()}/api/collections/${collection}/records/${recordId}`,
{
headers: { Authorization: `Bearer ${adminToken}` },
@@ -139,6 +148,10 @@ export async function getAdminToken(): Promise<string | null> {
return null;
}
if (adminTokenCache && adminTokenCache.expiresAt > Date.now()) {
return adminTokenCache.token;
}
const baseUrl = getPBBaseUrl();
const paths = [
"/api/admins/auth-with-password",
@@ -146,7 +159,7 @@ export async function getAdminToken(): Promise<string | null> {
];
for (const path of paths) {
const res = await fetch(`${baseUrl}${path}`, {
const res = await pbFetch(`${baseUrl}${path}`, {
method: "POST",
headers: { "Content-Type": "application/json" },
body: JSON.stringify({ identity: email, password }),
@@ -158,6 +171,10 @@ export async function getAdminToken(): Promise<string | null> {
const data = await res.json().catch(() => ({}));
if (typeof data?.token === "string" && data.token) {
adminTokenCache = {
token: data.token,
expiresAt: Date.now() + PB_ADMIN_TOKEN_TTL_MS,
};
return data.token;
}
}