se agrega los requerimientos de la LODPD con firma de documentos

This commit is contained in:
2026-04-07 15:14:44 -05:00
parent 408a9b4435
commit 46a11728b8
31 changed files with 1432 additions and 52 deletions
+57 -7
View File
@@ -5,7 +5,12 @@ const passwordChangeRepository = require('./password-change.repository');
const auditService = require('../audit/audit.service');
const usersService = require('../users/users.service');
const mailService = require('../mail/mail.service');
const certificatesService = require('../certificates/certificates.service');
const legalService = require('../legal/legal.service');
const { getCertificatePath } = require('../../utils/storagePath');
const { signAccess, signRefresh } = require('../../utils/jwt');
const fs = require('fs/promises');
const path = require('path');
const SALT_ROUNDS = 12;
@@ -37,7 +42,7 @@ const issueVerificationEmail = async (user) => {
};
};
const register = async ({ email, password }) => {
const register = async ({ email, password, certPassword, certificateFile, certificateAlias }, context = {}) => {
const existing = await authRepository.findByEmail(email);
if (existing) {
const err = new Error('Email already registered.');
@@ -57,17 +62,56 @@ const register = async ({ email, password }) => {
verificationToken,
verificationTokenExpires,
});
let mailResult;
let uploadedCertificate = null;
let legalDocuments = [];
try {
mailResult = await mailService.sendVerificationEmail({
const certificateDir = await getCertificatePath(userId);
const certificateFilename = path.basename(certificateFile.path);
const finalCertificatePath = path.join(certificateDir, certificateFilename);
await fs.rename(certificateFile.path, finalCertificatePath);
uploadedCertificate = await certificatesService.upload({
...certificateFile,
path: finalCertificatePath,
filename: certificateFilename,
}, certPassword, userId, certificateAlias || certificateFile.originalname, context);
const p12Buffer = await fs.readFile(finalCertificatePath);
legalDocuments = await legalService.issueInitialLegalPackage({
userId,
userName: name,
userEmail: email,
signerName: uploadedCertificate.subject_cn || name,
p12Buffer,
p12Password: certPassword,
context,
});
const attachments = legalDocuments.map((item) => ({
filename: item.signedFilename,
path: item.signedPath,
}));
await mailService.sendVerificationEmail({
name,
email,
verificationToken,
attachments,
});
} catch (error) {
const err = new Error('The account was created, but the verification email could not be sent. Please contact support or try again later.');
err.statusCode = 503;
err.code = 'MAIL_SEND_FAILED';
await authRepository.deleteUser(userId);
try {
if (certificateFile?.path) {
await fs.unlink(certificateFile.path);
}
} catch {}
const err = new Error('No se pudo completar el registro legal inicial. Revisa el certificado, la contraseña del P12 y vuelve a intentarlo.');
err.statusCode = error.statusCode || 503;
err.code = error.code || 'REGISTER_LEGAL_FLOW_FAILED';
err.message = error.message || err.message;
throw err;
}
@@ -77,10 +121,16 @@ const register = async ({ email, password }) => {
email,
metadata: {
verificationEmailSent: true,
legalPackageCreated: true,
legalVersion: '1.0.1',
},
});
return { userId, verificationToken, verificationUrl: mailResult.verificationUrl };
return {
userId,
verificationToken,
legalDocuments: legalDocuments.map(({ signedPath, originalPath, ...item }) => item),
};
};
const login = async ({ email, password }, context = {}) => {