const db = require("../config/db"); const Notification = require("../utils/notification.js"); function lockingStand(user, data) { return new Promise((resolve, reject) => { const sheepId = Number(data.sheep_id) || null; if (!user.possibilities.can_view_stand) { return reject(new Error("Forbidden: no rights to view stand")); } if ((sheepId !== user.id && sheepId !== null) && !user.possibilities.can_manager_stand) { return reject(new Error("Forbidden: no rights to view stand")); } resolve({ update: "ok", id: data.id }); }); } function unlockingStand(user, data) { return new Promise((resolve, reject) => { const sheepId = Number(data.sheep_id) || null; if (!user.possibilities.can_view_stand) { return reject(new Error("Forbidden: no rights to view stand")); } if ((sheepId !== user.id && sheepId !== null) && !user.possibilities.can_manager_stand) { return reject(new Error("Forbidden: no rights to view stand")); } resolve({ update: "ok", id: data.id }); }); } function updateStand(user, data) { return new Promise((resolve, reject) => { const sheepId = Number(data.sheep_id) || null; if (!user.possibilities.can_view_stand) { return reject(new Error("Forbidden: no rights to view stand")); } if ((sheepId !== user.id && sheepId !== null) && !user.possibilities.can_manager_stand) { return reject(new Error("Forbidden: no rights to view stand")); } const sql = ` UPDATE stand_schedule SET sheep_id = ?, updated_at = ? WHERE id = ?`; db.run(sql, [sheepId, Date.now(), data.id], function (err) { if (err) return reject(err); if (this.changes === 0) return reject(new Error("Stand not found")); const insertSql = ` INSERT INTO stand_schedule_history (stand_schedule_id, sheep_id, editor, created_at) VALUES (?, ?, ?, ?)`; db.run(insertSql, [Number(data.id), sheepId, user.id, Date.now()], function (err) { if (err) return reject(err); if (sheepId === null) { let text = [ 'Звільнилося місце на одному зі стендів. Хто перший — той встигне 😉', 'Є одне вільне місце на стенді. Запис відкрито — не проґавте 😉', 'У одного зі стендів з’явилося вільне місце. Встигніть записатися!', 'Раптова можливість! На стенді є вільне місце. Забронюйте його зараз 📋', 'Одне місце стало вільним. Можливо, це саме ваше? 😉', 'Стенд чекає нового учасника. Вільне місце вже доступне 📋', 'Є шанс приєднатися — одне місце звільнилося 😊', 'Вільне місце на стенді довго не чекатиме. Записуйтеся!', 'Оголошуємо міні-набір: доступне одне місце на стенді.', 'Щойно звільнилося місце. Хто швидший — той з нами 🚀', 'З’явилася можливість долучитися до стенду. Кількість місць обмежена!', 'Останнє вільне місце на стенді шукає свого власника.' ]; let randomMessage = text[Math.floor(Math.random() * text.length)]; Notification.sendStand({ title: "Звільнилось місце", body: randomMessage, page: `/stand/card/${data.stand_id}` }); } resolve({ update: "ok", id: data.id, historyId: this.lastID }); }); }); }); } module.exports = { lockingStand, unlockingStand, updateStand };