r
This commit is contained in:
29
database.js
29
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 = {
|
||||
|
||||
Reference in New Issue
Block a user