add invites, fix apiauth query, use luxon for date management, change readme

This commit is contained in:
creations 2025-03-03 18:31:26 -05:00
parent 9fcaac4dfb
commit 9a91f1e7e3
Signed by: creations
GPG key ID: 8F553AA4320FC711
10 changed files with 436 additions and 29 deletions

54
config/sql/invites.ts Normal file
View file

@ -0,0 +1,54 @@
import { logger } from "@helpers/logger";
import { type ReservedSQL, sql } from "bun";
export async function createTable(reservation?: ReservedSQL): Promise<void> {
let selfReservation: boolean = false;
if (!reservation) {
reservation = await sql.reserve();
selfReservation = true;
}
try {
await reservation`
CREATE TABLE IF NOT EXISTS invites (
id TEXT PRIMARY KEY NOT NULL UNIQUE,
created_by UUID NOT NULL REFERENCES users(id) ON DELETE CASCADE,
created_at TIMESTAMPTZ DEFAULT NOW() NOT NULL,
expiration TIMESTAMPTZ DEFAULT NULL,
uses INTEGER DEFAULT 0,
max_uses INTEGER DEFAULT 1,
role TEXT NOT NULL DEFAULT 'user'
);`;
} catch (error) {
logger.error(["Could not create the invites table:", error as Error]);
throw error;
} finally {
if (selfReservation) {
reservation.release();
}
}
}
export async function drop(
cascade: boolean,
reservation?: ReservedSQL,
): Promise<void> {
let selfReservation: boolean = false;
if (!reservation) {
reservation = await sql.reserve();
selfReservation = true;
}
try {
await reservation`DROP TABLE IF EXISTS invites ${cascade ? "CASCADE" : ""};`;
} catch (error) {
logger.error(["Could not drop the invites table:", error as Error]);
throw error;
} finally {
if (selfReservation) {
reservation.release();
}
}
}