68 lines
2.8 KiB
TypeScript
68 lines
2.8 KiB
TypeScript
import type { Pool, PoolClient } from "pg";
|
|
|
|
type CleanupArgs = {
|
|
groupId?: number | null;
|
|
userIds?: Array<number | null | undefined>;
|
|
emails?: Array<string | null | undefined>;
|
|
};
|
|
|
|
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<unknown>) => {
|
|
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();
|
|
}
|
|
}
|
|
|