50 lines · 1.9 KB
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" })