147 lines · 5.7 KB
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,
    );