diff --git a/drizzle/0001_old_bromley.sql b/drizzle/0001_old_bromley.sql new file mode 100644 index 0000000..37e6f17 --- /dev/null +++ b/drizzle/0001_old_bromley.sql @@ -0,0 +1,13 @@ +DO $$ BEGIN + CREATE TYPE "bookType" AS ENUM('shonen', 'seinen', 'manhua'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +DO $$ BEGIN + CREATE TYPE "roleEnum" AS ENUM('Member', 'Admin'); +EXCEPTION + WHEN duplicate_object THEN null; +END $$; +--> statement-breakpoint +ALTER TABLE "users" ADD COLUMN "role" "roleEnum" DEFAULT 'Member' NOT NULL; \ No newline at end of file diff --git a/drizzle/0002_far_xavin.sql b/drizzle/0002_far_xavin.sql new file mode 100644 index 0000000..cbb7462 --- /dev/null +++ b/drizzle/0002_far_xavin.sql @@ -0,0 +1,2 @@ +ALTER TABLE "users" ALTER COLUMN "id" SET DATA TYPE text;--> statement-breakpoint +ALTER TABLE "users" ALTER COLUMN "id" DROP DEFAULT; \ No newline at end of file diff --git a/drizzle/0003_sloppy_ironclad.sql b/drizzle/0003_sloppy_ironclad.sql new file mode 100644 index 0000000..a21d7ed --- /dev/null +++ b/drizzle/0003_sloppy_ironclad.sql @@ -0,0 +1 @@ +ALTER TABLE "reading_progress" ALTER COLUMN "user_id" SET DATA TYPE text; \ No newline at end of file diff --git a/drizzle/meta/0001_snapshot.json b/drizzle/meta/0001_snapshot.json new file mode 100644 index 0000000..acfae61 --- /dev/null +++ b/drizzle/meta/0001_snapshot.json @@ -0,0 +1,165 @@ +{ + "id": "94be70b1-469e-45d7-b78e-ce1cbe863401", + "prevId": "432591f9-af02-4d29-89ec-2c89c53477ff", + "version": "5", + "dialect": "pg", + "tables": { + "books": { + "name": "books", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "bookType", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "reading_progress": { + "name": "reading_progress", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "book_id": { + "name": "book_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "chapters_read": { + "name": "chapters_read", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "date_created": { + "name": "date_created", + "type": "date", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "reading_progress_user_id_users_id_fk": { + "name": "reading_progress_user_id_users_id_fk", + "tableFrom": "reading_progress", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "reading_progress_book_id_books_id_fk": { + "name": "reading_progress_book_id_books_id_fk", + "tableFrom": "reading_progress", + "tableTo": "books", + "columnsFrom": [ + "book_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "roleEnum", + "primaryKey": false, + "notNull": true, + "default": "'Member'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "bookType": { + "name": "bookType", + "values": { + "shonen": "shonen", + "seinen": "seinen", + "manhua": "manhua" + } + }, + "roleEnum": { + "name": "roleEnum", + "values": { + "Member": "Member", + "Admin": "Admin" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0002_snapshot.json b/drizzle/meta/0002_snapshot.json new file mode 100644 index 0000000..fd524ea --- /dev/null +++ b/drizzle/meta/0002_snapshot.json @@ -0,0 +1,164 @@ +{ + "id": "704381af-461b-4b62-b176-e887328a56d6", + "prevId": "94be70b1-469e-45d7-b78e-ce1cbe863401", + "version": "5", + "dialect": "pg", + "tables": { + "books": { + "name": "books", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "bookType", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "reading_progress": { + "name": "reading_progress", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "book_id": { + "name": "book_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "chapters_read": { + "name": "chapters_read", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "date_created": { + "name": "date_created", + "type": "date", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "reading_progress_user_id_users_id_fk": { + "name": "reading_progress_user_id_users_id_fk", + "tableFrom": "reading_progress", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "reading_progress_book_id_books_id_fk": { + "name": "reading_progress_book_id_books_id_fk", + "tableFrom": "reading_progress", + "tableTo": "books", + "columnsFrom": [ + "book_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "roleEnum", + "primaryKey": false, + "notNull": true, + "default": "'Member'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "bookType": { + "name": "bookType", + "values": { + "shonen": "shonen", + "seinen": "seinen", + "manhua": "manhua" + } + }, + "roleEnum": { + "name": "roleEnum", + "values": { + "Member": "Member", + "Admin": "Admin" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/0003_snapshot.json b/drizzle/meta/0003_snapshot.json new file mode 100644 index 0000000..70303d2 --- /dev/null +++ b/drizzle/meta/0003_snapshot.json @@ -0,0 +1,164 @@ +{ + "id": "2bef9e91-c268-4187-9a46-731b75855e99", + "prevId": "704381af-461b-4b62-b176-e887328a56d6", + "version": "5", + "dialect": "pg", + "tables": { + "books": { + "name": "books", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "type": { + "name": "type", + "type": "bookType", + "primaryKey": false, + "notNull": true + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "reading_progress": { + "name": "reading_progress", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "uuid", + "primaryKey": true, + "notNull": true, + "default": "gen_random_uuid()" + }, + "user_id": { + "name": "user_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "book_id": { + "name": "book_id", + "type": "uuid", + "primaryKey": false, + "notNull": true + }, + "chapters_read": { + "name": "chapters_read", + "type": "integer", + "primaryKey": false, + "notNull": true + }, + "date_created": { + "name": "date_created", + "type": "date", + "primaryKey": false, + "notNull": true, + "default": "now()" + } + }, + "indexes": {}, + "foreignKeys": { + "reading_progress_user_id_users_id_fk": { + "name": "reading_progress_user_id_users_id_fk", + "tableFrom": "reading_progress", + "tableTo": "users", + "columnsFrom": [ + "user_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + }, + "reading_progress_book_id_books_id_fk": { + "name": "reading_progress_book_id_books_id_fk", + "tableFrom": "reading_progress", + "tableTo": "books", + "columnsFrom": [ + "book_id" + ], + "columnsTo": [ + "id" + ], + "onDelete": "no action", + "onUpdate": "no action" + } + }, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + }, + "users": { + "name": "users", + "schema": "", + "columns": { + "id": { + "name": "id", + "type": "text", + "primaryKey": true, + "notNull": true + }, + "discord_id": { + "name": "discord_id", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "name": { + "name": "name", + "type": "text", + "primaryKey": false, + "notNull": true + }, + "role": { + "name": "role", + "type": "roleEnum", + "primaryKey": false, + "notNull": true, + "default": "'Member'" + } + }, + "indexes": {}, + "foreignKeys": {}, + "compositePrimaryKeys": {}, + "uniqueConstraints": {} + } + }, + "enums": { + "bookType": { + "name": "bookType", + "values": { + "shonen": "shonen", + "seinen": "seinen", + "manhua": "manhua" + } + }, + "roleEnum": { + "name": "roleEnum", + "values": { + "Member": "Member", + "Admin": "Admin" + } + } + }, + "schemas": {}, + "_meta": { + "columns": {}, + "schemas": {}, + "tables": {} + } +} \ No newline at end of file diff --git a/drizzle/meta/_journal.json b/drizzle/meta/_journal.json index d809ca5..0739f30 100644 --- a/drizzle/meta/_journal.json +++ b/drizzle/meta/_journal.json @@ -8,6 +8,27 @@ "when": 1711490394796, "tag": "0000_fixed_the_captain", "breakpoints": true + }, + { + "idx": 1, + "version": "5", + "when": 1711814267500, + "tag": "0001_old_bromley", + "breakpoints": true + }, + { + "idx": 2, + "version": "5", + "when": 1711828439946, + "tag": "0002_far_xavin", + "breakpoints": true + }, + { + "idx": 3, + "version": "5", + "when": 1711828480011, + "tag": "0003_sloppy_ironclad", + "breakpoints": true } ] } \ No newline at end of file diff --git a/src/app.d.ts b/src/app.d.ts index 743f07b..fea370d 100644 --- a/src/app.d.ts +++ b/src/app.d.ts @@ -3,7 +3,14 @@ declare global { namespace App { // interface Error {} - // interface Locals {} + interface Locals { + user: { + id: string, + name: string, + discordid: string, + role: Member | Admin + } + } // interface PageData {} // interface PageState {} // interface Platform {} diff --git a/src/lib/admin/dropdown.svelte b/src/lib/admin/dropdown.svelte new file mode 100644 index 0000000..c08c7e3 --- /dev/null +++ b/src/lib/admin/dropdown.svelte @@ -0,0 +1,55 @@ + + + { + select(e?.value || ""); + }} +> + + + + + + Roles + {#each options as option} + {option} + {/each} + + + + diff --git a/src/lib/admin/user-role-dropdown.svelte b/src/lib/admin/user-role-dropdown.svelte deleted file mode 100644 index e27b5bf..0000000 --- a/src/lib/admin/user-role-dropdown.svelte +++ /dev/null @@ -1,68 +0,0 @@ - - - - - - - - - - - Roles - {#each roles as role} - {role} - {/each} - - - - diff --git a/src/lib/auth/utils.js b/src/lib/auth/utils.js new file mode 100644 index 0000000..f3615ec --- /dev/null +++ b/src/lib/auth/utils.js @@ -0,0 +1,8 @@ +/** + * + * @param {import("@sveltejs/kit").RequestEvent} event + */ +export async function getRole(event) { + if(!event.locals.user) return -1; + return ["Member", "Admin"].indexOf(event.locals.user.role); +} \ No newline at end of file diff --git a/src/lib/components/user-nav.svelte b/src/lib/components/user-nav.svelte index b0185f3..59f2d80 100644 --- a/src/lib/components/user-nav.svelte +++ b/src/lib/components/user-nav.svelte @@ -17,14 +17,14 @@
-

@{user.username}

+

@{user.name}

diff --git a/src/lib/db/db.server.ts b/src/lib/db/db.server.ts index c517b52..35f9a75 100644 --- a/src/lib/db/db.server.ts +++ b/src/lib/db/db.server.ts @@ -1,10 +1,10 @@ import { pgTable, serial, text, varchar } from "drizzle-orm/pg-core"; import { drizzle } from "drizzle-orm/node-postgres"; -import { Client } from "pg"; +import pg from "pg"; import * as env from '$env/static/private'; // or -const client = new Client({ +const client = new pg.Client({ host: env.DB_HOST, user: env.DB_USER, password: env.DB_PASSWORD, diff --git a/src/lib/db/schema.server.ts b/src/lib/db/schema.server.ts index 54c2a4e..be5018b 100644 --- a/src/lib/db/schema.server.ts +++ b/src/lib/db/schema.server.ts @@ -2,11 +2,19 @@ import { date, integer, pgEnum, pgTable, serial, text, uuid, varchar } from 'dri import { drizzle } from 'drizzle-orm/node-postgres'; export const bookType = pgEnum('bookType', ['shonen', 'seinen', 'manhua']); +export const roleEnum = pgEnum('roleEnum', ['Member', 'Admin']); export const usersTable = pgTable('users', { - id: uuid('id').primaryKey().defaultRandom(), - discord_id: text('discord_id').notNull(), - name: text('name').notNull() + id: text('id').primaryKey().$defaultFn(() => { + var text = ""; + var possible = "abcdefghijklmnopqrstuvwxyz0123456789"; + for (var i = 0; i < 4; i++) + text += possible.charAt(Math.floor(Math.random() * possible.length)); + return text; + }), + discord_id: text('discord_id').notNull(), + name: text('name').notNull(), + role: roleEnum("role").default("Member").notNull() }); export const booksTable = pgTable('books', { @@ -17,7 +25,7 @@ export const booksTable = pgTable('books', { export const readingUpdatesTable = pgTable('reading_progress', { id: uuid('id').primaryKey().defaultRandom(), - user_id: uuid('user_id').references(() => usersTable.id).notNull(), + user_id: text('user_id').references(() => usersTable.id).notNull(), book_id: uuid('book_id').references(() => booksTable.id).notNull(), chapters_read: integer('chapters_read').notNull(), date_created: date('date_created').defaultNow().notNull() diff --git a/src/lib/state.js b/src/lib/state.js index 27d7136..3682a69 100644 --- a/src/lib/state.js +++ b/src/lib/state.js @@ -3,17 +3,7 @@ import { writable } from 'svelte/store' let stored = null; -if(browser && localStorage.auth) { - stored = JSON.parse(localStorage.auth); -} - /** * @type {import('svelte/store').Writable<{id: string, username: string} | null>} */ -export const userStore = writable(stored || null) - -userStore.subscribe((value) => { - if(browser) { - localStorage.auth = JSON.stringify(value) - } -}) \ No newline at end of file +export const userStore = writable(stored || null) \ No newline at end of file diff --git a/src/routes/(front)/+layout.svelte b/src/routes/(front)/+layout.svelte index 7ce191d..6f8d706 100644 --- a/src/routes/(front)/+layout.svelte +++ b/src/routes/(front)/+layout.svelte @@ -5,17 +5,37 @@ import { Label } from "$lib/components/ui/label"; import { Input } from "$lib/components/ui/input"; import { userStore } from "$lib/state"; + import {onMount} from "svelte"; + // const user = { // id: "helloworld", // username: "Jar Allerton", // }; let tokenInput = ""; + /** @type {string} */ + let authError = ""; + + onMount(async () => { + const me = await (await fetch("/api/me")).json(); - function logIn() { - userStore.set({ - id: tokenInput, - username: "joe" - }) + if(me.success) { + userStore.set(me.user); + } + }); + + async function logIn() { + let result = await fetch("/api/login", { + method: "POST", + body: JSON.stringify({ + token: tokenInput + }) + }); + + let parsed = await result.json(); + if(!parsed.success) return authError = "Invalid token"; + + userStore.set(parsed.user); + return; } @@ -35,6 +55,7 @@
+

{authError}

diff --git a/src/routes/(front)/api/login/+server.js b/src/routes/(front)/api/login/+server.js new file mode 100644 index 0000000..2e3b3d2 --- /dev/null +++ b/src/routes/(front)/api/login/+server.js @@ -0,0 +1,19 @@ +import db from '$lib/db/db.server'; +import { usersTable } from '$lib/db/schema.server'; +import { json } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; + +/** @type {import('./$types').RequestHandler} */ +export async function POST(event) { + let data = await event.request.json(); + if(!data.token) return json({success: false}); + + let [user] = await db.select().from(usersTable).where(eq(usersTable.id, data.token)); + if(!user) return json({success:false}); + + event.cookies.set("token", user.id, { + path: "/" + }); + + return json({ success: true, user }); +} \ No newline at end of file diff --git a/src/routes/(front)/api/me/+server.js b/src/routes/(front)/api/me/+server.js new file mode 100644 index 0000000..d121218 --- /dev/null +++ b/src/routes/(front)/api/me/+server.js @@ -0,0 +1,15 @@ +import db from '$lib/db/db.server'; +import { usersTable } from '$lib/db/schema.server'; +import { json } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; + +/** @type {import('./$types').RequestHandler} */ +export async function GET(event) { + let token = event.cookies.get("token"); + if(!token) return json({success: false}); + + let [user] = await db.select().from(usersTable).where(eq(usersTable.id, token)); + if(!user) return json({success:false}); + + return json({ success: true, user }); +} \ No newline at end of file diff --git a/src/routes/admin/api/users/+server.js b/src/routes/admin/api/users/+server.js new file mode 100644 index 0000000..52f26d1 --- /dev/null +++ b/src/routes/admin/api/users/+server.js @@ -0,0 +1,27 @@ +import { json } from '@sveltejs/kit'; +import db from '$lib/db/db.server'; +import { usersTable } from '$lib/db/schema.server'; +import { eq } from 'drizzle-orm'; +import { getRole } from '$lib/auth/utils'; + +/** @type {import('./$types').RequestHandler} */ +export async function GET(event) { + console.log(getRole(event)) + const users = await db.select().from(usersTable); + + return json({ success: true, users }); +} + +/** @type {import('./$types').RequestHandler} */ +export async function PUT({ request }) { + const body = await request.json(); + if (!body.role || !body.id) return new Response(null, { + status: 400 + }); + + db.update(usersTable).set({ + role: body.role + }).where(eq(usersTable.id, body.id)); + + return json({success: true}); +} \ No newline at end of file diff --git a/src/routes/admin/books/+page.server.ts b/src/routes/admin/books/+page.server.ts new file mode 100644 index 0000000..81a599e --- /dev/null +++ b/src/routes/admin/books/+page.server.ts @@ -0,0 +1,61 @@ +import db from "$lib/db/db.server"; +import { booksTable, usersTable } from "$lib/db/schema.server"; +import { json, type Actions, type ServerLoadEvent } from "@sveltejs/kit"; +import type { PageServerLoad } from "./$types"; +import { eq } from "drizzle-orm"; + + +export const load: PageServerLoad = async () => { + const books = await db.select().from(booksTable); + + return { books }; +} + +export const actions: Actions = { + create: async (event) => { + // console.log("hello"); + const data = await event.request.formData(); + if(!data.has("name") || !data.has("userRole")) return json({ + success: false, + message: "Missing property" + }); + + await db.insert(booksTable).values({ + name: data.get("name")?.valueOf(), + type: data.get("type")?.valueOf() + }); + + return json({ + success: true + }) + }, + updateType: async (event) => { + const data = await event.request.json(); + + if(!data.id || !data.type) return { + success: false, + message: "Missing property" + }; + + await db.update(booksTable).set({ + type: data.type + }).where(eq(booksTable.id, data.id)); + + return { + success: true + } + }, + delete: async (event) => { + const data = await event.request.json(); + + if(!data.id) return json({ + success: false + }); + + await db.delete(booksTable).where(eq(data.id, booksTable.id)); + + return { + success: true + } + } +}; \ No newline at end of file diff --git a/src/routes/admin/books/+page.svelte b/src/routes/admin/books/+page.svelte new file mode 100644 index 0000000..3b9b365 --- /dev/null +++ b/src/routes/admin/books/+page.svelte @@ -0,0 +1,81 @@ + + + diff --git a/src/routes/admin/users/+page.server.ts b/src/routes/admin/users/+page.server.ts index e434970..18ee352 100644 --- a/src/routes/admin/users/+page.server.ts +++ b/src/routes/admin/users/+page.server.ts @@ -1,7 +1,53 @@ -import type { Actions } from "@sveltejs/kit"; +import db from "$lib/db/db.server"; +import { usersTable } from "$lib/db/schema.server"; +import { json, type Actions, type ServerLoadEvent } from "@sveltejs/kit"; +import type { PageServerLoad } from "./$types"; +import { eq } from "drizzle-orm"; + +export const load: PageServerLoad = async () => { + const users = await db.select().from(usersTable); + + return { users }; +} export const actions: Actions = { - default: async (event) => { - console.log(event.request.body); + create: async (event) => { + // console.log("hello"); + const data = await event.request.formData(); + if(!data.has("name") || !data.has("userRole")) return json({ + success: false, + message: "Missing property" + }); + + await db.insert(usersTable).values({ + name: data.get("name")?.valueOf(), + role: data.get("userRole")?.valueOf(), + discord_id: data.get("discordid")?.valueOf() + }); }, + updateRole: async (event) => { + const data = await event.request.json(); + + if(!data.user_id || !data.role) return json({ + success: false, + message: "Missing property" + }); + + db.update(usersTable).set({ + role: data.role + }).where(eq(usersTable.id, data.user_id)); + }, + delete: async (event) => { + const data = await event.request.json(); + + if(!data.id) return json({ + success: false + }); + + await db.delete(usersTable).where(eq(data.id, usersTable.id)); + + return { + success: true + } + } }; \ No newline at end of file diff --git a/src/routes/admin/users/+page.svelte b/src/routes/admin/users/+page.svelte index 6cca760..a72e98f 100644 --- a/src/routes/admin/users/+page.svelte +++ b/src/routes/admin/users/+page.svelte @@ -2,22 +2,17 @@ import { Button } from "$lib/components/ui/button/index.js"; import Nav from "$lib/admin/nav.svelte"; import * as Avatar from "$lib/components/ui/avatar"; - import UserRoleDropdown from "$lib/admin/user-role-dropdown.svelte"; + import Dropdown from "$lib/admin/dropdown.svelte"; import * as Dialog from "$lib/components/ui/dialog"; import { Label } from "$lib/components/ui/label"; import {Input} from "$lib/components/ui/input"; + import {X} from "lucide-svelte"; + import { onMount } from "svelte"; + import type { PageServerLoad } from "./$types"; + import type { PageServerData } from "./$types"; - const users: { username: string; role: "Member" | "Admin"; }[] = [ - { - username: "Joe Biden", - role: "Member", - }, - { - username: "BoeJiden", - role: "Admin", - }, - ]; - + export let data: PageServerData; + let users = data.users;
{/each}
diff --git a/src/routes/hooks.server.ts b/src/routes/hooks.server.ts new file mode 100644 index 0000000..df415fe --- /dev/null +++ b/src/routes/hooks.server.ts @@ -0,0 +1,11 @@ +import db from '$lib/db/db.server'; +import { usersTable } from '$lib/db/schema.server'; +import type { Handle } from '@sveltejs/kit'; +import { eq } from 'drizzle-orm'; + +export const handle: Handle = async ({ event, resolve }) => { + let session = event.cookies.get("token"); + if(session) event.locals.user = await db.select().from(usersTable).where(eq(usersTable.id, session)); + const response = await resolve(event); + return response; +}; \ No newline at end of file