task-managment / src / lib / db / util.ts
util.ts
Raw
import { RequestCookie } from "next/dist/compiled/@edge-runtime/cookies";
import { cookies } from "next/headers";
import jwt from "jsonwebtoken";

export const VARIABLES_CONFIG = {
  APP_URL:
    process.env.NODE_ENV === "development"
      ? process.env.DEV_APP_URL
      : process.env.VERCEL_URL,
  VERIFIED_USER_IDENTIFIER: process.env.VERIFIED_USER_IDENTIFIER,
  VERIFICATION_TOKEN: process.env.VERIFICATION_TOKEN,
  JWT_SECRET: process.env.JWT_SECRET,
};

type CookieOptions = {
  path?: string;
  domain?: string;
  secure?: boolean;
  httpOnly?: boolean;
  sameSite?: "strict" | "lax" | "none";
  maxAge?: number;
};

export interface TokenPayload {
  id: string;
  role: string;
  exp: number;
}

export const setCookie = async (
  cookieName: string,
  value: string,
  options: CookieOptions = {}
) => {
  cookies().set(cookieName, value, {
    secure: process.env.NODE_ENV === "production",
    sameSite: "lax",
    maxAge: 60 * 60 * 24,
    ...options,
  });
};

export const getCookie = (cookieName: string): RequestCookie | null => {
  const cookieStore = cookies();
  if (cookieStore.has(cookieName)) {
    return cookieStore.get(cookieName)!;
  }
  return null;
};

export function generateToken<T>(payload: T, expiresInMs: number): string {
  const expiresAt = Math.floor(Date.now() / 1000) + expiresInMs / 1000; // Expiración en segundos
  const secret = VARIABLES_CONFIG.JWT_SECRET!;

  return jwt.sign(
    { ...payload, exp: expiresAt },
    secret, // Se agrega la expiración en el payload, // Clave secreta del entorno
  );
}

export function extractPayload(token: string): TokenPayload | null {
  try {
    const decoded = jwt.decode(token);
    if (decoded && typeof decoded === "object") {
      return decoded as TokenPayload;
    }
    return null;
  } catch (error) {
    console.error("Error decoding token:", error);
    return null;
  }
}

export function isTokenValid(token: string | null): boolean {
  if (!token) return false;
  const payload = extractPayload(token);
  if (!payload) return false;

  const bufferTime = 5 * 60 * 1000;
  const expInMillis = payload.exp * 1000;
  return expInMillis >= Date.now() + bufferTime;
}