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" })