Files
mamad-app/lib/auth.ts
2025-06-22 00:01:22 +03:00

73 lines
1.7 KiB
TypeScript

import bcrypt from "bcryptjs"
export function validateIsraeliID(id: string): boolean {
if (!/^\d{9}$/.test(id)) return false
// Luhn algorithm for Israeli ID
let sum = 0
for (let i = 0; i < 9; i++) {
let digit = Number.parseInt(id[i])
if (i % 2 === 1) {
digit *= 2
if (digit > 9) digit -= 9
}
sum += digit
}
return sum % 10 === 0
}
export function generateValidIsraeliID(): string {
// Generate 8 random digits
let id = ""
for (let i = 0; i < 8; i++) {
id += Math.floor(Math.random() * 10).toString()
}
// Calculate the check digit using Luhn algorithm
let sum = 0
for (let i = 0; i < 8; i++) {
let digit = Number.parseInt(id[i])
if (i % 2 === 1) {
digit *= 2
if (digit > 9) digit -= 9
}
sum += digit
}
// Calculate check digit
const checkDigit = (10 - (sum % 10)) % 10
id += checkDigit.toString()
return id
}
export async function generateUniqueIsraeliID(): Promise<string> {
const { safeQuery } = await import("./database")
let attempts = 0
const maxAttempts = 100
while (attempts < maxAttempts) {
const newId = generateValidIsraeliID()
// Check if this ID already exists
const existingUsers = (await safeQuery("SELECT national_id FROM users WHERE national_id = ?", [newId])) as any[]
if (existingUsers.length === 0) {
return newId
}
attempts++
}
throw new Error("Unable to generate unique ID after maximum attempts")
}
export async function hashPassword(password: string): Promise<string> {
return bcrypt.hash(password, 12)
}
export async function verifyPassword(password: string, hash: string): Promise<boolean> {
return bcrypt.compare(password, hash)
}