diff --git a/src/lib/server/db/schema.ts b/src/lib/server/db/schema.ts index b24b06b..3244858 100644 --- a/src/lib/server/db/schema.ts +++ b/src/lib/server/db/schema.ts @@ -40,7 +40,8 @@ export const mappool = pgTable('mappool', { id: uuid('id').primaryKey().defaultRandom(), name: text('name').notNull(), createdBy: text('created_by'), - createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull() + createdAt: timestamp('created_at', { withTimezone: true }).defaultNow().notNull(), + verifiedAt: timestamp('verified_at', { withTimezone: true }) }); // ── Mappool Slots ─────────────────────────────────────────────────────── diff --git a/src/lib/server/match/engine.ts b/src/lib/server/match/engine.ts index f73be50..478f286 100644 --- a/src/lib/server/match/engine.ts +++ b/src/lib/server/match/engine.ts @@ -184,8 +184,9 @@ async function tryMatchFromQueue() { } async function selectMappoolForRating(avgElo: number) { - // Get all mappools with their slots + // Only use verified mappools const pools = await db.query.mappool.findMany({ + where: (m, { isNotNull }) => isNotNull(m.verifiedAt), with: { slots: true } }); diff --git a/src/routes/(app)/mappools/+page.svelte b/src/routes/(app)/mappools/+page.svelte index 7d17652..a1751df 100644 --- a/src/routes/(app)/mappools/+page.svelte +++ b/src/routes/(app)/mappools/+page.svelte @@ -60,7 +60,12 @@ class="group flex items-center justify-between rounded-lg border border-border bg-surface-800 p-4 transition-colors hover:border-accent/40 hover:bg-surface-700" >
-

{pool.name}

+
+

{pool.name}

+ {#if pool.verifiedAt} + ✓ Verified + {/if} +

{pool.slots.length} map{pool.slots.length !== 1 ? 's' : ''} {#if avgSr}· {avgSr}★{/if} diff --git a/src/routes/(app)/mappools/[id]/+page.server.ts b/src/routes/(app)/mappools/[id]/+page.server.ts index f47c578..615bad6 100644 --- a/src/routes/(app)/mappools/[id]/+page.server.ts +++ b/src/routes/(app)/mappools/[id]/+page.server.ts @@ -88,7 +88,8 @@ export const load: PageServerLoad = async ({ params, locals }) => { return { pool: { ...pool, slots: slotsWithBeatmaps }, - canEdit: isOwner || isAdmin + canEdit: isOwner || isAdmin, + isAdmin }; }; @@ -188,6 +189,30 @@ export const actions: Actions = { return { success: true }; }, + verify: async ({ params, locals }) => { + requireAuth(locals); + if (locals.user!.role !== 'admin') error(403, 'Admins only'); + + await db + .update(mappool) + .set({ verifiedAt: new Date() }) + .where(eq(mappool.id, params.id)); + + return { success: true }; + }, + + unverify: async ({ params, locals }) => { + requireAuth(locals); + if (locals.user!.role !== 'admin') error(403, 'Admins only'); + + await db + .update(mappool) + .set({ verifiedAt: null }) + .where(eq(mappool.id, params.id)); + + return { success: true }; + }, + deletePool: async ({ params, locals }) => { const pool = await db.query.mappool.findFirst({ where: eq(mappool.id, params.id) diff --git a/src/routes/(app)/mappools/[id]/+page.svelte b/src/routes/(app)/mappools/[id]/+page.svelte index 556e2ca..7004943 100644 --- a/src/routes/(app)/mappools/[id]/+page.svelte +++ b/src/routes/(app)/mappools/[id]/+page.svelte @@ -108,6 +108,11 @@ {:else}

{data.pool.name}

+ {#if data.pool.verifiedAt} + + ✓ Verified + + {/if} {#if data.canEdit}
- {#if data.canEdit} -
- -
- {/if} +
+ {#if data.isAdmin} + {#if data.pool.verifiedAt} +
+ +
+ {:else} +
+ +
+ {/if} + {/if} + {#if data.canEdit} +
+ +
+ {/if} +