mirror of
https://github.com/lukevella/rallly.git
synced 2025-07-30 14:38:57 +02:00
Prefetch user (#429)
This commit is contained in:
parent
37f777cace
commit
249376c43e
20 changed files with 220 additions and 181 deletions
|
@ -9,6 +9,7 @@ import { GetServerSideProps, NextApiHandler } from "next";
|
|||
|
||||
import { prisma } from "~/prisma/db";
|
||||
|
||||
import { createSSGHelperFromContext } from "../server/context";
|
||||
import { randomid } from "./nanoid";
|
||||
|
||||
const sessionOptions: IronSessionOptions = {
|
||||
|
@ -20,12 +21,42 @@ const sessionOptions: IronSessionOptions = {
|
|||
ttl: 0, // basically forever
|
||||
};
|
||||
|
||||
export type RegisteredUserSession = {
|
||||
isGuest: false;
|
||||
id: string;
|
||||
name: string;
|
||||
email: string;
|
||||
};
|
||||
|
||||
export type GuestUserSession = {
|
||||
isGuest: true;
|
||||
id: string;
|
||||
};
|
||||
|
||||
export type UserSession = GuestUserSession | RegisteredUserSession;
|
||||
|
||||
const setUser = async (session: IronSession) => {
|
||||
if (!session.user) {
|
||||
session.user = await createGuestUser();
|
||||
await session.save();
|
||||
}
|
||||
|
||||
if (!session.user.isGuest) {
|
||||
// Check registered user still exists
|
||||
const user = await prisma.user.findUnique({
|
||||
where: { id: session.user.id },
|
||||
});
|
||||
|
||||
if (!user) {
|
||||
session.user = await createGuestUser();
|
||||
await session.save();
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
export function withSessionRoute(handler: NextApiHandler) {
|
||||
return withIronSessionApiRoute(async (req, res) => {
|
||||
if (!req.session.user) {
|
||||
req.session.user = await createGuestUser();
|
||||
await req.session.save();
|
||||
}
|
||||
await setUser(req.session);
|
||||
return await handler(req, res);
|
||||
}, sessionOptions);
|
||||
}
|
||||
|
@ -33,14 +64,23 @@ export function withSessionRoute(handler: NextApiHandler) {
|
|||
export function withSessionSsr(handler: GetServerSideProps) {
|
||||
return withIronSessionSsr(async (context) => {
|
||||
const { req } = context;
|
||||
if (!req.session.user) {
|
||||
req.session.user = await createGuestUser();
|
||||
await req.session.save();
|
||||
}
|
||||
|
||||
await setUser(req.session);
|
||||
|
||||
const ssg = await createSSGHelperFromContext(context);
|
||||
await ssg.whoami.get.prefetch();
|
||||
|
||||
const res = await handler(context);
|
||||
|
||||
if ("props" in res) {
|
||||
return { ...res, props: { ...res.props, user: req.session.user } };
|
||||
return {
|
||||
...res,
|
||||
props: {
|
||||
...res.props,
|
||||
user: req.session.user,
|
||||
trpcState: ssg.dehydrate(),
|
||||
},
|
||||
};
|
||||
}
|
||||
|
||||
return res;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue