HTML 77.2%
TypeScript 10.5%
Python 9.6%
JavaScript 2.5%
1import type { Metadata } from 'next';2import { ActionButton, AdminTitle, Notice } from '@/components/admin/ui';3import { flushCacheAction, recomputeQualityAction, recomputeStatsAction } from '@/lib/admin/actions';4import { requireAdmin } from '@/lib/admin/admin-api';56export const metadata: Metadata = { title: 'Cache & maintenance', robots: { index: false, follow: false } };7export const dynamic = 'force-dynamic';89export default async function AdminCachePage({ searchParams }: { searchParams: Promise<Record<string, string | undefined>> }) {10 await requireAdmin();11 const sp = await searchParams;12 return (13 <>14 <AdminTitle title="Cache & maintenance" lede="Public API responses are cached in Redis (aia:api:*, 60–600 s). Flushing forces every public page to recompute on its next request." />15 <Notice notice={sp.notice} level={sp.level} />16 <ul className="divide-y divide-rule border-y border-rule">17 <li className="flex flex-col gap-2 py-3 md:flex-row md:items-center md:justify-between">18 <div>19 <p className="text-sm font-medium text-ink">Flush API cache</p>20 <p className="text-xs text-ink-3">POST /admin/cache/flush — deletes every aia:api:* key. Safe; the next requests repopulate it.</p>21 </div>22 <form action={flushCacheAction}>23 <ActionButton tone="accent">Flush</ActionButton>24 </form>25 </li>26 <li className="flex flex-col gap-2 py-3 md:flex-row md:items-center md:justify-between">27 <div>28 <p className="text-sm font-medium text-ink">Recompute stats</p>29 <p className="text-xs text-ink-3">POST /admin/stats/recompute — refreshes the daily stats history row for today.</p>30 </div>31 <form action={recomputeStatsAction}>32 <ActionButton>Recompute stats</ActionButton>33 </form>34 </li>35 <li className="flex flex-col gap-2 py-3 md:flex-row md:items-center md:justify-between">36 <div>37 <p className="text-sm font-medium text-ink">Recompute quality scores</p>38 <p className="text-xs text-ink-3">POST /admin/quality/recompute — recomputes completeness, primary-source ratio, freshness and conflicts for every entity. May take a while on a large database.</p>39 </div>40 <form action={recomputeQualityAction}>41 <ActionButton>Recompute quality</ActionButton>42 </form>43 </li>44 </ul>45 </>46 );47}48