import { scopedRepoPermission, TOKEN_AREAS } from "../token-scope"; import type { TokenArea } from "../token-scope"; import { requireScopedRepo } from "./http"; import type { ApiContext } from "./http"; import type { Permission } from "~/lib/types"; export function getCredential(ctx: ApiContext): Response { const grant = ctx.credential.grant; if (grant?.kind === "fine") { return Response.json({ kind: "fine", token_id: grant.tokenId, all_repos: grant.allRepos, permissions: grant.permissions, }); } return Response.json({ kind: grant?.kind ?? "none", token_id: grant?.tokenId ?? null }); } /** The caller's effective permission per capability area, as enforced by every other repo endpoint. */ export async function getRepoPermissions(ctx: ApiContext, owner: string, name: string): Promise { const { repo } = await requireScopedRepo(ctx, owner, name, "contents", "none"); const entries = await Promise.all( TOKEN_AREAS.map(async (area: TokenArea): Promise<[TokenArea, Permission]> => [ area, await scopedRepoPermission(repo, ctx.credential, area), ]), ); return Response.json(Object.fromEntries(entries)); }