ваше сообщение коммита

This commit is contained in:
2025-07-18 11:59:17 +03:00
parent 2ca2827b7d
commit 1a4f2283b7
19 changed files with 5105 additions and 69 deletions

File diff suppressed because it is too large Load Diff

View File

@@ -59,7 +59,8 @@
"utf7": "^1.0.2",
"viem": "^2.23.15",
"winston": "^3.17.0",
"ws": "^8.18.1"
"ws": "^8.18.1",
"csv-parser": "^3.0.0"
},
"devDependencies": {
"@nomicfoundation/hardhat-chai-matchers": "^2.0.0",

View File

@@ -2,6 +2,8 @@ const express = require('express');
const router = express.Router();
const db = require('../db');
const logger = require('../utils/logger'); // Если используете логгер
const fs = require('fs');
const csv = require('csv-parser');
/**
* @swagger
@@ -72,6 +74,49 @@ router.get('/codes', async (req, res) => {
const page = parseInt(req.query.page, 10) || 1;
const limit = parseInt(req.query.limit, 10) || 25;
const offset = (page - 1) * limit;
const { lang } = req.query;
// Если запрошен русский язык — отдаём из CSV
if (lang === 'ru') {
const { level, parent_code } = req.query;
const results = [];
fs.createReadStream(__dirname + '/../db/data/isic_titles_ru.csv')
.pipe(csv())
.on('data', (data) => {
let pass = true;
// Фильтрация по уровню (по длине кода)
if (level) {
if (level == 1 && data.code.length !== 1) pass = false;
if (level == 2 && data.code.length !== 2) pass = false;
if (level == 3 && data.code.length !== 3) pass = false;
if (level == 4 && data.code.length !== 4) pass = false;
}
// Фильтрация по parent_code
if (parent_code && pass) {
if (level == 2 && !data.code.startsWith(parent_code)) pass = false;
if (level == 3 && !data.code.startsWith(parent_code)) pass = false;
if (level == 4 && !data.code.startsWith(parent_code)) pass = false;
}
if (pass) {
results.push({
code: data.code,
description: data.title,
});
}
})
.on('end', () => {
res.json({
totalItems: results.length,
codes: results,
totalPages: 1,
currentPage: 1,
});
})
.on('error', (err) => {
res.status(500).json({ error: 'Ошибка чтения русских кодов ISIC', details: err.message });
});
return;
}
const baseQuerySelect = `
SELECT c.code, c.description, c.code_level, c.explanatory_note_inclusion, c.explanatory_note_exclusion,

View File

@@ -305,4 +305,45 @@ router.post('/broadcast', async (req, res) => {
}
});
// DELETE /api/messages/history/:userId - удалить историю сообщений пользователя
router.delete('/history/:userId', async (req, res) => {
const userId = req.params.userId;
if (!userId) {
return res.status(400).json({ error: 'userId required' });
}
try {
// Проверяем права администратора
if (!req.user || !req.user.isAdmin) {
return res.status(403).json({ error: 'Only administrators can delete message history' });
}
// Удаляем все сообщения пользователя
const result = await db.getQuery()(
'DELETE FROM messages WHERE user_id = $1 RETURNING id',
[userId]
);
// Удаляем беседы пользователя (если есть)
const conversationResult = await db.getQuery()(
'DELETE FROM conversations WHERE user_id = $1 RETURNING id',
[userId]
);
console.log(`[messages.js] Deleted ${result.rowCount} messages and ${conversationResult.rowCount} conversations for user ${userId}`);
// Отправляем обновление через WebSocket
broadcastMessagesUpdate();
res.json({
success: true,
deletedMessages: result.rowCount,
deletedConversations: conversationResult.rowCount
});
} catch (e) {
console.error('[ERROR] /history/:userId:', e);
res.status(500).json({ error: 'DB error', details: e.message });
}
});
module.exports = router;

View File

@@ -1,59 +0,0 @@
// Скрипт для деплоя DLE (Digital Legal Entity) контрактов
const { ethers, artifacts } = require("hardhat");
const fs = require("fs");
const path = require("path");
async function main() {
console.log("Начинаем деплой DLE контрактов...");
// Получаем аккаунт деплоя
const [deployer] = await ethers.getSigners();
console.log(`Адрес деплоера: ${deployer.address}`);
console.log(`Баланс деплоера: ${await ethers.formatEther(await deployer.provider.getBalance(deployer.address))} ETH`);
// Получаем фабрику контрактов
console.log("Деплоим DLEFactory...");
const DLEFactory = await ethers.getContractFactory("DLEFactory");
const dleFactory = await DLEFactory.deploy(deployer.address);
await dleFactory.waitForDeployment();
const dleFactoryAddress = await dleFactory.getAddress();
console.log(`DLEFactory задеплоен по адресу: ${dleFactoryAddress}`);
// Сохраняем адреса контрактов
saveContractData("DLEFactory", dleFactoryAddress, await getAbi("DLEFactory"));
console.log("Деплой завершен!");
}
// Сохраняем адреса контрактов и ABI для фронтенда
function saveContractData(name, address, abi) {
const contractsDir = path.join(__dirname, "../..", "contracts-data");
if (!fs.existsSync(contractsDir)) {
fs.mkdirSync(contractsDir, { recursive: true });
}
fs.writeFileSync(
path.join(contractsDir, `${name}-address.json`),
JSON.stringify({ address }, null, 2)
);
fs.writeFileSync(
path.join(contractsDir, `${name}-abi.json`),
JSON.stringify(abi, null, 2)
);
}
// Получаем ABI контракта
async function getAbi(contractName) {
const artifact = await artifacts.readArtifact(contractName);
return artifact.abi;
}
// Запускаем скрипт деплоя
main()
.then(() => process.exit(0))
.catch((error) => {
console.error(error);
process.exit(1);
});

View File

@@ -2323,6 +2323,11 @@ csurf@^1.11.0:
csrf "3.1.0"
http-errors "~1.7.3"
csv-parser@^3.0.0:
version "3.2.0"
resolved "https://registry.yarnpkg.com/csv-parser/-/csv-parser-3.2.0.tgz#7e5515e3763e963dc8660dc9dcfc3f0eaf72b0a9"
integrity sha512-fgKbp+AJbn1h2dcAHKIdKNSSjfp43BZZykXsCjzALjKy80VXQNHPFJ6T9Afwdzoj24aMkq8GwDS7KGcDPpejrA==
dashdash@^1.12.0:
version "1.14.1"
resolved "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz#853cfa0f7cbe2fed5de20326b8dd581035f6e2f0"
@@ -5196,11 +5201,6 @@ parent-module@^1.0.0:
dependencies:
callsites "^3.0.0"
parse-duration@^1.1.0:
version "1.1.2"
resolved "https://registry.yarnpkg.com/parse-duration/-/parse-duration-1.1.2.tgz#20008e6c507814761864669bb936e3f4a9a80758"
integrity sha512-p8EIONG8L0u7f8GFgfVlL4n8rnChTt8O5FSxgxMz2tjc9FMP199wxVKVB6IbKx11uTbKHACSvaLVIKNnoeNR/A==
parseley@^0.12.0:
version "0.12.1"
resolved "https://registry.yarnpkg.com/parseley/-/parseley-0.12.1.tgz#4afd561d50215ebe259e3e7a853e62f600683aef"