diff --git a/components/base/Avatar.vue b/components/base/Avatar.vue index 3765b48..762333e 100644 --- a/components/base/Avatar.vue +++ b/components/base/Avatar.vue @@ -3,9 +3,9 @@ loading = status === 'loading'"> - + - + {{ text }} diff --git a/components/base/HoverCard.vue b/components/base/HoverCard.vue index 0ad3819..30f5ce3 100644 --- a/components/base/HoverCard.vue +++ b/components/base/HoverCard.vue @@ -1,6 +1,6 @@ - + diff --git a/composables/useDatabase.ts b/composables/useDatabase.ts index dc96c97..af7fd46 100644 --- a/composables/useDatabase.ts +++ b/composables/useDatabase.ts @@ -1,13 +1,17 @@ import { Database } from "bun:sqlite"; -import { drizzle } from "drizzle-orm/bun-sqlite"; +import { BunSQLiteDatabase, drizzle } from "drizzle-orm/bun-sqlite"; import * as schema from '../db/schema'; +let instance: BunSQLiteDatabase; export default function useDatabase() { - const sqlite = new Database(useRuntimeConfig().database); - const db = drizzle({ client: sqlite, schema }); + if(!instance) + { + const sqlite = new Database(useRuntimeConfig().database); + instance = drizzle({ client: sqlite, schema }); - db.run("PRAGMA journal_mode = WAL;"); + instance.run("PRAGMA journal_mode = WAL;"); + } - return db; + return instance; } \ No newline at end of file diff --git a/db.sqlite-shm b/db.sqlite-shm index 73c3e9d..df4d197 100644 Binary files a/db.sqlite-shm and b/db.sqlite-shm differ diff --git a/db.sqlite-wal b/db.sqlite-wal index a3cbe1c..8502f26 100644 Binary files a/db.sqlite-wal and b/db.sqlite-wal differ diff --git a/layouts/default.vue b/layouts/default.vue index dfc2c8d..4d68008 100644 --- a/layouts/default.vue +++ b/layouts/default.vue @@ -12,8 +12,8 @@ - - + + @@ -31,8 +31,8 @@ - - + + @@ -56,4 +56,5 @@ import { Icon } from '@iconify/vue/dist/iconify.js'; const open = ref(true); +const { loggedIn } = useUserSession(); \ No newline at end of file diff --git a/middleware/auth.global.ts b/middleware/auth.global.ts new file mode 100644 index 0000000..b302d00 --- /dev/null +++ b/middleware/auth.global.ts @@ -0,0 +1,22 @@ +export default defineNuxtRouteMiddleware(async (to, from) => { + const { loggedIn, ready, fetch } = useUserSession(); + const meta = to.meta; + + if(!ready) + await fetch(); + + if(!!meta.guestsGoesTo && !loggedIn.value) + { + return navigateTo(meta.guestsGoesTo); + } + else if(meta.requireAuth && !loggedIn.value) + { + return abortNavigation(); + } + else if(!!meta.usersGoesTo && loggedIn.value) + { + return navigateTo(meta.usersGoesTo); + } + + return; +}); \ No newline at end of file diff --git a/package.json b/package.json index b7e0098..837dd7b 100644 --- a/package.json +++ b/package.json @@ -2,6 +2,10 @@ "name": "d-any", "private": true, "type": "module", + "scripts": { + "predev": "bun i && bunx nuxi cleanup", + "dev": "bunx --bun nuxi dev" + }, "dependencies": { "@iconify/vue": "^4.1.2", "@nuxtjs/color-mode": "^3.5.2", diff --git a/pages/user/login.vue b/pages/user/login.vue index 4f312e5..e3806e3 100644 --- a/pages/user/login.vue +++ b/pages/user/login.vue @@ -23,6 +23,7 @@ import { Icon } from '@iconify/vue/dist/iconify.js'; definePageMeta({ layout: 'login', + usersGoesTo: '/user/profile', }); const { add: addToast, clear: clearToasts } = useToast(); diff --git a/pages/user/profile.vue b/pages/user/profile.vue index af635d4..ad58f34 100644 --- a/pages/user/profile.vue +++ b/pages/user/profile.vue @@ -1,9 +1,28 @@ Mon profil + + + + + {{ user.username }} + {{ user.email }} + + Votre adresse mail n'as pas encore été validée. Renvoyez un mail + Tant que votre adresse mail n'as pas été validée, vous n'avez que des droits de lecture. + + + + + await clear()">Se deconnecter + + \ No newline at end of file diff --git a/pages/user/register.vue b/pages/user/register.vue index 1e48397..1204466 100644 --- a/pages/user/register.vue +++ b/pages/user/register.vue @@ -39,6 +39,7 @@ import { Icon } from '@iconify/vue/dist/iconify.js'; definePageMeta({ layout: 'login', + usersGoesTo: '/user/profile', }); const state = reactive({ diff --git a/server/api/auth/login.post.ts b/server/api/auth/login.post.ts index f85bbf1..4961a18 100644 --- a/server/api/auth/login.post.ts +++ b/server/api/auth/login.post.ts @@ -83,7 +83,7 @@ export default defineEventHandler(async (e): Promise => { return { success: false, error: new Error('Données utilisateur introuvable') }; } - const data = await logSession(e, await setUserSession(e, { + const data = logSession(e, await setUserSession(e, { user: { ...user.data, email: user.email, diff --git a/server/plugins/session.ts b/server/plugins/session.ts index 600ce9a..7ca88f2 100644 --- a/server/plugins/session.ts +++ b/server/plugins/session.ts @@ -1,6 +1,6 @@ import useDatabase from "~/composables/useDatabase"; -import { userSessionsTable as sessions } from "~/db/schema"; -import { eq, and } from "drizzle-orm"; +import { userSessionsTable } from "~/db/schema"; +import { eq, and, sql } from "drizzle-orm"; const monthAsMs = 60 * 60 * 24 * 30 * 1000; @@ -8,12 +8,7 @@ export default defineNitroPlugin(() => { const db = useDatabase(); sessionHooks.hook('fetch', async (session, event) => { - const result = await db.query.userSessionsTable.findFirst({ - columns: { - timestamp: true, - }, - where: and(eq(sessions.id, session.id as unknown as number), eq(sessions.user_id, session.user.id)) - }); + const result = db.select({ timestamp: userSessionsTable.timestamp }).from(userSessionsTable).where(and(eq(userSessionsTable.id, sql.placeholder('id')), eq(userSessionsTable.user_id, sql.placeholder('user_id')))).prepare().get({ id: session.id, user_id: session.user.id }); if(!result) { @@ -27,9 +22,9 @@ export default defineNitroPlugin(() => { } else { - await db.update(sessions).set({ + await db.update(userSessionsTable).set({ timestamp: new Date(), - }).where(and(eq(sessions.id, session.id as unknown as number), eq(sessions.user_id, session.user.id))); + }).where(and(eq(userSessionsTable.id, sql.placeholder('id')), eq(userSessionsTable.user_id, sql.placeholder('user_id')))).prepare().run({ id: session.id, user_id: session.user.id }); } }); sessionHooks.hook('clear', async (session, event) => { @@ -37,7 +32,7 @@ export default defineNitroPlugin(() => { { try { - await db.delete(sessions).where(and(eq(sessions.id, session.id as unknown as number), eq(sessions.user_id, session.user.id))); + db.delete(userSessionsTable).where(and(eq(userSessionsTable.id, sql.placeholder('id')), eq(userSessionsTable.user_id, sql.placeholder('user_id')))).prepare().run({ id: session.id, user_id: session.user.id }); } catch(e) { } } diff --git a/server/utils/user.ts b/server/utils/user.ts index 4dd9a4d..8d4ff01 100644 --- a/server/utils/user.ts +++ b/server/utils/user.ts @@ -29,6 +29,7 @@ export function logSession(e: H3Event, session: UserSession { const db = useDatabase(); - db.insert(userSessionsTable).values({ id: sql.placeholder('id'), user_id: sql.placeholder('user_id'), timestamp: sql.placeholder('timestamp') }).prepare().execute({ id: session.id, user_id: session.user.id, timestamp: new Date()}); + console.log("Logging session %s", session.id) + db.insert(userSessionsTable).values({ id: sql.placeholder('id'), user_id: sql.placeholder('user_id'), timestamp: sql.placeholder('timestamp') }).prepare().run({ id: session.id, user_id: session.user.id, timestamp: new Date() }); return session; } \ No newline at end of file