From cf0af15854247f0fca3fb3350896051068de5a33 Mon Sep 17 00:00:00 2001 From: Huskydog9988 <39809509+Huskydog9988@users.noreply.github.com> Date: Fri, 14 Mar 2025 11:35:12 -0400 Subject: [PATCH] store sessions in db --- prisma/schema/auth.prisma | 5 ++ server/internal/session/db.ts | 79 ++++++++++++++++++++++++++++++++ server/internal/session/index.ts | 6 ++- 3 files changed, 88 insertions(+), 2 deletions(-) create mode 100644 server/internal/session/db.ts diff --git a/prisma/schema/auth.prisma b/prisma/schema/auth.prisma index 6ebd4e0..df4a8af 100644 --- a/prisma/schema/auth.prisma +++ b/prisma/schema/auth.prisma @@ -50,3 +50,8 @@ model Certificate { blacklisted Boolean @default(false) } + +model Session { + token String @id + data Json +} diff --git a/server/internal/session/db.ts b/server/internal/session/db.ts new file mode 100644 index 0000000..6a85068 --- /dev/null +++ b/server/internal/session/db.ts @@ -0,0 +1,79 @@ +import { json } from "stream/consumers"; +import prisma from "../db/database"; +import { Session, SessionProvider } from "./types"; +import { Prisma } from "@prisma/client"; + +export default function createDBSessionHandler(): SessionProvider { + return { + async setSession(token, data) { + // const strData = JSON.stringify(data); + await prisma.session.upsert({ + where: { + token, + }, + create: { + token, + data, + }, + update: { + data, + }, + }); + return true; + }, + async updateSession(token, key, data) { + const newObj: { [key: string]: any } = {}; + newObj[key] = data; + + const session = await prisma.session.upsert({ + where: { + token, + }, + create: { + token, + data: newObj, + }, + update: {}, + }); + + // if json object and not arrary, update session + if ( + typeof session.data === "object" && + !Array.isArray(session.data) && + session.data !== null + ) { + // means we set it above + if (session.data[key] === data) return true; + + // else we need to set it ourselves + (session.data as Prisma.JsonObject)[key] = data; + await prisma.session.update({ + where: { + token, + }, + data: { + data: session.data, + }, + }); + return true; + } + return false; + }, + async getSession(token: string) { + const result = await prisma.session.findUnique({ + where: { + token, + }, + }); + if (result === null) return undefined; + return result.data as T; + }, + async clearSession(token) { + await prisma.session.delete({ + where: { + token, + }, + }); + }, + }; +} diff --git a/server/internal/session/index.ts b/server/internal/session/index.ts index 3049b22..d4d1057 100644 --- a/server/internal/session/index.ts +++ b/server/internal/session/index.ts @@ -6,6 +6,7 @@ import { v4 as uuidv4 } from "uuid"; import moment from "moment"; import { parse as parseCookies } from "cookie-es"; import { MinimumRequestObject } from "~/server/h3"; +import createDBSessionHandler from "./db"; /* This implementation may need work. @@ -24,11 +25,12 @@ export class SessionHandler { constructor() { // Create a new provider - this.sessionProvider = createMemorySessionProvider(); + this.sessionProvider = createDBSessionHandler(); + // this.sessionProvider = createMemorySessionProvider(); } private getSessionToken(request: MinimumRequestObject | undefined) { - if(!request) throw new Error("Native web request not available"); + if (!request) throw new Error("Native web request not available"); const cookieHeader = request.headers.get("Cookie"); if (!cookieHeader) return undefined; const cookies = parseCookies(cookieHeader);