92 lines
4.4 KiB
JavaScript
92 lines
4.4 KiB
JavaScript
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 }; |