spb/countryatlas
Public
TypeScript 57%
Python 38.6%
JavaScript 3.6%
CSS 0.6%
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