import type { Metadata } from 'next'; import { desc, eq } from '@/lib/db'; import { db, apiKeys } from '@/lib/db'; import { requireUser } from '@/lib/auth/session'; import { revokeApiKeyAction } from '@/lib/auth/account-actions'; import { PageHeader, btnDanger } from '@/components/account/page-header'; import { Card, CardHeader, Badge, Table, th, td } from '@/components/ui/primitives'; import { fmtRelative } from '@/lib/format'; import { CreateKeyForm } from './create-key-form'; export const metadata: Metadata = { title: 'API keys', robots: { index: false } }; export default async function ApiKeysPage() { const u = await requireUser('/account/api-keys'); const keys = await db().select().from(apiKeys).where(eq(apiKeys.userId, u.id)).orderBy(desc(apiKeys.createdAt)); return ( <>
!k.revokedAt).length} active`} /> {keys.map((k) => ( ))} {keys.length === 0 ? ( ) : null}
Name Prefix Tier Limits Last used
{k.name} {k.prefix}… {k.tier} {k.rateLimitPerMinute}/min · {k.dailyQuota.toLocaleString()}/day {k.lastUsedAt ? fmtRelative(k.lastUsedAt) : 'never'} {k.revokedAt ? ( revoked ) : (
)}
No keys yet. Create one to query `/v1/assets/search`, `/v1/indices` and more.
); }