diff --git a/src/app.css b/src/app.css index adb6e14..523c3a8 100644 --- a/src/app.css +++ b/src/app.css @@ -233,7 +233,7 @@ &:disabled, &.disabled { - @apply cursor-not-allowed opacity-80 hover:outline-0; + @apply cursor-not-allowed opacity-70 hover:outline-0; } &.red { @@ -257,6 +257,10 @@ @apply border-3 border-primary-700 bg-primary-900 fill-primary-50 p-2 text-sm ring-primary-900 placeholder:text-primary-700 active:ring-3; } + .themed-input-on-box { + @apply bg-primary-900 border-3 border-primary-800 ring-primary-700 focus:ring-2 transition-shadow rounded-lg placeholder:text-primary-700; + } + .checkbox { @apply border-2 border-primary-600 bg-primary-900 ring-0 h-4 w-4 rounded-sm; } diff --git a/src/routes/auth/callback/+server.ts b/src/routes/auth/callback/+server.ts index bbc2013..3ddc9cc 100644 --- a/src/routes/auth/callback/+server.ts +++ b/src/routes/auth/callback/+server.ts @@ -165,6 +165,11 @@ export async function GET(event) { return redirect(302, 'https://fraud.land'); } + const isSuperAdmin = + env.SUPER_ADMIN_SLACK_ID != undefined && + env.SUPER_ADMIN_SLACK_ID.length > 0 && + slack_id === env.SUPER_ADMIN_SLACK_ID; + if (databaseUser) { // Update user (update name and profile picture and lastLoginAt on login) await db @@ -173,12 +178,11 @@ export async function GET(event) { name: username, profilePicture: profilePic, lastLoginAt: new Date(Date.now()), - hackatimeTrust + hackatimeTrust, + hasAdmin: isSuperAdmin ? true : undefined }) .where(eq(user.idvId, id)); } else { - const isSuperAdmin = slack_id === env.SUPER_ADMIN_SLACK_ID; - // Create user await db.insert(user).values({ idvId: id, diff --git a/src/routes/dashboard/Sidebar.svelte b/src/routes/dashboard/Sidebar.svelte index 0272aa0..a2f5bf2 100644 --- a/src/routes/dashboard/Sidebar.svelte +++ b/src/routes/dashboard/Sidebar.svelte @@ -60,7 +60,7 @@

{user.name}

-

{user.clay} clay · {user.brick} brick

+

{Math.floor(user.clay)} clay · {Math.floor(user.brick)} brick

Log out diff --git a/src/routes/dashboard/admin/admin/+page.svelte b/src/routes/dashboard/admin/admin/+page.svelte index 9610955..8a9cf17 100644 --- a/src/routes/dashboard/admin/admin/+page.svelte +++ b/src/routes/dashboard/admin/admin/+page.svelte @@ -1,5 +1,6 @@ @@ -9,5 +10,15 @@

Admin

- Users +
+ +
+ +
+

Users

+
+
diff --git a/src/routes/dashboard/admin/admin/users/+page.svelte b/src/routes/dashboard/admin/admin/users/+page.svelte index c533364..05648ec 100644 --- a/src/routes/dashboard/admin/admin/users/+page.svelte +++ b/src/routes/dashboard/admin/admin/users/+page.svelte @@ -9,12 +9,10 @@ let userSearch = $state(''); - let users = $derived(data.users); //form?.users ?? + let users = $derived(data.users); //form?.users ?? let filteredProjects = $derived( - data.users.filter((user) => - user.name?.toLowerCase().includes(userSearch.toLowerCase()) - ) + data.users.filter((user) => user.name?.toLowerCase().includes(userSearch.toLowerCase())) ); let filteredUsers = $derived( data.users.filter((user) => user.name.toLowerCase().includes(userSearch.toLowerCase())) @@ -28,92 +26,6 @@

Users

- - {#if users.length == 0}
@@ -135,44 +47,29 @@

{user.name}

- + + {user.slackId} + +

Hackatime: {user.hackatimeTrust}

+

Trust: {user.trust}

+

{user.clay} clay, {user.brick} brick, {user.shopScore} market

{/each}
diff --git a/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts b/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts index 0eb9c1b..048c8a4 100644 --- a/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts +++ b/src/routes/dashboard/admin/admin/users/[id]/+page.server.ts @@ -1,7 +1,7 @@ import { db } from '$lib/server/db/index.js'; import { user, devlog, session } from '$lib/server/db/schema.js'; -import { error } from '@sveltejs/kit'; -import { eq, sql } from 'drizzle-orm'; +import { error, fail } from '@sveltejs/kit'; +import { and, eq, sql } from 'drizzle-orm'; import type { Actions } from './$types'; export async function load({ locals, params }) { @@ -20,7 +20,7 @@ export async function load({ locals, params }) { devlogCount: sql`COALESCE(COUNT(${devlog.id}), 0)` }) .from(user) - .leftJoin(devlog, eq(devlog.userId, user.id)) + .leftJoin(devlog, and(eq(devlog.userId, user.id), eq(devlog.deleted, false))) .where(eq(user.id, id)) .groupBy(user.id)) ?? [{ devlogCount: 0 }]; @@ -51,8 +51,6 @@ export const actions = { const hasAdmin = data.get('has_admin'); const hasProjectAuditLogs = data.get('has_project_audit_logs'); - // TODO: add check to disable un-admining superadmin - await db .update(user) .set({ @@ -74,6 +72,57 @@ export const actions = { }; }, + currency: async ({ locals, request, params }) => { + if (!locals.user) { + throw error(500); + } + if (!locals.user.hasAdmin) { + throw error(403, { message: 'get out, peasant' }); + } + + const id: number = parseInt(params.id); + + const data = await request.formData(); + const clay = data.get('clay'); + const brick = data.get('brick'); + const shopScore = data.get('market_score'); + + if ( + !clay || + isNaN(parseFloat(clay.toString())) || + !brick || + isNaN(parseFloat(brick.toString())) || + !shopScore || + isNaN(parseFloat(shopScore.toString())) + ) { + return fail(400, { + currency: { + fields: { clay, brick, shopScore }, + invalidFields: true + } + }); + } + + await db + .update(user) + .set({ + clay: parseFloat(clay.toString()), + brick: parseFloat(brick.toString()), + shopScore: parseFloat(shopScore.toString()) + }) + .where(eq(user.id, id)); + + const [queriedUser] = await db.select().from(user).where(eq(user.id, id)); + + if (!queriedUser) { + throw error(404, { message: 'user not found' }); + } + + return { + queriedUser + }; + }, + refreshHackatime: async ({ locals, params }) => { if (!locals.user) { throw error(500); diff --git a/src/routes/dashboard/admin/admin/users/[id]/+page.svelte b/src/routes/dashboard/admin/admin/users/[id]/+page.svelte index 3a2e1f7..f58af57 100644 --- a/src/routes/dashboard/admin/admin/users/[id]/+page.svelte +++ b/src/routes/dashboard/admin/admin/users/[id]/+page.svelte @@ -9,6 +9,7 @@ let user = $derived(form?.queriedUser ?? data.queriedUser); let hackatimePending = $state(false); + let currencyPending = $state(false); let privilegesPending = $state(false); let logoutPending = $state(false); @@ -29,6 +30,8 @@
+ Public profile page +
+

Currency stuff

+
+ { + currencyPending = true; + return async ({ update }) => { + await update({ reset: false }); + currencyPending = false; + }; + }} + > +
+ + + +
+ {#if form?.currency?.invalidFields} +

Invalid fields

+ {/if} + + +
+

Privileges

`COALESCE(SUM(${devlog.timeSpent}), 0)`, devlogCount: sql`COALESCE(COUNT(${devlog.id}), 0)` }) @@ -80,16 +77,20 @@ export const actions = { or(eq(project.status, 'building'), eq(project.status, 'rejected')) ) ) - .groupBy(project.id) + .groupBy(project.id, project.description, project.url) .limit(1); if (!queriedProject) { return error(404, { message: 'project not found' }); } - // Make sure it has actual devlogs before shipping - if (queriedProject.devlogCount == 0) { - return error(400, { message: 'project has no devlogs' }); + // Make sure it has atleast 2h + if (queriedProject.timeSpent < 120) { + return error(400, { message: 'minimum 2h needed to ship' }); + } + + if (queriedProject.description == '' || queriedProject.url == '') { + return error(400, { message: 'project must have a description and Printables url' }); } await db diff --git a/src/routes/dashboard/projects/[id]/ship/+page.svelte b/src/routes/dashboard/projects/[id]/ship/+page.svelte index 38f5cae..57d4152 100644 --- a/src/routes/dashboard/projects/[id]/ship/+page.svelte +++ b/src/routes/dashboard/projects/[id]/ship/+page.svelte @@ -24,8 +24,14 @@ clickable={false} />

- Are you sure you want to ship "{data.project.name}"? You won't be able to edit it or journal again - unless it gets rejected. + {#if data.project.timeSpent < 120} + You need at least 2h to ship + {:else if data.project.description == '' || data.project.url == ''} + Project must have a description and Printables URL to ship + {:else} + Are you sure you want to ship "{data.project.name}"? You won't be able to edit it or journal + again unless it gets rejected. + {/if}

Cancel -