CentralBackend/repositories/EmailVerificationRepository.js
2025-09-07 12:44:01 +02:00

95 lines
3.3 KiB
JavaScript

const { logger } = require('../middleware/logger');
class EmailVerificationRepository {
constructor(unitOfWork) {
this.unitOfWork = unitOfWork;
}
async upsertCode(userId, code, expiresAt) {
logger.info('EmailVerificationRepository.upsertCode:start', { userId });
const conn = this.unitOfWork.connection;
try {
// Try to update first
const [result] = await conn.query(
`UPDATE email_verifications SET verification_code = ?, expires_at = ?, verified_at = NULL, attempts = 0 WHERE user_id = ? AND (verified_at IS NULL OR expires_at > NOW())`,
[code, expiresAt, userId]
);
if (result.affectedRows === 0) {
// Insert if no row updated
await conn.query(
`INSERT INTO email_verifications (user_id, verification_code, expires_at) VALUES (?, ?, ?)`,
[userId, code, expiresAt]
);
}
logger.info('EmailVerificationRepository.upsertCode:success', { userId });
} catch (error) {
logger.error('EmailVerificationRepository.upsertCode:error', { userId, error: error.message });
throw error;
}
}
async getByUserId(userId) {
logger.info('EmailVerificationRepository.getByUserId:start', { userId });
const conn = this.unitOfWork.connection;
try {
const [rows] = await conn.query(
`SELECT * FROM email_verifications WHERE user_id = ? ORDER BY id DESC LIMIT 1`,
[userId]
);
logger.info('EmailVerificationRepository.getByUserId:success', { userId, found: rows.length > 0 });
return rows.length > 0 ? rows[0] : null;
} catch (error) {
logger.error('EmailVerificationRepository.getByUserId:error', { userId, error: error.message });
throw error;
}
}
async incrementAttempts(id) {
logger.info('EmailVerificationRepository.incrementAttempts:start', { id });
const conn = this.unitOfWork.connection;
try {
await conn.query(
`UPDATE email_verifications SET attempts = attempts + 1 WHERE id = ?`,
[id]
);
logger.info('EmailVerificationRepository.incrementAttempts:success', { id });
} catch (error) {
logger.error('EmailVerificationRepository.incrementAttempts:error', { id, error: error.message });
throw error;
}
}
async setVerified(id) {
logger.info('EmailVerificationRepository.setVerified:start', { id });
const conn = this.unitOfWork.connection;
try {
await conn.query(
`UPDATE email_verifications SET verified_at = NOW() WHERE id = ?`,
[id]
);
logger.info('EmailVerificationRepository.setVerified:success', { id });
} catch (error) {
logger.error('EmailVerificationRepository.setVerified:error', { id, error: error.message });
throw error;
}
}
async getUserBasic(userId) {
logger.info('EmailVerificationRepository.getUserBasic:start', { userId });
const conn = this.unitOfWork.connection;
try {
const [rows] = await conn.query(
`SELECT id, email FROM users WHERE id = ? LIMIT 1`,
[userId]
);
logger.info('EmailVerificationRepository.getUserBasic:success', { userId, found: rows.length > 0 });
return rows.length ? rows[0] : null;
} catch (error) {
logger.error('EmailVerificationRepository.getUserBasic:error', { userId, error: error.message });
throw error;
}
}
}
module.exports = EmailVerificationRepository;