File size: 1,458 Bytes
fc04d53 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 | 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; // 30 days
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`;
}
|