obsidian-visualiser/server/plugins/session.ts

45 lines
1.5 KiB
TypeScript

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) { }
}
});
});