45 lines
1.5 KiB
TypeScript
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) { }
|
|
}
|
|
});
|
|
}); |