40 lines
1.7 KiB
TypeScript
40 lines
1.7 KiB
TypeScript
import useDatabase from "~/composables/useDatabase";
|
|
import { userSessionsTable } from "~/db/schema";
|
|
import { eq, and, sql } from "drizzle-orm";
|
|
|
|
const monthAsMs = 60 * 60 * 24 * 30 * 1000;
|
|
|
|
export default defineNitroPlugin(() => {
|
|
const db = useDatabase();
|
|
|
|
sessionHooks.hook('fetch', async (session, event) => {
|
|
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)
|
|
{
|
|
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(userSessionsTable).set({
|
|
timestamp: new Date(),
|
|
}).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) => {
|
|
if(session.id && session.user)
|
|
{
|
|
try
|
|
{
|
|
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) { }
|
|
}
|
|
});
|
|
}); |