SPB Git forge

spb/countryatlas

Public
20commits 1branches 0releases
268.3 MBsize
maindefault branch
12 days agolast push
TypeScript 57% Python 38.6% JavaScript 3.6% CSS 0.6%
2.1 KB · 62 lines typescript
Raw Blame History
1'use server';2import { revalidatePath } from 'next/cache';3import { cookies } from 'next/headers';4import { redirect } from 'next/navigation';5import { ADMIN_COOKIE, ADMIN_COOKIE_MAX_AGE, adminToken, cookieValueFor, isAdminAuthed, verifyToken } from '@/lib/admin-auth';6import { adminApi, adminErrorMessage } from '@/lib/admin-api';7import { routes } from '@/lib/site';89const secure = process.env.NODE_ENV === 'production' && (process.env.NEXT_PUBLIC_SITE_URL ?? '').startsWith('https://');1011export async function loginAction(formData: FormData): Promise<void> {12  const input = String(formData.get('token') ?? '');13  const next = String(formData.get('next') ?? routes.admin());14  const token = adminToken();15  if (!token || !verifyToken(input)) redirect(`${routes.adminLogin()}?error=1`);16  const store = await cookies();17  store.set(ADMIN_COOKIE, cookieValueFor(token!), { httpOnly: true, sameSite: 'lax', secure, path: '/admin', maxAge: ADMIN_COOKIE_MAX_AGE });18  redirect(next.startsWith('/admin') ? next : routes.admin());19}2021export async function logoutAction(): Promise<void> {22  const store = await cookies();23  store.delete(ADMIN_COOKIE);24  redirect(routes.adminLogin());25}2627async function guard(): Promise<void> {28  if (!(await isAdminAuthed())) redirect(routes.adminLogin());29}3031export async function refreshAction(): Promise<void> {32  await guard();33  let msg: string;34  let ok = true;35  try {36    const r = await adminApi.refresh();37    msg = `${r.signal} → pid ${r.pid} at ${r.sent_at}`;38  } catch (e) {39    ok = false;40    msg = adminErrorMessage(e);41  }42  revalidatePath(routes.admin());43  redirect(`${routes.admin()}?${ok ? 'ok' : 'err'}=${encodeURIComponent(msg)}`);44}4546export async function clearCacheAction(): Promise<void> {47  await guard();48  let msg: string;49  let ok = true;50  try {51    const r = await adminApi.clearCache();52    msg = `cache cleared (${Object.entries(r.before)53      .map(([k, v]) => `${k}=${v}`)54      .join(', ')})`;55  } catch (e) {56    ok = false;57    msg = adminErrorMessage(e);58  }59  revalidatePath(routes.admin());60  redirect(`${routes.admin()}?${ok ? 'ok' : 'err'}=${encodeURIComponent(msg)}`);61}62