59 lines · 2.0 KB
import { accountDb } from "../scoped-db";
import { revokeAccessTokens } from "../access-token-store";
import { notFoundError } from "../errors";
import { lfsUsage } from "../lfs/quota";
import { limitAccountWrite } from "../limits";
import { parseTokenPermissions } from "../token-scope";
import { noContent, requireAccountScope } from "./http";
import type { ApiContext } from "./http";

export function getUser(ctx: ApiContext): Response {
  return Response.json({ login: ctx.viewer.name, id: ctx.viewer.id, name: ctx.viewer.displayName ?? ctx.viewer.name });
}

export async function getLfsUsage(ctx: ApiContext): Promise<Response> {
  requireAccountScope(ctx);
  const usage = await lfsUsage(ctx.viewer.id);
  return Response.json({ bytes: usage.storageBytes });
}

type TokenRow = {
  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;
};

export async function listTokens(ctx: ApiContext): Promise<Response> {
  requireAccountScope(ctx);
  const rows = await accountDb(ctx.viewer.id).all<TokenRow>(
    `SELECT id, name, token_prefix, permissions, all_repos, last_used_at, expires_at, created_at
     FROM access_tokens WHERE user_id = ? ORDER BY created_at DESC`,
    ctx.viewer.id,
  );
  return Response.json(
    rows.map((row) => ({
      id: row.id,