super-fit-web-app / src / utils / planetscale / session.ts
session.ts
Raw
import { db } from '@/db/PrismaClient';
import { NextApiRequest, NextApiResponse } from 'next';
import { TRPCError } from '@trpc/server';
import { cookieFunctions } from '../cookies';
import { User } from '@prisma/client'

export const getSession = async (req: NextApiRequest, res: NextApiResponse) => {
  const session_token = req.cookies[process.env.SESSION_COOKIE_NAME];

  if (session_token == null) {
    return {
      session_valid: false,
      user: {},
    } as {
      session_valid: boolean,
      user: User,
    };
  }

  const userIP = req.headers['x-real-ip'] as string|| req.socket.remoteAddress;

  const userAgent = req.headers['user-agent'] as string;

  const session = await db.session.findUnique({
    where: {
      session_token: session_token,
    }
  })
  .catch((error) => {
    console.log(error);
    throw new TRPCError({
      code: 'INTERNAL_SERVER_ERROR',
      message: `Error: there was an issue finding the session. ${(error as Error).message}`,
      cause: error
    });
  }
  );

  if (session == null){
    await cookieFunctions.deleteCookie(res);
    return {
      session_valid: false,
      user: {},
    } as {
      session_valid: boolean,
      user: User,
    };
  }

  if (session.expires < new Date()) {
    await db.session.delete({
      where: {
        session_token: session_token,
      }
    })
    .catch((error) => {
      console.log(error);
      throw new TRPCError({
        code: 'INTERNAL_SERVER_ERROR',
        message: `Error: there was an issue deleting the session. ${(error as Error).message}`,
        cause: error
      });
    })
    .then( async () => {
      await cookieFunctions.deleteCookie(res);
    });
    
    return {
      session_valid: false,
      user: {},
    } as {
      session_valid: boolean,
      user: User,
    };
  }

  const user = await db.user.findUnique({
    where: {
      userId: session.userId,
    },
  })
  .catch((error) => {
    console.log(error);
    throw new TRPCError({
      code: 'INTERNAL_SERVER_ERROR',
      message: `Error: there was an issue finding the user. ${(error as Error).message}`,
      cause: error
    });
  }
  );

  if (user == null) {
    await db.session.delete({
      where: {
        session_token: session_token,
      }
    })
    .catch((error) => {
      console.log(error);
      throw new TRPCError({
        code: 'INTERNAL_SERVER_ERROR',
        message: `Error: there was an issue deleting the session. ${(error as Error).message}`,
        cause: error
      });
    })
    .then( async () => {
      await cookieFunctions.deleteCookie(res);
    });
    return {
      session_valid: false,
      user: {},
    } as {
      session_valid: boolean,
      user: User,
    };
  }

  const { hash, salt, ...userWithoutPassword } = user;

  return {
    session_valid: true,
    user: userWithoutPassword,
  } as {
    session_valid: boolean,
    user: User,
  };
}