import { createServerFn } from "@tanstack/react-start"; import { z } from "zod"; import { requireViewer, viewerMiddleware } from "./middleware"; import { repoDb } from "~/server/scoped-db"; import { limitBrowse, limitWrite } from "~/server/limits"; import { requireRepoAccess } from "~/server/repos"; import { countLocks, deleteLock, listLocks, MAX_LOCK_PAGE } from "~/server/lfs/locks"; import { lfsUsage } from "~/server/lfs/quota"; import { repoRef } from "~/lib/validation"; export const getLfsSettings = createServerFn({ method: "GET" }) .middleware([viewerMiddleware]) .validator(repoRef) .handler(async ({ data, context }) => { await limitBrowse(context.viewer); const { repo } = await requireRepoAccess(data.owner, data.repo, context.viewer, "admin"); const [usage, objects, locks, lockCount] = await Promise.all([ lfsUsage(repo.owner_id), repoDb(repo.id).first<{ count: number; bytes: number | null }>( "SELECT COUNT(*) AS count, SUM(size) AS bytes FROM lfs_objects WHERE repo_id = ?", repo.id, ), listLocks(repo.id, { limit: MAX_LOCK_PAGE }), countLocks(repo.id), ]); return { usage, objectCount: objects?.count ?? 0, objectBytes: objects?.bytes ?? 0, lockCount, locks: locks.rows.map((row) => ({ id: row.id, path: row.path, owner: row.owner_name, createdAt: row.created_at, })), }; }); export const forceUnlockLfs = createServerFn({ method: "POST" }) .middleware([viewerMiddleware]) .validator(repoRef.extend({ id: z.string().max(64) })) .handler(async ({ data, context }) => { const viewer = requireViewer(context.viewer); await limitWrite(viewer); const { repo } = await requireRepoAccess(data.owner, data.repo, viewer, "admin"); await deleteLock(repo.id, data.id, viewer.id, { force: true, isAdmin: true }); return { ok: true }; });