import { randomBytes } from "crypto"; import { prisma } from "./prisma"; const CODE_ALPHABET = "ABCDEFGHJKLMNPQRSTUVWXYZ23456789"; const CODE_LENGTH = 6; const CODE_TTL_MINUTES = 60; export function generateActivationCode(): { code: string; expiresAt: Date } { let code = ""; const bytes = randomBytes(CODE_LENGTH); for (let i = 0; i < CODE_LENGTH; i++) { code += CODE_ALPHABET[bytes[i] % CODE_ALPHABET.length]; } const expiresAt = new Date(Date.now() + CODE_TTL_MINUTES * 60 * 1000); return { code, expiresAt }; } export async function generateUniqueActivationCode(retries = 5): Promise<{ code: string; expiresAt: Date }> { for (let i = 0; i < retries; i++) { const { code, expiresAt } = generateActivationCode(); const existing = await prisma.student.findUnique({ where: { activationCode: code } }); if (!existing) return { code, expiresAt }; } throw new Error("Failed to generate a unique activation code"); }