1import { cookies } from 'next/headers';
2import prisma from '../db';
3import { cache } from 'react';
4import { redirect } from 'next/navigation';
5
6export type SafeUser = Awaited<ReturnType<typeof validateSessionToken>>;
7
8export const validateSessionToken = cache(async () => {
9 const sessionToken = (await cookies()).get('mlSessionToken');
10
11 if (sessionToken === null || sessionToken === undefined) {
12 return null;
13 }
14
15 const session = await prisma.session.findFirst({
16 where: {
17 token: sessionToken.value,
18 },
19 });
20
21 if (session === null) {
22 return null;
23 }
24
25 if (session.expiry && session.expiry < new Date()) {
26 redirect('/auth/logout');
27 return null;
28 }
29
30 return await prisma.user.findFirst({
31 where: {
32 id: session.userId,
33 },
34 select: safeUserSelect(),
35 });
36});
37
38export const safeUserSelect = () => ({
39 id: true,
40 username: true,
41 email: true,
42 ratingStyle: true,
43 theme: true,
44 showMediaMetaIn: true,
45 showMediaMetaInId: true,
46
47 dailyStreakLength: true,
48 dailyStreakLongest: true,
49 dailyStreakStarted: true,
50 dailyStreakUpdated: true,
51
52 invitedBy: true,
53 invitedById: true,
54
55 createdAt: true,
56});