diff --git a/database.js b/database.js index 17d22e3..a76e2cd 100644 --- a/database.js +++ b/database.js @@ -3,7 +3,6 @@ const path = require('path'); const fs = require('fs'); require('dotenv').config(); -// Создаем папку data если нет const dataDir = path.join(__dirname, 'data'); const createDirIfNotExists = (dirPath) => { if (!fs.existsSync(dirPath)) { @@ -13,10 +12,7 @@ const createDirIfNotExists = (dirPath) => { createDirIfNotExists(dataDir); -// Путь к базе данных в папке data const dbPath = path.join(dataDir, 'school_crm.db'); - -// Папки для загрузок и логов в data const uploadsDir = path.join(dataDir, 'uploads'); const tasksDir = path.join(uploadsDir, 'tasks'); const logsDir = path.join(dataDir, 'logs'); @@ -36,7 +32,6 @@ const db = new sqlite3.Database(dbPath, (err) => { }); function initializeDatabase() { - // Обновленная таблица пользователей с поддержкой LDAP db.run(`CREATE TABLE IF NOT EXISTS users ( id INTEGER PRIMARY KEY AUTOINCREMENT, login TEXT UNIQUE NOT NULL, @@ -52,7 +47,6 @@ function initializeDatabase() { updated_at DATETIME DEFAULT CURRENT_TIMESTAMP )`); - // Таблица задач db.run(`CREATE TABLE IF NOT EXISTS tasks ( id INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT NOT NULL, @@ -75,7 +69,6 @@ function initializeDatabase() { FOREIGN KEY (closed_by) REFERENCES users (id) )`); - // Таблица назначений задач db.run(`CREATE TABLE IF NOT EXISTS task_assignments ( id INTEGER PRIMARY KEY AUTOINCREMENT, task_id INTEGER NOT NULL, @@ -90,7 +83,6 @@ function initializeDatabase() { FOREIGN KEY (user_id) REFERENCES users (id) )`); - // Таблица файлов db.run(`CREATE TABLE IF NOT EXISTS task_files ( id INTEGER PRIMARY KEY AUTOINCREMENT, task_id INTEGER NOT NULL, @@ -104,7 +96,6 @@ function initializeDatabase() { FOREIGN KEY (user_id) REFERENCES users (id) )`); - // Таблица логов db.run(`CREATE TABLE IF NOT EXISTS activity_logs ( id INTEGER PRIMARY KEY AUTOINCREMENT, task_id INTEGER NOT NULL, @@ -116,13 +107,17 @@ function initializeDatabase() { FOREIGN KEY (user_id) REFERENCES users (id) )`); + db.run(`CREATE TABLE IF NOT EXISTS notification_logs ( + id INTEGER PRIMARY KEY AUTOINCREMENT, + notification_key TEXT NOT NULL, + created_at DATETIME DEFAULT CURRENT_TIMESTAMP + )`); + console.log('База данных инициализирована в папке data'); - // Добавляем недостающие колонки если они не существуют setTimeout(addMissingColumns, 1000); } -// Функция для добавления недостающих колонок function addMissingColumns() { const columnsToAdd = [ { table: 'tasks', column: 'rework_comment', type: 'TEXT' }, @@ -132,14 +127,12 @@ function addMissingColumns() { ]; columnsToAdd.forEach(({ table, column, type }) => { - // Используем db.all вместо db.get для получения всех строк db.all(`PRAGMA table_info(${table})`, (err, rows) => { if (err) { console.error(`Ошибка при проверке таблицы ${table}:`, err); return; } - // rows теперь массив, можно использовать some const columnExists = rows.some(row => row.name === column); if (!columnExists) { db.run(`ALTER TABLE ${table} ADD COLUMN ${column} ${type}`, (err) => { @@ -208,35 +201,29 @@ function logActivity(taskId, userId, action, details = '') { fs.appendFileSync(path.join(logsDir, 'activity.log'), logEntry); } -// Функция для проверки прав доступа к задаче function checkTaskAccess(userId, taskId, callback) { - // Сначала получаем роль пользователя db.get("SELECT role FROM users WHERE id = ?", [userId], (err, user) => { if (err) { callback(err, false); return; } - // Администраторы имеют доступ ко всем задачам if (user && user.role === 'admin') { callback(null, true); return; } - // Проверяем, не закрыта ли задача db.get("SELECT status, created_by, closed_at FROM tasks WHERE id = ?", [taskId], (err, task) => { if (err || !task) { callback(err, false); return; } - // Если задача закрыта, доступ есть только у создателя и администраторов if (task.closed_at && task.created_by !== userId && user.role !== 'admin') { callback(null, false); return; } - // Обычные пользователи видят только задачи где они заказчик или исполнитель const query = ` SELECT 1 FROM tasks t WHERE t.id = ? AND ( @@ -252,11 +239,9 @@ function checkTaskAccess(userId, taskId, callback) { }); } -// Функция для проверки просроченных задач function checkOverdueTasks() { const now = new Date().toISOString(); - // Временно убираем проверку на closed_at до добавления колонки const query = ` SELECT ta.id, ta.task_id, ta.user_id, ta.status, ta.due_date FROM task_assignments ta @@ -265,6 +250,7 @@ function checkOverdueTasks() { AND ta.due_date < ? AND ta.status NOT IN ('completed', 'overdue') AND t.status = 'active' + AND t.closed_at IS NULL `; db.all(query, [now], (err, assignments) => { @@ -283,7 +269,6 @@ function checkOverdueTasks() { }); } -// Запускаем проверку просроченных задач каждую минуту setInterval(checkOverdueTasks, 60000); module.exports = { diff --git a/public/index.html b/public/index.html index eee3e3d..6525f46 100644 --- a/public/index.html +++ b/public/index.html @@ -7,7 +7,6 @@ -