import useDatabase from "~/composables/useDatabase"; import { userSessionsTable as sessions } from "~/db/schema"; import { eq, and } from "drizzle-orm"; const monthAsMs = 60 * 60 * 24 * 30 * 1000; 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)) }); if(!result) { await clearUserSession(event); throw createError({ statusCode: 401, message: 'Unauthorized' }); } else if(result && result.timestamp && result.timestamp.getTime() < Date.now() - monthAsMs) { await clearUserSession(event); throw createError({ statusCode: 401, message: 'Session has expired' }); } else { await db.update(sessions).set({ timestamp: new Date(), }).where(and(eq(sessions.id, session.id as unknown as number), eq(sessions.user_id, session.user.id))); } }); sessionHooks.hook('clear', async (session, event) => { if(session.id && session.user) { try { await db.delete(sessions).where(and(eq(sessions.id, session.id as unknown as number), eq(sessions.user_id, session.user.id))); } catch(e) { } } }); });