цвета
This commit is contained in:
213
database.js
213
database.js
@@ -71,6 +71,9 @@ async function initializeDatabase() {
|
||||
await initializeSQLite();
|
||||
}
|
||||
|
||||
// Синхронизируем группы пользователей
|
||||
await syncUserGroups();
|
||||
|
||||
return db;
|
||||
}
|
||||
|
||||
@@ -92,6 +95,77 @@ function initializeSQLite() {
|
||||
});
|
||||
}
|
||||
|
||||
// Функция для синхронизации групп пользователей из старой структуры в новую
|
||||
async function syncUserGroups() {
|
||||
console.log('🔄 Синхронизация групп пользователей...');
|
||||
|
||||
try {
|
||||
// Получаем всех пользователей
|
||||
const users = await new Promise((resolve, reject) => {
|
||||
db.all("SELECT id, groups FROM users WHERE groups IS NOT NULL AND groups != ''", [], (err, rows) => {
|
||||
if (err) reject(err);
|
||||
else resolve(rows || []);
|
||||
});
|
||||
});
|
||||
|
||||
let syncedCount = 0;
|
||||
|
||||
for (const user of users) {
|
||||
try {
|
||||
let groups = [];
|
||||
try {
|
||||
groups = JSON.parse(user.groups);
|
||||
} catch (e) {
|
||||
console.log(`⚠️ Не удалось распарсить группы для пользователя ${user.id}: ${user.groups}`);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Для каждой группы
|
||||
for (const groupName of groups) {
|
||||
if (!groupName || typeof groupName !== 'string') continue;
|
||||
|
||||
// Находим ID группы
|
||||
const group = await new Promise((resolve, reject) => {
|
||||
db.get("SELECT id FROM user_groups WHERE name = ?", [groupName.trim()], (err, row) => {
|
||||
if (err) reject(err);
|
||||
else resolve(row);
|
||||
});
|
||||
});
|
||||
|
||||
if (group) {
|
||||
// Добавляем пользователя в группу
|
||||
await new Promise((resolve, reject) => {
|
||||
db.run(
|
||||
`INSERT INTO user_group_memberships (user_id, group_id)
|
||||
VALUES (?, ?)
|
||||
ON CONFLICT (user_id, group_id) DO NOTHING`,
|
||||
[user.id, group.id],
|
||||
function(err) {
|
||||
if (err) reject(err);
|
||||
else resolve();
|
||||
}
|
||||
);
|
||||
});
|
||||
console.log(`✅ Пользователь ${user.id} добавлен в группу "${groupName}"`);
|
||||
} else {
|
||||
console.log(`⚠️ Группа "${groupName}" не найдена для пользователя ${user.id}`);
|
||||
}
|
||||
}
|
||||
|
||||
syncedCount++;
|
||||
|
||||
} catch (error) {
|
||||
console.error(`❌ Ошибка синхронизации пользователя ${user.id}:`, error.message);
|
||||
}
|
||||
}
|
||||
|
||||
console.log(`✅ Синхронизировано ${syncedCount} пользователей`);
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка синхронизации групп:', error);
|
||||
}
|
||||
}
|
||||
|
||||
function createSQLiteTables() {
|
||||
// Таблица для истории уведомлений
|
||||
db.run(`CREATE TABLE IF NOT EXISTS notification_history (
|
||||
@@ -395,6 +469,71 @@ function createSQLiteTables() {
|
||||
setTimeout(() => {
|
||||
checkAndUpdateTableStructure();
|
||||
}, 2000);
|
||||
|
||||
// Добавляем группы по умолчанию
|
||||
setTimeout(() => {
|
||||
addDefaultGroups();
|
||||
}, 1000);
|
||||
}
|
||||
|
||||
// Добавляем группы по умолчанию
|
||||
function addDefaultGroups() {
|
||||
const defaultGroups = [
|
||||
{
|
||||
name: 'Администрация',
|
||||
description: 'Пользователи с правами администратора системы',
|
||||
color: '#e74c3c',
|
||||
can_approve_documents: true
|
||||
},
|
||||
{
|
||||
name: 'Секретарь',
|
||||
description: 'Группа для согласования документов',
|
||||
color: '#3498db',
|
||||
can_approve_documents: true
|
||||
},
|
||||
{
|
||||
name: 'help',
|
||||
description: 'Группа для получения заявок поддержки',
|
||||
color: '#27ae60',
|
||||
can_approve_documents: false
|
||||
},
|
||||
{
|
||||
name: 'doc',
|
||||
description: 'Группа для работы с документами',
|
||||
color: '#9b59b6',
|
||||
can_approve_documents: false
|
||||
},
|
||||
{
|
||||
name: 'ahch',
|
||||
description: 'Группа для AHCH задач',
|
||||
color: '#e67e22',
|
||||
can_approve_documents: false
|
||||
}
|
||||
];
|
||||
|
||||
defaultGroups.forEach(group => {
|
||||
db.get("SELECT id FROM user_groups WHERE name = ?", [group.name], (err, existing) => {
|
||||
if (err) {
|
||||
console.error(`❌ Ошибка проверки группы ${group.name}:`, err.message);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!existing) {
|
||||
db.run(
|
||||
`INSERT INTO user_groups (name, description, color, can_approve_documents)
|
||||
VALUES (?, ?, ?, ?)`,
|
||||
[group.name, group.description, group.color, group.can_approve_documents ? 1 : 0],
|
||||
(insertErr) => {
|
||||
if (insertErr) {
|
||||
console.error(`❌ Ошибка создания группы ${group.name}:`, insertErr.message);
|
||||
} else {
|
||||
console.log(`✅ Группа "${group.name}" создана по умолчанию`);
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
function createSQLiteIndexes() {
|
||||
@@ -1096,31 +1235,76 @@ async function createPostgresTables() {
|
||||
// Создаем индексы
|
||||
await createPostgresIndexes(client);
|
||||
|
||||
// Добавляем группы по умолчанию для PostgreSQL
|
||||
await addDefaultGroupsPostgreSQL(client);
|
||||
|
||||
client.release();
|
||||
console.log('✅ Таблицы PostgreSQL проверены/созданы');
|
||||
|
||||
// Проверяем структуру PostgreSQL таблиц
|
||||
await checkPostgresTableStructure();
|
||||
|
||||
// Создаем группу "Секретарь" по умолчанию
|
||||
try {
|
||||
const checkResult = await client.query("SELECT id FROM user_groups WHERE name = 'Секретарь'");
|
||||
if (checkResult.rows.length === 0) {
|
||||
await client.query(`
|
||||
INSERT INTO user_groups (name, description, color, can_approve_documents)
|
||||
VALUES ('Секретарь', 'Группа для согласования документов', '#e74c3c', true)
|
||||
`);
|
||||
console.log('✅ Группа "Секретарь" создана по умолчанию');
|
||||
}
|
||||
} catch (error) {
|
||||
console.warn('⚠️ Не удалось создать группу "Секретарь":', error.message);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ Ошибка создания таблиц PostgreSQL:', error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// Добавляем группы по умолчанию для PostgreSQL
|
||||
async function addDefaultGroupsPostgreSQL(client) {
|
||||
const defaultGroups = [
|
||||
{
|
||||
name: 'Администрация',
|
||||
description: 'Пользователи с правами администратора системы',
|
||||
color: '#e74c3c',
|
||||
can_approve_documents: true
|
||||
},
|
||||
{
|
||||
name: 'Секретарь',
|
||||
description: 'Группа для согласования документов',
|
||||
color: '#3498db',
|
||||
can_approve_documents: true
|
||||
},
|
||||
{
|
||||
name: 'help',
|
||||
description: 'Группа для получения заявок поддержки',
|
||||
color: '#27ae60',
|
||||
can_approve_documents: false
|
||||
},
|
||||
{
|
||||
name: 'doc',
|
||||
description: 'Группа для работы с документами',
|
||||
color: '#9b59b6',
|
||||
can_approve_documents: false
|
||||
},
|
||||
{
|
||||
name: 'ahch',
|
||||
description: 'Группа для AHCH задач',
|
||||
color: '#e67e22',
|
||||
can_approve_documents: false
|
||||
}
|
||||
];
|
||||
|
||||
for (const group of defaultGroups) {
|
||||
try {
|
||||
const checkResult = await client.query(
|
||||
"SELECT id FROM user_groups WHERE name = $1",
|
||||
[group.name]
|
||||
);
|
||||
|
||||
if (checkResult.rows.length === 0) {
|
||||
await client.query(
|
||||
`INSERT INTO user_groups (name, description, color, can_approve_documents)
|
||||
VALUES ($1, $2, $3, $4)`,
|
||||
[group.name, group.description, group.color, group.can_approve_documents]
|
||||
);
|
||||
console.log(`✅ Группа "${group.name}" создана по умолчанию в PostgreSQL`);
|
||||
}
|
||||
} catch (error) {
|
||||
console.error(`❌ Ошибка создания группы ${group.name}:`, error.message);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
async function createPostgresIndexes(client) {
|
||||
console.log('🔧 Создаем индексы для PostgreSQL...');
|
||||
|
||||
@@ -1620,6 +1804,7 @@ module.exports = {
|
||||
USE_POSTGRES,
|
||||
getDatabaseType: () => USE_POSTGRES ? 'PostgreSQL' : 'SQLite',
|
||||
checkAndUpdateTableStructure, // Экспортируем для ручного запуска
|
||||
syncUserGroups, // Экспортируем функцию синхронизации
|
||||
// Функции для работы с группами
|
||||
getUserGroups,
|
||||
getGroupMembers,
|
||||
|
||||
Reference in New Issue
Block a user