feat: новая функция

This commit is contained in:
2025-11-01 17:25:49 +03:00
parent 772d4cff54
commit e28848146d
19 changed files with 1680 additions and 67 deletions

View File

@@ -300,26 +300,48 @@ class EncryptedDataService {
const query = `INSERT INTO ${tableName} (${columns.join(', ')}) VALUES (${placeholders}) RETURNING *`;
// Собираем параметры в правильном порядке: сначала для encrypted, потом для unencrypted
const paramsArray = [];
if (hasEncryptedFields) paramsArray.push(this.encryptionKey);
// Собираем параметры в правильном порядке по номерам из плейсхолдеров
const paramMap = new Map(); // номер параметра -> значение
// Добавляем параметры для encrypted колонок
for (const key of Object.keys(encryptedData)) {
const originalKey = key.replace('_encrypted', '');
if (filteredData[originalKey] !== undefined) {
paramsArray.push(filteredData[originalKey]);
} else if (filteredData[originalKey + '_unencrypted'] !== undefined) {
paramsArray.push(filteredData[originalKey + '_unencrypted']);
if (hasEncryptedFields) {
paramMap.set(1, this.encryptionKey); // $1 - ключ шифрования
}
// Проходим по колонкам в порядке allData и добавляем соответствующие значения
for (const key of Object.keys(allData)) {
const placeholder = allData[key].toString();
// Извлекаем все номера параметров из плейсхолдера (может быть $1 в encrypt_text)
const paramMatches = placeholder.match(/\$(\d+)/g);
if (paramMatches) {
// Для зашифрованных колонок нас интересует второй параметр ($3, $4 и т.д.)
// Для незашифрованных - первый параметр ($2, $3 и т.д.)
if (encryptedData[key]) {
// Это зашифрованная колонка - берем второй параметр (первый это $1 - ключ шифрования)
const originalKey = key.replace('_encrypted', '');
if (filteredData[originalKey] !== undefined && paramMatches.length > 0) {
// Последний параметр это значение для шифрования
const valueParam = paramMatches[paramMatches.length - 1];
const paramNum = parseInt(valueParam.substring(1));
paramMap.set(paramNum, filteredData[originalKey]);
}
} else if (unencryptedData[key]) {
// Это незашифрованная колонка - берем параметр из плейсхолдера
const valueParam = paramMatches[0];
const paramNum = parseInt(valueParam.substring(1));
paramMap.set(paramNum, filteredData[key]);
}
}
}
// Добавляем параметры для unencrypted колонок
for (const key of Object.keys(unencryptedData)) {
paramsArray.push(filteredData[key + '_unencrypted'] || filteredData[key]);
// Создаем массив параметров в правильном порядке (от $1 до максимального номера)
const maxParamNum = Math.max(...Array.from(paramMap.keys()));
const params = [];
for (let i = 1; i <= maxParamNum; i++) {
if (!paramMap.has(i)) {
throw new Error(`Отсутствует параметр $${i} для запроса`);
}
params.push(paramMap.get(i));
}
const params = paramsArray;
console.log(`🔍 Выполняем INSERT запрос:`, query);
console.log(`🔍 Параметры:`, params);