39 lines · 1.7 KB
import { stmt } from "../db";

/**
 * Integrations and legacy webhooks are configured by a repository's admins, so they do not survive a change
 * of ownership: the new owner must knowingly re-enable them. Pull mirrors would otherwise keep writing refs as
 * the old admin and push mirrors would keep exporting the new owner's pushes to the old admin's GitHub repo.
 */
export function repoOwnershipChangeStatements(repoId: string, actorId: string | null): D1PreparedStatement[] {
  const now = Date.now();
  return [
    stmt(
      `INSERT INTO integration_audit (id, integration_id, actor_id, action, detail, created_at)
       SELECT lower(hex(randomblob(16))), id, ?, 'repo.transferred', ?, ? FROM integrations
       WHERE scope_type = 'repo' AND scope_id = ? AND active = 1`,
      actorId,
      JSON.stringify({ reason: "Repository transferred; integration disabled until the new owner re-enables it" }),
      now,
      repoId,
    ),
    stmt(
      `UPDATE integrations SET active = 0, updated_at = ?,
         config = json_remove(json_set(config, '$.githubMirror', 'none'), '$.githubRepo')
       WHERE scope_type = 'repo' AND scope_id = ?`,
      now,
      repoId,
    ),
    stmt("UPDATE webhooks SET active = 0 WHERE repo_id = ?", repoId),
  ];
}

/** Repo deletion removes everything the repo configured; cascades cover deliveries, jobs, audit and digest items. */
export function repoDeletionStatements(repoId: string): D1PreparedStatement[] {
  return [
    stmt("DELETE FROM integrations WHERE scope_type = 'repo' AND scope_id = ?", repoId),
    stmt("DELETE FROM webhook_deliveries WHERE webhook_id IN (SELECT id FROM webhooks WHERE repo_id = ?)", repoId),
    stmt("DELETE FROM webhooks WHERE repo_id = ?", repoId),
  ];
}