| import { cookies } from 'next/headers'; |
| import { redirect } from 'next/navigation'; |
| import { prisma } from '@/lib/db'; |
|
|
| const SESSION_COOKIE = 'candidatesession'; |
| const SESSION_DURATION_MS = 30 * 24 * 60 * 60 * 1000; |
|
|
| export async function getSessionCandidateId(): Promise<string | null> { |
| const cookieStore = await cookies(); |
| const sessionId = cookieStore.get(SESSION_COOKIE)?.value; |
| if (!sessionId) return null; |
|
|
| const session = await prisma.session.findUnique({ |
| where: { id: sessionId }, |
| }); |
| if (!session || session.expiresAt < new Date()) { |
| return null; |
| } |
|
|
| return session.candidateId; |
| } |
|
|
| export async function requireCandidate(): Promise<string> { |
| const id = await getSessionCandidateId(); |
| if (!id) { |
| redirect('/registrarme'); |
| } |
| return id; |
| } |
|
|
| export async function createCandidateSession(candidateId: string): Promise<string> { |
| const { randomUUID } = await import('node:crypto'); |
| const id = randomUUID(); |
| const expiresAt = new Date(Date.now() + SESSION_DURATION_MS); |
|
|
| await prisma.session.create({ |
| data: { id, candidateId, expiresAt }, |
| }); |
|
|
| return id; |
| } |
|
|
| export function sessionCookieHeader(sessionId: string): string { |
| const maxAge = SESSION_DURATION_MS / 1000; |
| return `${SESSION_COOKIE}=${sessionId}; HttpOnly; SameSite=Lax; Path=/; Max-Age=${maxAge}`; |
| } |
|
|
| export function clearSessionCookieHeader(): string { |
| return `${SESSION_COOKIE}=; HttpOnly; SameSite=Lax; Path=/; Max-Age=0`; |
| } |
|
|