A self hosted solution for privately rating and reviewing different sorts of media
at master 1.2 kB view raw
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});