feat: instance invites

This commit is contained in:
Zoe
2026-10-08 13:50:44 -05:00
parent f6e1bc1f47
commit fae05ebc4c
17 changed files with 3962 additions and 26 deletions
+11
View File
@@ -0,0 +1,11 @@
import { eq } from 'drizzle-orm';
import { invites } from '~~/drizzle/schema';
import { db } from '~~/server/lib/db';
export default defineEventHandler(async (event) => {
await protectAdminRoute(event);
await db.delete(invites).where(eq(invites.id, getRouterParam(event, 'id')!));
return { ok: true };
});
+21
View File
@@ -0,0 +1,21 @@
import { asc } from 'drizzle-orm';
import { invites } from '~~/drizzle/schema';
import { db } from '~~/server/lib/db';
export default defineEventHandler(async (event) => {
await protectAdminRoute(event);
await deleteDeadInvites();
return await db
.select({
id: invites.id,
token: invites.token,
maxUses: invites.maxUses,
uses: invites.uses,
expiresAt: invites.expiresAt,
createdAt: invites.createdAt,
})
.from(invites)
.orderBy(asc(invites.createdAt));
});
+28
View File
@@ -0,0 +1,28 @@
import { nanoid } from 'nanoid';
import { invites } from '~~/drizzle/schema';
import { db } from '~~/server/lib/db';
const TOKEN_LENGTH = 32;
/** Creates an invite link that lets one person register within a week. */
export default defineEventHandler(async (event) => {
await protectAdminRoute(event);
const [invite] = await db.insert(invites)
.values({
token: nanoid(TOKEN_LENGTH),
createdBy: event.context.user!.id as string,
maxUses: 1,
expiresAt: new Date(Date.now() + INVITE_LIFETIME_MS),
})
.returning({
id: invites.id,
token: invites.token,
maxUses: invites.maxUses,
uses: invites.uses,
expiresAt: invites.expiresAt,
createdAt: invites.createdAt,
});
return invite!;
});