import type { Pool, PoolClient } from "pg"; type CleanupArgs = { groupId?: number | null; userIds?: Array; emails?: Array; }; export function uniqueInviteCode(prefix = "T"): string { const raw = `${prefix}${Date.now().toString(36)}${Math.random().toString(36).slice(2)}`; const cleaned = raw.toUpperCase().replace(/[^A-Z0-9]/g, ""); if (cleaned.length >= 8) return cleaned.slice(0, 8); return cleaned.padEnd(8, "X"); } export async function cleanupTestData(client: PoolClient, args: CleanupArgs) { const groupId = args.groupId ?? null; const userIds = (args.userIds || []).filter((id): id is number => Boolean(id)); const emails = (args.emails || []).filter((email): email is string => Boolean(email)); const safeQuery = async (text: string, params: Array) => { try { await client.query(text, params); } catch (error) { if (typeof error === "object" && error && "code" in error && error.code === "42P01") return; throw error; } }; if (groupId) { await safeQuery( "delete from entry_tags where entry_id in (select id from entries where group_id=$1)", [groupId] ); await safeQuery("delete from bucket_tags where bucket_id in (select id from buckets where group_id=$1)", [groupId]); await safeQuery("delete from buckets where group_id=$1", [groupId]); await safeQuery("delete from entries where group_id=$1", [groupId]); await safeQuery("delete from tags where group_id=$1", [groupId]); await safeQuery("delete from group_audit_log where group_id=$1", [groupId]); await safeQuery("delete from group_invite_links where group_id=$1", [groupId]); await safeQuery("delete from group_join_requests where group_id=$1", [groupId]); await safeQuery("delete from group_settings where group_id=$1", [groupId]); await safeQuery("delete from group_members where group_id=$1", [groupId]); await safeQuery("delete from groups where id=$1", [groupId]); } for (const userId of userIds) { await safeQuery("delete from user_settings where user_id=$1", [userId]); await safeQuery("delete from sessions where user_id=$1", [userId]); await safeQuery("delete from users where id=$1", [userId]); } for (const email of emails) { await safeQuery("delete from sessions where user_id in (select id from users where email=$1)", [email]); await safeQuery("delete from users where email=$1", [email]); } } export async function cleanupTestDataFromPool(pool: Pool, args: CleanupArgs) { const client = await pool.connect(); try { await cleanupTestData(client, args); } finally { client.release(); } }