import { createServerFn } from "@tanstack/react-start";
import { z } from "zod";
import { requireViewer, viewerMiddleware } from "./middleware";
import { all, chunks, placeholders } from "~/server/db";
import { accountDb, repoDb } from "~/server/scoped-db";
import { CAPS, limitWrite, limitAccountWrite } from "~/server/limits";
import { assertNotArchived, requireRepoAccess } from "~/server/repos";
import { parseTokenPermissions, TOKEN_AREAS } from "~/server/token-scope";
import {
createDeployToken as mintDeployToken,
createFineGrainedToken as mintFineGrainedToken,
revokeDeployToken as removeDeployToken,
} from "~/server/token-write";
import { confirmPassword } from "~/server/account-security";
import { repoRef } from "~/lib/validation";
const areaAccess = z.enum(["read", "write"]).optional();
const permissionsInput = z.object(Object.fromEntries(TOKEN_AREAS.map((area) => [area, areaAccess])));
const expiresInDays = z.number().int().min(0).max(366);
export const listTokenGrants = createServerFn({ method: "GET" })
.middleware([viewerMiddleware])
.handler(async ({ context }) => {
const viewer = requireViewer(context.viewer);
const db = accountDb(viewer.id);
const tokens = await db.all<{
id: string;
name: string;
token_prefix: string;
permissions: string | null;
all_repos: number;
last_used_at: number | null;
expires_at: number | null;
created_at: number;
parent_token_id: string | null;
}>(
`SELECT id, name, token_prefix, permissions, all_repos, last_used_at, expires_at, created_at, parent_token_id
FROM access_tokens WHERE user_id = ? ORDER BY created_at DESC`,
viewer.id,
);