ваше сообщение коммита
This commit is contained in:
4133
backend/db/data/isic_titles_ru.csv
Normal file
4133
backend/db/data/isic_titles_ru.csv
Normal file
File diff suppressed because it is too large
Load Diff
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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;
|
||||
@@ -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);
|
||||
});
|
||||
@@ -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"
|
||||
|
||||
Reference in New Issue
Block a user