59 lines
1.8 KiB
TypeScript
59 lines
1.8 KiB
TypeScript
import { CookieOptions, createSessionStorage } from "@remix-run/node"; // or cloudflare/deno
|
|
import { db } from "~/utils/db.server";
|
|
|
|
function createDatabaseSessionStorage({
|
|
cookie
|
|
} : { cookie: {name : string} & CookieOptions } ) {
|
|
// Configure your database client...
|
|
return createSessionStorage({
|
|
cookie,
|
|
async createData(data, expires) {
|
|
var session;
|
|
|
|
if(data && data.user_id){
|
|
session = await db.session.create({data:{data: JSON.stringify({ data }), user:{connect:{id: data.user_id}}}});
|
|
}
|
|
else {
|
|
session = await db.session.create({data:{data: JSON.stringify({ data })}});
|
|
}
|
|
|
|
return session.id;
|
|
},
|
|
async readData(id) {
|
|
let sessiondata = await db.session.findUnique({select: {user_id: true, data: true, user: true},where:{id: id}}) || null;
|
|
return sessiondata;
|
|
},
|
|
async updateData(id, data, expires) {
|
|
|
|
if(data && data.user_id){
|
|
await db.session.upsert({create:{data: JSON.stringify({ data }), user:{connect:{id: data.user_id}}}, update:{data: JSON.stringify({ data }), user:{connect:{id: data.user_id}}}, where: {id: id}});
|
|
}
|
|
else {
|
|
await db.session.upsert({create:{data: JSON.stringify({ data })}, update:{data: JSON.stringify({ data })}, where: {id: id}});
|
|
}
|
|
},
|
|
async deleteData(id) {
|
|
await db.session.delete({where: {id: id}});
|
|
},
|
|
});
|
|
}
|
|
|
|
const { getSession, commitSession, destroySession } =
|
|
createDatabaseSessionStorage(
|
|
{
|
|
// a Cookie from `createCookie` or the CookieOptions to create one
|
|
cookie: {
|
|
name: "__session",
|
|
|
|
httpOnly: true,
|
|
maxAge: 31556952,
|
|
path: "/",
|
|
sameSite: "lax",
|
|
secrets: ["super_secret_cookie_thingy"],
|
|
secure: false,
|
|
},
|
|
}
|
|
);
|
|
|
|
export { getSession, commitSession, destroySession };
|