s''
This commit is contained in:
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user