This commit is contained in:
2025-12-14 13:31:28 +05:00
parent 54e7544274
commit 145d12f130
4 changed files with 330 additions and 231 deletions

View File

@@ -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 = {