import { chunks, placeholders } from "./db"; import { replica } from "./db-replica"; import type { AccountRow } from "~/lib/types"; export type AccountRef = { id: string; name: string; displayName: string | null }; export async function accountsById(ids: Array): Promise> { const unique = [...new Set(ids.filter((id): id is string => id !== null))]; if (unique.length === 0) return new Map(); const rows = ( await Promise.all( chunks(unique).map((part) => replica.all>( `SELECT id, name, display_name FROM accounts WHERE id IN (${placeholders(part.length)})`, ...part, ), ), ) ).flat(); return new Map(rows.map((row) => [row.id, { id: row.id, name: row.name, displayName: row.display_name }])); } export const GHOST: AccountRef = { id: "ghost", name: "ghost", displayName: "Deleted user" }; /** Who automated timeline events (merge queue, MergeFix, sweeps) are shown as; they are recorded without an actor. */ export const SYSTEM_ACTOR: AccountRef = { id: "gitfor", name: "gitfor", displayName: "gitfor" }; export function accountOrGhost(map: Map, id: string | null): AccountRef { return (id ? map.get(id) : undefined) ?? GHOST; }