139 lines · 5.1 KB
import { env } from "cloudflare:workers";
import { decryptSecret, encryptSecret } from "../crypto";
import { all, first, run } from "../db";
import { badRequest } from "../errors";
import { DEFAULT_THRESHOLDS } from "./decide";
import type { Thresholds } from "./decide";
import { notifyMergeFixResult } from "../notify/mergefix";

export type RepoMergeFixSettings = { queueEnabled: boolean; allowPrivate: boolean; thresholds: Thresholds };

type SettingsRow = { queue_enabled: number; allow_private: number; min_confidence: number; min_margin: number };

export async function loadRepoSettings(repoId: string): Promise<RepoMergeFixSettings> {
  const row = await first<SettingsRow>("SELECT * FROM repo_mergefix_settings WHERE repo_id = ?", repoId);
  return {
    queueEnabled: row?.queue_enabled === 1,
    allowPrivate: row?.allow_private === 1,
    thresholds: row ? { confidence: row.min_confidence, margin: row.min_margin } : DEFAULT_THRESHOLDS,
  };
}

export async function saveRepoSettings(repoId: string, settings: RepoMergeFixSettings): Promise<void> {
  await run(
    `INSERT INTO repo_mergefix_settings (repo_id, queue_enabled, allow_private, min_confidence, min_margin, updated_at)
     VALUES (?, ?, ?, ?, ?, ?)
     ON CONFLICT (repo_id) DO UPDATE SET queue_enabled = excluded.queue_enabled, allow_private = excluded.allow_private,
       min_confidence = excluded.min_confidence, min_margin = excluded.min_margin, updated_at = excluded.updated_at`,
    repoId,
    settings.queueEnabled ? 1 : 0,
    settings.allowPrivate ? 1 : 0,
    settings.thresholds.confidence,
    settings.thresholds.margin,
    Date.now(),
  );
}

export type ByokKey = { provider: string; model: string; apiKey: string };
type KeyRow = { provider: string; model: string; key_ciphertext: string; key_iv: string; updated_at: number };

function secretsKey(): string {