"use server" import prisma from 'app/lib/db'; import { jwtVerify, JWTPayload, decodeJwt, SignJWT } from 'jose'; import { cookies } from 'next/headers'; import { loginSchema, LoginSchema } from 'app/login/schema'; import { NextResponse } from 'next/server'; export async function getJWTSecretKey() { console.log('getJWTSecretKey called!') const secret = process.env.JWT_SECRET console.log('secret: ' + secret) if (!secret) throw new Error("There is no JWT secret key") console.log('encoding...') try { const enc: Uint8Array = new TextEncoder().encode(secret) console.log('enc') return enc } catch (error) { console.error('aw shit: ' + error.message) } } export async function verifyJwt(token: string): Promise { console.log('verifyJwt called for token: ' + token) const key = await getJWTSecretKey() console.log('key: ' + key) const { payload } = await jwtVerify(token, key) console.log('payload: ' + payload) return payload try { } catch { return null } } export async function getJwt() { const cookieStore = cookies() const token = cookieStore.get("token") if (token) { try { const payload = await verifyJwt(token.value) if (payload) { const authPayload = { email: payload.email as string, iat: payload.iat as number, exp: payload.exp as number } return authPayload } } catch (error) { return null } } return null } export async function logout() { const cookieStore = cookies() const token = cookieStore.get('token') if (token) { //empty catch swallows errors try { cookieStore.delete('token') } catch { } } const userData = cookieStore.get("userData") if (userData) { try { cookieStore.delete('userData') return true } catch (_) { } } //return false if there is no userdata return null } export async function setUserDataCookie(userData) { const cookieStore = cookies(); cookieStore.set({ name: 'userData', value: JSON.stringify(userData), path: '/', maxAge: 3600, sameSite: 'strict' }) } export async function login(userLogin: LoginSchema) { const isSafe = loginSchema.safeParse(userLogin) try { if (!isSafe.success) throw new Error("parse failed") const user = await prisma.user.findFirst({ where: { email: userLogin.email } }) if (!user) throw new Error("user does not exist") const bcrypt = require("bcrypt"); const passwordIsValid = await bcrypt.compare(userLogin.password, user.password) if (!passwordIsValid) throw new Error("password is not valid") return { email: userLogin.email } } catch (error) { throw new Error('login failed') } } export async function jwtExpires() { }