This commit is contained in:
2025-03-31 00:22:21 +03:00
commit 38f2a05107
146 changed files with 66771 additions and 0 deletions

15
api/Dockerfile Normal file
View File

@@ -0,0 +1,15 @@
FROM node:20.18
WORKDIR /app
COPY package.json package-lock.json ./
RUN npm install
RUN apt-get update && apt-get install -y chromium
COPY . .
EXPOSE 4000
CMD npm start

16
api/app.js Normal file
View File

@@ -0,0 +1,16 @@
const express = require('express');
const app = express();
const routes = require('./routes/index');
// const cors = require('cors');
const port = 4000;
// app.use(cors())
app.use(express.json({ limit: '50mb' }));
app.use(express.urlencoded({ limit: '50mb' }));
app.use('/api', routes);
app.listen(port, () => {
console.log(`Server listening on port ${port}`);
});

34
api/config/db.js Normal file
View File

@@ -0,0 +1,34 @@
const sqlite3 = require("sqlite3").verbose();
const path = require('path');
const dbPath = process.env.DATABASE_PATH || '../';
const db = new sqlite3.Database(path.join(dbPath, 'database.sqlite'));
// db.serialize(() => {
// db.run(`
// CREATE TABLE IF NOT EXISTS sheeps (
// id INTEGER PRIMARY KEY AUTOINCREMENT,
// uuid TEXT UNIQUE
// )
// `);
// db.run(`
// CREATE TABLE IF NOT EXISTS administrators (
// sheep_id INTEGER PRIMARY KEY,
// can_view_sheeps INTEGER DEFAULT 0,
// FOREIGN KEY (sheep_id) REFERENCES sheeps(id)
// )
// `);
// db.run(`
// CREATE TABLE IF NOT EXISTS sessions (
// session_id TEXT PRIMARY KEY,
// sheep_id INTEGER,
// role TEXT DEFAULT 'sheep',
// expires_at INTEGER,
// FOREIGN KEY (sheep_id) REFERENCES sheeps(id)
// )
// `);
// });
module.exports = db;

View File

@@ -0,0 +1,6 @@
const TelegramConfig = {
token: "7855966674:AAEw9l_EF0GcpjrkSFzt0aLukEfJxBA2gcY",
chatId: "224538769"
}
module.exports = TelegramConfig;

View File

@@ -0,0 +1,112 @@
const ApartmentsService = require('../services/apartments.service');
class ApartmentsController {
async getApartments(req, res) {
const { entrance_id } = req.params;
if (entrance_id) {
if (req.sheepRole == "administrator" || (req.sheepRole == "moderator" && req.moderator.can_manager_territory) || req.can_view_territory) {
let result = await ApartmentsService.getApartments(entrance_id);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(401)
.send({ message: 'Entrance not found.' });
}
}
async createApartments(req, res) {
const { entrance_id } = req.params;
const data = req.body;
if (entrance_id && data) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await ApartmentsService.createApartments(
entrance_id,
data
);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create apartment.',
});
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(401)
.send({ message: 'Entrance not found.' });
}
}
async updateApartments(req, res) {
const data = req.body;
if (data) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await ApartmentsService.updateApartments(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable update history apartment.',
});
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(401)
.send({ message: 'Data not found.' });
}
}
async deleteApartments(req, res) {
const data = req.body;
if (data) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await ApartmentsService.deleteApartments(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable delete history apartment.',
});
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(401)
.send({ message: 'Data not found.' });
}
}
}
module.exports = new ApartmentsController();

View File

@@ -0,0 +1,22 @@
const AuthService = require('../services/auth.service');
class AuthController {
async login(req, res) {
if (req.sheepId && req.sheepRole) {
const result = await AuthService.findUserByID(req.sheepId, req.sheepRole);
if (result) {
return res.status(200).send(result);
} else {
return res.status(404).send({
message: 'Sheep not found.'
});
}
} else {
return res
.status(403)
.send({ message: 'The sheep does not have enough rights.' });
}
}
}
module.exports = new AuthController();

View File

@@ -0,0 +1,31 @@
const ConstructorService = require('../services/constructor.service');
class ConstructorController {
async createPack(req, res) {
const data = req.body;
if (data) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await ConstructorService.createPack(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create pack.',
});
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(401)
.send({ message: 'Users not found.' });
}
}
}
module.exports = new ConstructorController();

View File

@@ -0,0 +1,112 @@
const EntrancesService = require('../services/entrances.service');
class EntrancesController {
async getEntrances(req, res) {
const { house_id } = req.params;
if (house_id) {
if (req.sheepRole == "administrator" || (req.sheepRole == "moderator" && req.moderator.can_manager_territory) || req.can_view_territory) {
let result = await EntrancesService.getEntrances(house_id);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'House not found.' });
}
}
async createEntrance(req, res) {
const { house_id } = req.params;
const data = req.body;
if (house_id) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await EntrancesService.createEntrance(
house_id,
data
);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create entrance.',
});
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'House not found.' });
}
}
async updateEntrance(req, res) {
const data = req.body;
if (data) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await EntrancesService.updateEntrance(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable update entrance.',
});
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'Data not found.' });
}
}
async deleteEntrance(req, res) {
const data = req.body;
if (data) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await EntrancesService.deleteEntrance(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable delete entrance.',
});
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'Data not found.' });
}
}
}
module.exports = new EntrancesController();

View File

@@ -0,0 +1,29 @@
const saveCards = require("../middleware/genCards");
class GeneratorCardsController {
async getScreen(req, res) {
const { lat, lng, type, wayId, zoom, id, address, number } = req.query;
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await saveCards({ center: {lat:lat,lng:lng}, wayId: wayId, zoom: zoom ?? 18, type: type, number: id, address: `${address} ${number}` });
console.log(result);
if (result) {
return res.status(200).send(result);
} else {
return res
.status(404)
.send({ message: 'Image creation error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
}
}
module.exports = new GeneratorCardsController();

View File

@@ -0,0 +1,112 @@
const HistoryEntranceService = require('../services/history.entrance.service');
class HistoryEntranceController {
async getHistoryEntrance(req, res) {
const { entrance_id } = req.params;
if (entrance_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryEntranceService.getHistoryEntrance(entrance_id);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async createHistoryEntrance(req, res) {
const { entrance_id } = req.params;
const data = req.body;
if (entrance_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryEntranceService.createHistoryEntrance(
entrance_id,
data
);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create history entrance.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async updateHistoryEntrance(req, res) {
const { entrance_id } = req.params;
if (entrance_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryEntranceService.updateHistoryEntrance(entrance_id);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable update history entrance.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async deleteHistoryEntrance(req, res) {
const { entrance_id } = req.params;
if (entrance_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryEntranceService.deleteHistoryEntrance(entrance_id);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable delete history entrance.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
}
module.exports = new HistoryEntranceController();

View File

@@ -0,0 +1,113 @@
const HistoryHomesteadService = require('../services/history.homestead.service');
class HistoryHomesteadController {
async getHistoryHomestead(req, res) {
const { homestead_id } = req.params;
if (homestead_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryHomesteadService.getHistoryHomestead(homestead_id);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async createHistoryHomestead(req, res) {
const { homestead_id } = req.params;
const data = req.body;
if (homestead_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryHomesteadService.createHistoryHomestead(
homestead_id,
data
);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create history homestead.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async updateHistoryHomestead(req, res) {
const { uuid } = req.query;
const { homestead_id } = req.params;
if (homestead_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryHomesteadService.updateHistoryHomestead(homestead_id);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable update history homestead.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async deleteHistoryHomestead(req, res) {
const { homestead_id } = req.params;
if (homestead_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HistoryHomesteadService.deleteHistoryHomestead(homestead_id);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable delete history homestead.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
}
module.exports = new HistoryHomesteadController();

View File

@@ -0,0 +1,143 @@
const HomesteadsService = require('../services/homesteads.service');
class HomesteadsController {
async getList(req, res) {
const { mode } = req.query;
if (req.sheepRole == "administrator" || (req.sheepRole == "moderator" && req.moderator.can_manager_territory) || req.can_view_territory) {
let group_id = 0;
let sheepName = false;
if (req.sheepRole == "administrator") {
group_id = 0;
} else if (req.sheepRole == "moderator") {
group_id = req.group_id;
}
if (mode == "sheep") {
group_id = req.group_id;
sheepName = req.sheepName;
}
let result = await HomesteadsService.getList(group_id, sheepName);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
}
async getHomestead(req, res) {
const { homestead_id } = req.params;
if (homestead_id) {
if (req.sheepRole == "administrator" || (req.sheepRole == "moderator" && req.moderator.can_manager_territory) || req.can_view_territory) {
let result = await HomesteadsService.getHomestead(homestead_id);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async createHomestead(req, res) {
const data = req.body;
if (data) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await HomesteadsService.createHomestead(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create homestead.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async updateHomestead(req, res) {
const { homestead_id } = req.params;
const data = req.body;
if (homestead_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HomesteadsService.updateHomestead(homestead_id, data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable update homestead.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async deleteHomestead(req, res) {
const { homestead_id } = req.params;
if (homestead_id) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await HomesteadsService.deleteHomestead(homestead_id);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable delete homestead.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
}
module.exports = new HomesteadsController();

View File

@@ -0,0 +1,137 @@
const HousesService = require('../services/houses.service');
class HousesController {
async getList(req, res) {
const { mode } = req.query;
if (req.sheepRole == "administrator" || (req.sheepRole == "moderator" && req.moderator.can_manager_territory) || req.can_view_territory) {
let group_id = 0;
let sheepName = false;
if (req.sheepRole == "administrator") {
group_id = 0;
} else if (req.sheepRole == "moderator") {
group_id = req.group_id;
}
if (mode == "sheep") {
group_id = req.group_id;
sheepName = req.sheepName;
}
let result = await HousesService.getList(group_id, sheepName);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
}
async getHouse(req, res) {
const { house_id } = req.params;
if (house_id) {
if (req.sheepRole == "administrator" || (req.sheepRole == "moderator" && req.moderator.can_manager_territory) || req.can_view_territory) {
let result = await HousesService.getHouse(house_id);
if (result) {
return res
.status(200)
.send(result);
} else {
return res
.status(500)
.send({ message: 'Internal server error.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
}
async createHouse(req, res) {
const data = req.body;
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await HousesService.createHouse(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create house.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
}
async updateHouse(req, res) {
const { house_id } = req.params;
const data = req.body;
if (house_id) {
if (req.sheepRole == "administrator" || req.moderator.can_manager_territory) {
let result = await HousesService.updateHouse(house_id, data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable update house.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async deleteHouse(req, res) {
const { house_id } = req.params;
if (house_id) {
if (req.sheepRole == "administrator" || req.moderator.can_add_territory) {
let result = await HousesService.deleteHouse(house_id);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable delete house.',
});
}
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
}
module.exports = new HousesController();

View File

@@ -0,0 +1,24 @@
const RotationService = require('../services/rotation.service');
class RotationController {
async editTables(req, res) {
if (req.sheepRole == "administrator") {
let result = await RotationService.editTables();
if (result) {
return res.status(200).send(result);
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(403)
.send({ message: 'The user does not have enough rights.' });
}
}
}
module.exports = new RotationController();

View File

@@ -0,0 +1,110 @@
const SheepsService = require('../services/sheeps.service');
class SheepsController {
async getSheep(req, res) {
const { uuid } = req.query;
if (uuid) {
if (req.sheepRole) {
const result = await SheepsService.getSheep(uuid, req.sheepRole);
if (result) {
return res.status(200).send(result);
} else {
return res.status(404).send({
message: 'Sheep not found.'
});
}
} else {
return res
.status(403)
.send({ message: 'The sheep does not have enough rights.' });
}
} else {
return res
.status(401)
.send({ message: 'Sheeps not found.' });
}
}
async getList(req, res) {
if (req.sheepRole) {
const result = await SheepsService.getList(req.sheepRole);
if (result) {
return res.status(200).send(result);
} else {
return res
.status(404)
.send({ message: 'User not found.' });
}
} else {
return res
.status(404)
.send({ message: 'Users not found.' });
}
}
async createSheep(req, res) {
const data = req.body;
if (req.sheepRole && (req.sheepRole == "administrator" || req.moderator.can_add_sheeps)) {
let result = await SheepsService.createSheep(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable create sheep.',
});
}
} else {
return res
.status(403)
.send({ message: 'The sheep does not have enough rights.' });
}
}
async updateSheep(req, res) {
const { uuid } = req.query;
const data = req.body;
console.log("data", data);
if (req.sheepRole == "administrator") {
let result = await SheepsService.updateSheep(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable update sheep.',
});
}
} else {
return res
.status(403)
.send({ message: 'Sheep not foundThe sheep does not have enough rights.' });
}
}
async deleteSheep(req, res) {
const data = req.body;
if (req.sheepRole == "administrator") {
let result = await SheepsService.deleteSheep(data);
if (result) {
return res.status(200).send(result);
} else {
return res.status(500).send({
message: 'Unable delete sheep.',
});
}
} else {
return res
.status(403)
.send({ message: 'Sheep not foundThe sheep does not have enough rights.' });
}
}
}
module.exports = new SheepsController();

70
api/middleware/auth.js Normal file
View File

@@ -0,0 +1,70 @@
const db = require("../config/db");
const authenticate = (req, res, next) => {
const uuid = req.headers["authorization"];
if (!uuid) return res.status(401).json({ error: "Unauthorized" });
db.get(`
SELECT sheeps.*, administrators.* FROM administrators JOIN sheeps ON sheeps.id = administrators.sheep_id WHERE administrators.uuid = ?`,
[uuid],
(err, administrator) => {
if (administrator) {
req.sheepId = administrator.sheep_id;
req.sheepRole = 'administrator';
req.group_id = administrator.group_id;
req.sheepName = administrator.name;
req.can_view_schedule = administrator.can_view_schedule;
req.can_view_stand = administrator.can_view_stand;
req.can_view_territory = administrator.can_view_territory;
return next();
}
db.get(`
SELECT sheeps.*, moderators.* FROM moderators JOIN sheeps ON sheeps.id = moderators.sheep_id WHERE moderators.uuid = ?`,
[uuid],
(err, moderator) => {
if (moderator) {
req.sheepId = moderator.sheep_id;
req.sheepRole = 'moderator';
req.moderator = {
"id": moderator.moderators_id ? moderator.moderators_id : false,
"can_add_sheeps": moderator.can_add_sheeps == 1 ? true : false,
"can_add_territory": moderator.can_add_territory == 1 ? true : false,
"can_manager_territory": moderator.can_manager_territory == 1 ? true : false,
"can_add_stand": moderator.can_add_stand == 1 ? true : false,
"can_manager_stand": moderator.can_manager_stand == 1 ? true : false,
"can_add_schedule": moderator.can_add_schedule == 1 ? true : false
}
req.group_id = moderator.group_id;
req.sheepName = moderator.name;
req.can_view_schedule = moderator.can_view_schedule;
req.can_view_stand = moderator.can_view_stand;
req.can_view_territory = moderator.can_view_territory;
return next();
}
db.get(`SELECT sheeps.* FROM sheeps WHERE sheeps.uuid = ?`, [uuid], (err, sheep) => {
if (sheep) {
req.sheepId = sheep.id;
req.sheepRole = 'sheep';
req.group_id = sheep.group_id;
req.sheepName = sheep.name;
req.can_view_schedule = sheep.can_view_schedule;
req.can_view_stand = sheep.can_view_stand;
req.can_view_territory = sheep.can_view_territory;
return next();
}
return res.status(401).json({ error: "UUID not found" });
}
);
}
);
}
);
};
module.exports = authenticate;

View File

@@ -0,0 +1,77 @@
const path = require('path');
const fs = require('fs');
const puppeteer = require('puppeteer');
const sharp = require('sharp');
const DIR = process.env.CARDS_PATH || '../cards';
async function genCards({ center, type, wayId, zoom, number, address }) {
const browser = await puppeteer.launch({
executablePath: process.env.PUPPETEER_EXECUTABLE_PATH || '/usr/bin/chromium-browser',
args: ['--no-sandbox', '--disable-setuid-sandbox']
});
let latlng = center && center.lat && center.lng ? `lat=${center.lat}&lng=${center.lng}&` : '';
const page = await browser.newPage();
await page.setViewport({ width: 1144, height: (750 + 140) })
await page.goto(`https://sheep-service.com/screenshot.html?${latlng}type=${type}&wayId=${wayId}&zoom=${zoom}&address=${address}&number=${number}`, { timeout: 0 });
await page.waitForSelector('.leaflet-tile-loaded', { timeout: 30000 });
await new Promise(resolve => setTimeout(resolve, 1000));
let name = () => {
if (type == "house") return `T${number}.png`
else if (type == "entrance") return `E${number}.png`
else if (type == "homestead") return `H${number}.png`
return `${Date.now()}.png`
}
if (!fs.existsSync(path.join(DIR, 'cache'))) {
fs.mkdirSync(path.join(DIR, 'cache'), { recursive: true })
}
await page.screenshot({ path: path.join(DIR, "cache", name()) });
await browser.close();
return name();
}
async function saveCards({ center, type, wayId, zoom, number, address }) {
let name = await genCards({ center, type, wayId, zoom, number, address });
if (!fs.existsSync(path.join(DIR, type))) {
fs.mkdirSync(path.join(DIR, type), { recursive: true });
}
try {
const metadata = await sharp(path.join(DIR, 'cache', name)).metadata();
const width = metadata.width;
const height = metadata.height;
if (width > 20 && height > 140) {
const outputPath = path.join(DIR, type, name.replace(path.extname(name), '.webp'));
await sharp(path.join(DIR, 'cache', name))
.extract({
left: 0,
top: 0,
width: width,
height: height - 140
})
.webp()
.toFile(outputPath);
return fs.existsSync(outputPath);
} else {
console.error('Изображение слишком маленькое для обрезки!');
return false;
}
} catch (err) {
console.error('Ошибка при обработке изображения:', err);
return false;
}
}
module.exports = saveCards;

5377
api/package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

19
api/package.json Normal file
View File

@@ -0,0 +1,19 @@
{
"name": "API Sheep Service",
"version": "1.0.0",
"main": "app.js",
"scripts": {
"start": "node app.js"
},
"author": "",
"license": "ISC",
"description": "",
"dependencies": {
"cors": "^2.8.5",
"express": "^4.21.0",
"node-telegram-bot-api": "^0.66.0",
"sqlite3": "^5.1.7",
"puppeteer": "^24.4.0",
"sharp": "^0.33.5"
}
}

View File

@@ -0,0 +1,13 @@
const express = require('express');
const router = express.Router({ mergeParams: true });
const ApartmentsController = require('../controllers/apartments.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, ApartmentsController.getApartments)
.post(authenticate, ApartmentsController.createApartments)
.put(authenticate, ApartmentsController.updateApartments)
.delete(authenticate, ApartmentsController.deleteApartments);
module.exports = router;

10
api/routes/auth.routes.js Normal file
View File

@@ -0,0 +1,10 @@
const express = require('express');
const router = express.Router();
const AuthController = require('../controllers/auth.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, AuthController.login);
module.exports = router;

View File

@@ -0,0 +1,10 @@
const express = require('express');
const router = express.Router();
const ConstructorController = require('../controllers/constructor.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.post(authenticate, ConstructorController.createPack)
module.exports = router;

View File

@@ -0,0 +1,13 @@
const express = require('express');
const router = express.Router({ mergeParams: true });
const EntranceController = require('../controllers/entrances.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, EntranceController.getEntrances)
.post(authenticate, EntranceController.createEntrance)
.put(authenticate, EntranceController.updateEntrance)
.delete(authenticate, EntranceController.deleteEntrance);
module.exports = router;

View File

@@ -0,0 +1,10 @@
const express = require('express');
const router = express.Router();
const GeneratorCardsController = require('../controllers/generator.cards.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, GeneratorCardsController.getScreen);
module.exports = router;

View File

@@ -0,0 +1,13 @@
const express = require('express');
const router = express.Router({ mergeParams: true });
const HistoryEntranceController = require('../controllers/history.entrance.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, HistoryEntranceController.getHistoryEntrance)
.post(authenticate, HistoryEntranceController.createHistoryEntrance)
.put(authenticate, HistoryEntranceController.updateHistoryEntrance)
.delete(authenticate, HistoryEntranceController.deleteHistoryEntrance);
module.exports = router;

View File

@@ -0,0 +1,13 @@
const express = require('express');
const router = express.Router({ mergeParams: true });
const HistoryHomesteadController = require('../controllers/history.homestead.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, HistoryHomesteadController.getHistoryHomestead)
.post(authenticate, HistoryHomesteadController.createHistoryHomestead)
.put(authenticate, HistoryHomesteadController.updateHistoryHomestead)
.delete(authenticate, HistoryHomesteadController.deleteHistoryHomestead);
module.exports = router;

View File

@@ -0,0 +1,20 @@
const express = require('express');
const router = express.Router();
const HomesteadController = require('../controllers/homesteads.controller');
const authenticate = require("../middleware/auth");
router
.route('/list')
.get(authenticate, HomesteadController.getList)
router
.route('/:homestead_id')
.get(authenticate, HomesteadController.getHomestead)
.put(authenticate, HomesteadController.updateHomestead)
.delete(authenticate, HomesteadController.deleteHomestead);
router
.route('/')
.post(authenticate, HomesteadController.createHomestead);
module.exports = router;

View File

@@ -0,0 +1,20 @@
const express = require('express');
const router = express.Router();
const HousesController = require('../controllers/houses.controller');
const authenticate = require("../middleware/auth");
router
.route('/list')
.get(authenticate, HousesController.getList)
router
.route('/:house_id')
.get(authenticate, HousesController.getHouse)
.put(authenticate, HousesController.updateHouse)
.delete(authenticate, HousesController.deleteHouse);
router
.route('/')
.post(authenticate, HousesController.createHouse);
module.exports = router;

30
api/routes/index.js Normal file
View File

@@ -0,0 +1,30 @@
const express = require('express');
const router = express.Router();
const authRoutes = require('./auth.routes');
const sheepsRoutes = require('./sheeps.routes');
const constructorRoutes = require('./constructor.routes');
const housesRoutes = require('./houses.routes');
const homesteadsRoutes = require('./homesteads.routes');
const entrancesRoutes = require('./entrances.routes');
const apartmentsRoutes = require('./apartments.routes');
const historyEntranceRoutes = require('./history.entrance.routes');
const historyHomesteadRoutes = require('./history.homestead.routes');
const rotationRoutes = require('./rotation.routes');
const generatorCardsRoutes = require('./generator.cards.routes');
router.use('/auth', authRoutes);
router.use('/sheeps?', sheepsRoutes);
router.use('/constructor', constructorRoutes);
router.use('/houses?', housesRoutes);
router.use('/homesteads?', homesteadsRoutes);
router.use('/house/:house_id/entrances', entrancesRoutes);
router.use('/apartments?/:entrance_id', apartmentsRoutes);
router.use('/history/entrance/:entrance_id', historyEntranceRoutes);
router.use('/history/homestead/:homestead_id', historyHomesteadRoutes);
router.use('/rotation', rotationRoutes);
router.use('/generator/cards', generatorCardsRoutes);
module.exports = router;

View File

@@ -0,0 +1,10 @@
const express = require('express');
const router = express.Router();
const RotationController = require('../controllers/rotation.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, RotationController.editTables);
module.exports = router;

View File

@@ -0,0 +1,18 @@
const express = require('express');
const router = express.Router();
const SheepsController = require('../controllers/sheeps.controller');
const authenticate = require("../middleware/auth");
router
.route('/')
.get(authenticate, SheepsController.getSheep)
.post(authenticate, SheepsController.createSheep)
.put(authenticate, SheepsController.updateSheep)
.delete(authenticate, SheepsController.deleteSheep);
router
.route('/list')
.get(authenticate, SheepsController.getList);
module.exports = router;

View File

@@ -0,0 +1,102 @@
const db = require("../config/db");
class ApartmentsService {
getApartments(entrance_id) {
return new Promise((res, rej) => {
let sql = `
SELECT
*
FROM
apartments
WHERE
entrance_id = '${entrance_id}'
ORDER BY
id
`;
db.all(sql, (err, rows) => {
if (err) {
console.error(err.message);
return res(false);
} else {
let data = rows.map((row) => {
return {
"id": Number(row.id),
"entrance_id": Number(row.entrance_id),
"apartment_number": row.apartment_number,
"title": row.title,
"floors_number": Number(row.floors_number),
"status": Number(row.status),
"description": row.description,
"updated_at": Number(row.updated_at)
}
})
return res(data);
}
});
});
}
createApartments(entrance_id, data) {
return new Promise((res, rej) => {
let sql = 'INSERT INTO apartments(entrance_id, apartment_number, title, floors_number) VALUES (?, ?, ?, ?)';
db.run(sql, [
entrance_id,
Number(data.apartment_number),
data.title,
data.floors_number
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": this.lastID });
}
});
});
}
updateApartments(data) {
return new Promise((res, rej) => {
let sql = 'UPDATE apartments SET title = ?, status = ?, description = ?, updated_at = ? WHERE id = ?';
db.run(sql, [
data.title,
data.status,
data.description,
Math.floor(new Date(Date.now()).getTime()),
data.id
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": data.id });
}
});
});
}
deleteApartments(data) {
return new Promise((res, rej) => {
db.run('DELETE FROM apartments WHERE id = ?', [data.id], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": data.id });
}
});
});
}
}
module.exports = new ApartmentsService();

View File

@@ -0,0 +1,84 @@
const db = require("../config/db");
class AuthService {
findUserByID(id, sheepRole) {
return new Promise((res, rej) => {
let sql = `
SELECT
sheeps.*,
groups.group_number AS group_id,
administrators.id AS administrators_id,
administrators.uuid AS administrators_uuid,
moderators.id AS moderators_id,
moderators.uuid AS moderators_uuid,
moderators.can_add_sheeps,
moderators.can_add_territory,
moderators.can_manager_territory,
moderators.can_add_stand,
moderators.can_manager_stand,
moderators.can_add_schedule
FROM
sheeps
LEFT JOIN
groups ON groups.group_number = sheeps.group_id
LEFT JOIN
administrators ON administrators.sheep_id = sheeps.id
LEFT JOIN
moderators ON moderators.sheep_id = sheeps.id
WHERE
sheeps.id = ?
LIMIT 1;
`
db.get(sql, [id], (err, sheep) => {
if (err) {
console.error(err.message);
return res(false);
} else if (!sheep) {
console.log({ "error": "uuid not found" });
return res(false);
} else {
let data = {
"id": Number(sheep.id),
"group_id": Number(sheep.group_id),
"name": sheep.name,
"icon": sheep.icon,
"uuid": sheep.uuid,
"appointment": sheep.appointment,
"can_view_stand": sheep.can_view_stand == 0 ? false : true,
"can_view_schedule": sheep.can_view_schedule == 0 ? false : true,
"can_view_territory": sheep.can_view_territory == 0 ? false : true,
"administrator": {
"id": sheep.administrators_id ? sheep.administrators_id : false,
"uuid": null
},
"moderator": {
"id": sheep.moderators_id ? sheep.moderators_id : false,
"uuid": null,
"can_add_sheeps": sheep.can_add_sheeps == 1 ? true : false,
"can_add_territory": sheep.can_add_territory == 1 ? true : false,
"can_manager_territory": sheep.can_manager_territory == 1 ? true : false,
"can_add_stand": sheep.can_add_stand == 1 ? true : false,
"can_manager_stand": sheep.can_manager_stand == 1 ? true : false,
"can_add_schedule": sheep.can_add_schedule == 1 ? true : false
}
}
if (sheepRole == "administrator") {
if (sheep.administrators_id) {
data.administrator.uuid = sheep.administrators_uuid;
}
}
if (sheepRole == "moderator") {
if (sheep.moderators_id) {
data.moderator.uuid = sheep.moderators_uuid;
}
}
return res(data);
}
});
});
}
}
module.exports = new AuthService();

View File

@@ -0,0 +1,240 @@
const db = require("../config/db");
const saveCards = require("../middleware/genCards");
class ConstructorService {
// createPack(data) {
// return new Promise((res, rej) => {
// let sql = `
// INSERT INTO
// house(
// group_id,
// title,
// number,
// points,
// points_number,
// geo,
// osm_id,
// settlement,
// created_at
// )
// VALUES
// (?, ?, ?, ?, ?, ?, ?, ?, ?)
// `;
// db.run(sql, [
// Number(data.house.group_id),
// data.house.title,
// data.house.number,
// JSON.stringify(data.house.points),
// JSON.stringify(data.house.points_number),
// JSON.stringify(data.house.geo),
// JSON.stringify(data.house.osm_id),
// data.house.settlement,
// Math.floor(Date.now())
// ], function (err) {
// if (err) {
// console.error(err.message);
// return res(false);
// } else if (this.changes === 0) {
// return res(false);
// } else {
// const houseId = this.lastID;
// const entranceStmt = db.prepare(`
// INSERT INTO
// entrance(
// house_id,
// entrance_number,
// title,
// points,
// points_number,
// created_at
// )
// VALUES
// (?, ?, ?, ?, ?, ?)`);
// const apartmentStmt = db.prepare(`
// INSERT INTO
// apartments(
// entrance_id,
// apartment_number,
// floors_number,
// updated_at
// )
// VALUES
// (?, ?, ?, ?)`);
// data.entrance.forEach((e, index) => {
// entranceStmt.run(
// houseId,
// Number(e.entrance_number),
// e.title,
// JSON.stringify(e.points),
// JSON.stringify(e.points_number),
// Math.floor(Date.now()),
// function (err) {
// if (err) {
// console.error(err.message);
// return;
// }
// const entranceId = this.lastID;
// if (data.apartments[e.editor_id]) {
// data.apartments[e.editor_id].forEach(apartment => {
// apartmentStmt.run(
// entranceId,
// apartment.apartment_number,
// apartment.floors_number,
// Math.floor(Date.now())
// );
// });
// }
// }
// );
// });
// entranceStmt.finalize();
// apartmentStmt.finalize();
// // res({ "status": "ok", "id": houseId });
// }
// });
// });
// }
createPack(data) {
return new Promise((res, rej) => {
if (data.type == "house") {
const sql = `
INSERT INTO house (
group_id, title, number, points, points_number, geo, osm_id, settlement, created_at
) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?)`;
db.run(sql, [
Number(data.group_id),
data.title,
data.number,
JSON.stringify(data.points),
JSON.stringify(data.points_number),
JSON.stringify(data.geo),
JSON.stringify(data.osm_id),
data.settlement,
Math.floor(Date.now())
], function (err) {
if (err) {
console.error(err.message);
return res(false);
}
if (this.changes === 0) {
return res(false);
}
const houseId = this.lastID;
saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 18, type: "house", number: houseId, address: `${data.title} ${data.number}` });
const entranceStmt = db.prepare(`
INSERT INTO entrance (
house_id, entrance_number, title, points, points_number, created_at
) VALUES (?, ?, ?, ?, ?, ?)`);
const apartmentStmt = db.prepare(`
INSERT INTO apartments (
entrance_id, apartment_number, title, floors_number
) VALUES (?, ?, ?, ?)`);
const entranceIdMap = {}; // Для сопоставления editor_id → entrance_id
let pendingEntrances = data.entrance.length;
data.entrance.forEach((e) => {
entranceStmt.run(
houseId,
Number(e.entrance_number),
e.title,
JSON.stringify(e.points),
JSON.stringify(e.points_number),
Math.floor(Date.now()),
function (err) {
if (err) {
console.error(err.message);
return;
}
const entranceId = this.lastID;
entranceIdMap[e.editor_id] = entranceId;
if (--pendingEntrances === 0) {
insertApartments();
}
}
);
});
function insertApartments() {
for (const [editor_id, apartments] of Object.entries(data.apartments)) {
const entranceId = entranceIdMap[editor_id];
if (!entranceId) continue;
apartments.forEach(apartment => {
apartmentStmt.run(
entranceId,
Number(apartment.apartment_number),
apartment.title,
apartment.floors_number
);
});
}
entranceStmt.finalize();
apartmentStmt.finalize();
res({ "status": "ok", "id": houseId });
}
});
} else if (data.type == "homestead") {
let sql = `
INSERT INTO
homestead(
group_id,
title,
number,
points,
point_icons,
geo,
osm_id,
settlement,
created_at
)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
db.run(sql, [
Number(data.group_id),
data.title,
data.number,
JSON.stringify(data.points),
JSON.stringify(data.point_icons),
JSON.stringify(data.geo),
JSON.stringify(data.osm_id),
data.settlement,
Math.floor(new Date(Date.now()).getTime())
], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
saveCards({ center: data.geo, wayId: data.osm_id, zoom: data.zoom ?? 17, type: "homestead", number: this.lastID, address: `${data.title} ${data.number}` })
res({ "status": "ok", "id": this.lastID });
}
});
} else {
return res(false);
}
});
}
}
module.exports = new ConstructorService();

View File

@@ -0,0 +1,158 @@
const db = require("../config/db");
class EntrancesService {
getEntrances(house_id) {
return new Promise((res, rej) => {
let sql = `
SELECT
entrance.*,
COALESCE((SELECT entrance_history.working FROM entrance_history WHERE entrance_history.entrance_id = entrance.id ORDER BY entrance_history.date_start DESC LIMIT 1), 0) AS working,
(SELECT entrance_history.name FROM entrance_history WHERE entrance_history.entrance_id = entrance.id ORDER BY entrance_history.date_start DESC LIMIT 1) AS entrance_history_name,
(SELECT entrance_history.group_id FROM entrance_history WHERE entrance_history.entrance_id = entrance.id ORDER BY entrance_history.date_start DESC LIMIT 1) AS entrance_history_group_id,
(SELECT entrance_history.sheep_id FROM entrance_history WHERE entrance_history.entrance_id = entrance.id ORDER BY entrance_history.date_start DESC LIMIT 1) AS entrance_history_sheep_id,
(SELECT entrance_history.id FROM entrance_history WHERE entrance_history.entrance_id = entrance.id ORDER BY entrance_history.date_start DESC LIMIT 1) AS entrance_history_id,
(SELECT entrance_history.date_start FROM entrance_history WHERE entrance_history.entrance_id = entrance.id ORDER BY entrance_history.date_start DESC LIMIT 1) AS entrance_history_date_start,
(SELECT entrance_history.date_end FROM entrance_history WHERE entrance_history.entrance_id = entrance.id ORDER BY entrance_history.date_start DESC LIMIT 1) AS entrance_history_date_end
FROM
entrance
WHERE
entrance.house_id = '${house_id}'
`;
db.all(sql, (err, rows) => {
if (err) {
console.error(err.message);
return res(false);
} else {
let data = rows.map((row) => {
return {
"id": Number(row.id),
"house_id": Number(row.house_id),
"entrance_number": Number(row.entrance_number),
"title": row.title,
"points": JSON.parse(row.points),
"points_number": JSON.parse(row.points_number),
"floors_quantity": row.floors_quantity,
"apartments_quantity": row.apartments_quantity,
"description": row.description,
"created_at": Number(row.created_at),
"updated_at": Number(row.updated_at),
"working": Number(row.working) == 0 ? false : true,
"history": {
"id": row.entrance_history_id ? Number(row.entrance_history_id) : null,
"name": row.entrance_history_name,
"group_id": row.entrance_history_group_id ? Number(row.entrance_history_group_id) : null,
"sheep_id": row.entrance_history_sheep_id ? Number(row.entrance_history_sheep_id) : null,
"date": {
"start": row.entrance_history_date_start ? Number(row.entrance_history_date_start) : null,
"end": row.entrance_history_date_end ? Number(row.entrance_history_date_end) : null
}
}
}
})
return res(data);
}
});
});
}
createEntrance(house_id, data) {
return new Promise((res, rej) => {
let sql = `
INSERT INTO
entrance(
house_id,
entrance_number,
title,
points,
points_number,
floors_quantity,
apartments_quantity,
description,
created_at,
updated_at
)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
db.run(sql, [
house_id,
Number(data.entrance_number),
data.title,
JSON.stringify(data.points),
JSON.stringify(data.points_number),
data.floors_quantity,
data.apartments_quantity,
data.description,
Math.floor(new Date(Date.now()).getTime()),
Math.floor(new Date(Date.now()).getTime()),
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": this.lastID });
}
});
});
}
updateEntrance(data) {
return new Promise((res, rej) => {
let sql = `
UPDATE
entrance
SET
title = ?,
points = ?,
points_number = ?,
floors_quantity = ?,
apartments_quantity = ?,
description = ?,
updated_at = ?
WHERE
id = ?
`;
db.run(sql, [
data.title,
JSON.stringify(data.points),
JSON.stringify(data.points_number),
data.floors_quantity,
data.apartments_quantity,
data.description,
Math.floor(new Date(Date.now()).getTime()),
data.id
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": data.id });
}
});
});
}
deleteEntrance(data) {
return new Promise((res, rej) => {
db.run('DELETE FROM entrance WHERE id = ?', [data.id], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": data.id });
}
});
});
}
}
module.exports = new EntrancesService();

View File

@@ -0,0 +1,105 @@
const db = require("../config/db");
class HistoryEntranceService {
getHistoryEntrance(entrance_id) {
return new Promise((res, rej) => {
let sql = `
SELECT
*
FROM
entrance_history
WHERE
entrance_history.entrance_id = '${entrance_id}'
ORDER BY
entrance_history.date_start
`;
db.all(sql, (err, rows) => {
if (err) {
console.error(err.message);
return res(false);
} else {
let data = rows.map((row) => {
return {
"id": Number(row.id),
"entrance_id": Number(row.entrance_id),
"name": row.name,
"group_id": Number(row.group_id),
"sheep_id": Number(row.sheep_id),
"working": Number(row.working) == 0 ? false : true,
"date": {
"start": Number(row.date_start),
"end": row.date_end ? Number(row.date_end) : null
}
}
})
return res(data);
}
});
});
}
createHistoryEntrance(entrance_id, data) {
return new Promise((res, rej) => {
let sql = 'INSERT INTO entrance_history(entrance_id, name, date_start, group_id, sheep_id, working) VALUES (?, ?, ?, ?, ?, ?)';
db.run(sql, [
entrance_id,
data.name,
Math.floor(new Date(Date.now()).getTime()),
Number(data.group_id),
Number(data.sheep_id),
1
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "create": "ok", "id": this.lastID });
}
});
});
}
updateHistoryEntrance(entrance_id) {
return new Promise((res, rej) => {
console.log(Number(entrance_id));
let sql = 'UPDATE entrance_history SET date_end = ?, working = ? WHERE id = ?';
db.run(sql, [
Math.floor(new Date(Date.now()).getTime()),
0,
Number(entrance_id)
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "update": "ok", "id": entrance_id });
}
});
});
}
deleteHistoryEntrance(entrance_id) {
return new Promise((res, rej) => {
db.run('DELETE FROM entrance_history WHERE id = ?', [Number(entrance_id)], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "delete": "ok", "id": entrance_id });
}
});
});
}
}
module.exports = new HistoryEntranceService();

View File

@@ -0,0 +1,103 @@
const db = require("../config/db");
class HistoryHomesteadService {
getHistoryHomestead(homestead_id) {
return new Promise((res, rej) => {
let sql = `
SELECT
*
FROM
homestead_history
WHERE
homestead_history.homestead_id = '${homestead_id}'
ORDER BY
homestead_history.date_start
`;
db.all(sql, (err, rows) => {
if (err) {
console.error(err.message);
return res(false);
} else {
let data = rows.map((row) => {
return {
"id": Number(row.id),
"homestead_id": Number(row.homestead_id),
"name": row.name,
"group_id": Number(row.group_id),
"sheep_id": Number(row.sheep_id),
"working": Number(row.working) == 0 ? false : true,
"date": {
"start": Number(row.date_start),
"end": row.date_end ? Number(row.date_end) : null
}
}
})
return res(data);
}
});
});
}
createHistoryHomestead(homestead_id, data) {
return new Promise((res, rej) => {
let sql = 'INSERT INTO homestead_history(homestead_id, name, date_start, group_id, sheep_id, working) VALUES (?, ?, ?, ?, ?, ?)';
db.run(sql, [
homestead_id,
data.name,
Math.floor(new Date(Date.now()).getTime()),
Number(data.group_id),
Number(data.sheep_id),
1
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "create": "ok", "id": this.lastID });
}
});
});
}
updateHistoryHomestead(homestead_id) {
return new Promise((res, rej) => {
let sql = 'UPDATE homestead_history SET date_end = ?, working = ? WHERE id = ?';
db.run(sql, [
Math.floor(new Date(Date.now()).getTime()),
0,
Number(homestead_id)
], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "update": "ok", "id": homestead_id });
}
});
});
}
deleteHistoryHomestead(data) {
return new Promise((res, rej) => {
db.run('DELETE FROM homestead_history WHERE id = ?', [Number(homestead_id)], function(err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "delete": "ok", "id": homestead_id });
}
});
});
}
}
module.exports = new HistoryHomesteadService();

View File

@@ -0,0 +1,260 @@
const db = require("../config/db");
class HomesteadsService {
getList(group, sheepName) {
return new Promise((res, rej) => {
let sql = `
SELECT
homestead.*,
COALESCE((SELECT homestead_history.working FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1), 0) AS working,
(SELECT homestead_history.name FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_name,
(SELECT homestead_history.group_id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_group_id,
(SELECT homestead_history.sheep_id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_sheep_id,
(SELECT homestead_history.id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_id,
(SELECT homestead_history.date_start FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_date_start,
(SELECT homestead_history.date_end FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_date_end
FROM
homestead
`;
if (group != "0" && !sheepName) {
sql = `
SELECT
homestead.*,
COALESCE((SELECT homestead_history.working FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1), 0) AS working,
(SELECT homestead_history.name FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_name,
(SELECT homestead_history.group_id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_group_id,
(SELECT homestead_history.sheep_id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_sheep_id,
(SELECT homestead_history.id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_id,
(SELECT homestead_history.date_start FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_date_start,
(SELECT homestead_history.date_end FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_date_end
FROM
homestead
WHERE
group_id == '${group}'
`;
}
if (sheepName) {
sql = `
SELECT
homestead.*,
homestead_history.homestead_id,
homestead_history.name AS homestead_history_name,
homestead_history.group_id AS homestead_history_group_id,
homestead_history.sheep_id AS homestead_history_sheep_id,
homestead_history.id AS homestead_history_id,
homestead_history.date_start AS homestead_history_date_start,
homestead_history.date_end AS homestead_history_date_end
FROM
homestead
JOIN
homestead_history
ON
homestead.id = homestead_history.homestead_id
WHERE
homestead.group_id = '${group}'
AND
homestead_history.working = 1
AND
homestead_history.name IN ('Групова', '${sheepName}');
`;
}
db.all(sql, (err, rows) => {
if (err) {
console.error(err.message);
return res(false);
} else {
let data = rows.map((row) => {
return {
"id": Number(row.id),
"group_id": Number(row.group_id),
"title": row.title,
"number": row.number,
"points": JSON.parse(row.points),
"point_icons": JSON.parse(row.point_icons),
"geo": JSON.parse(row.geo),
"osm_id": JSON.parse(row.osm_id),
"settlement": row.settlement,
"description": row.description,
"created_at": Number(row.created_at),
"updated_at": Number(row.updated_at),
"working": Number(row.working) == 0 ? false : true,
"history": {
"id": row.homestead_history_id ? Number(row.homestead_history_id) : null,
"name": row.homestead_history_name,
"group_id": row.homestead_history_group_id ? Number(row.homestead_history_group_id) : null,
"sheep_id": row.entrance_history_sheep_id ? Number(row.entrance_history_sheep_id) : null,
"date": {
"start": row.homestead_history_date_start ? Number(row.homestead_history_date_start) : null,
"end": row.homestead_history_date_end ? Number(row.homestead_history_date_end) : null
}
}
}
})
return res(data);
}
});
});
}
getHomestead(homestead_id) {
return new Promise((res, rej) => {
let sql = `
SELECT
homestead.*,
COALESCE((SELECT homestead_history.working FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1), 0) AS working,
(SELECT homestead_history.name FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_name,
(SELECT homestead_history.group_id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_group_id,
(SELECT homestead_history.id FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_id,
(SELECT homestead_history.date_start FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_date_start,
(SELECT homestead_history.date_end FROM homestead_history WHERE homestead_history.homestead_id = homestead.id ORDER BY homestead_history.date_start DESC LIMIT 1) AS homestead_history_date_end
FROM
homestead
WHERE
homestead.id = '${homestead_id}'
`;
db.get(sql, (err, row) => {
if (err) {
console.error(err.message);
return res(false);
} else if (!row) {
console.log({ "error": "house not found" });
return res(false);
} else {
let data = {
"id": Number(row.id),
"group_id": Number(row.group_id),
"title": row.title,
"number": row.number,
"points": JSON.parse(row.points),
"point_icons": JSON.parse(row.point_icons),
"geo": JSON.parse(row.geo),
"osm_id": JSON.parse(row.osm_id),
"settlement": row.settlement,
"description": row.description,
"updated_at": Number(row.updated_at),
"working": Number(row.working) == 0 ? false : true,
"history": {
"id": row.homestead_history_id ? Number(row.homestead_history_id) : null,
"name": row.homestead_history_name,
"group_id": row.homestead_history_group_id ? Number(row.homestead_history_group_id) : null,
"date": {
"start": row.homestead_history_date_start ? Number(row.homestead_history_date_start) : null,
"end": row.homestead_history_date_end ? Number(row.homestead_history_date_end) : null
}
}
}
res(data);
}
});
});
}
createHomestead(data) {
return new Promise((res, rej) => {
let sql = `
INSERT INTO
homestead(
group_id,
title,
number,
points,
point_icons,
geo,
osm_id,
settlement,
created_at
)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
db.run(sql, [
Number(data.group_id),
data.title,
data.number,
JSON.stringify(data.points),
JSON.stringify(data.point_icons),
JSON.stringify(data.geo),
JSON.stringify(data.osm_id),
data.settlement,
Math.floor(new Date(Date.now()).getTime())
], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": this.lastID });
}
});
});
}
updateHomestead(homestead_id, data) {
return new Promise((res, rej) => {
let sql = `
UPDATE
homestead
SET
group_id = ?,
title = ?,
number = ?,
points = ?,
point_icons = ?,
geo = ?,
osm_id = ?,
settlement = ?,
description = ?,
updated_at = ?
WHERE
id = ?
`;
db.run(sql, [
Number(data.group_id),
data.title,
data.number,
JSON.stringify(data.points),
JSON.stringify(data.point_icons),
JSON.stringify(data.geo),
JSON.stringify(data.osm_id),
data.settlement,
data.description,
Math.floor(new Date(Date.now()).getTime()),
homestead_id
], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": homestead_id });
}
});
});
}
deleteHomestead(homestead_id) {
return new Promise((res, rej) => {
db.run('DELETE FROM homestead WHERE id = ?', [homestead_id], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": homestead_id });
}
});
});
}
}
module.exports = new HomesteadsService();

View File

@@ -0,0 +1,233 @@
const db = require("../config/db");
class HousesService {
getList(group, sheepName) {
return new Promise((res, rej) => {
let sql = `
SELECT
house.*,
(SELECT COUNT(DISTINCT entrance_history.id) FROM entrance_history JOIN entrance ON entrance.id = entrance_history.entrance_id WHERE entrance.house_id = house.id AND entrance_history.working = 1 ORDER BY entrance_history.date_start DESC) AS working,
(SELECT COUNT(*) FROM entrance WHERE entrance.house_id = house.id) AS entrance_quantity
FROM
house
`;
if (group != "0" && !sheepName) {
sql = `
SELECT
house.*,
(SELECT COUNT(DISTINCT entrance_history.id) FROM entrance_history JOIN entrance ON entrance.id = entrance_history.entrance_id WHERE entrance.house_id = house.id AND entrance_history.working = 1 ORDER BY entrance_history.date_start DESC) AS working,
(SELECT COUNT(*) FROM entrance WHERE entrance.house_id = house.id) AS entrance_quantity
FROM
house
WHERE
group_id == '${group}'
`;
}
if (sheepName) {
sql = `
SELECT DISTINCT
house.*,
(SELECT COUNT(DISTINCT entrance_history.id) FROM entrance_history JOIN entrance ON entrance.id = entrance_history.entrance_id WHERE entrance.house_id = house.id AND entrance_history.working = 1 ORDER BY entrance_history.date_start DESC) AS working,
(SELECT COUNT(*) FROM entrance WHERE entrance.house_id = house.id) AS entrance_quantity
FROM
house
JOIN
entrance ON entrance.house_id = house.id
JOIN
entrance_history ON entrance_history.entrance_id = entrance.id
WHERE
house.group_id = '${group}'
AND
entrance_history.working = 1
AND
entrance_history.name IN ('Групова', '${sheepName}');
`;
}
db.all(sql, (err, rows) => {
if (err) {
console.error(err.message);
return res(false);
} else {
let data = rows.map((row) => {
return {
"id": Number(row.id),
"group_id": Number(row.group_id),
"title": row.title,
"number": row.number,
"points": JSON.parse(row.points),
"points_number": JSON.parse(row.points_number),
"geo": JSON.parse(row.geo),
"osm_id": JSON.parse(row.osm_id),
"settlement": row.settlement,
"description": row.description,
"created_at": Number(row.created_at),
"updated_at": Number(row.updated_at),
"entrance": {
"quantity": Number(row.entrance_quantity),
"working": Number(row.working)
}
}
})
return res(data);
}
});
});
}
getHouse(house_id) {
return new Promise((res, rej) => {
let sql = `
SELECT
house.*,
(SELECT COUNT(DISTINCT entrance_history.id) FROM entrance_history JOIN entrance ON entrance.id = entrance_history.entrance_id WHERE entrance.house_id = house.id AND entrance_history.working = 1 ORDER BY entrance_history.date_start DESC) AS working,
(SELECT COUNT(*) FROM entrance WHERE entrance.house_id = house.id) AS entrance_quantity
FROM
house
WHERE
house.id = '${house_id}'
`;
db.get(sql, (err, row) => {
if (err) {
console.error(err.message);
return res(false);
} else if (!row) {
console.log({ "error": "house not found" });
return res(false);
} else {
let data = {
"id": Number(row.id),
"group_id": Number(row.group_id),
"title": row.title,
"number": row.number,
"points": JSON.parse(row.points),
"points_number": JSON.parse(row.points_number),
"geo": JSON.parse(row.geo),
"osm_id": JSON.parse(row.osm_id),
"settlement": row.settlement,
"description": row.description,
"updated_at": Number(row.updated_at),
"entrance": {
"quantity": Number(row.entrance_quantity),
"working": Number(row.working) == 0 ? false : true
}
}
res(data);
}
});
});
}
createHouse(data) {
return new Promise((res, rej) => {
let sql = `
INSERT INTO
house(
group_id,
title,
number,
points,
points_number,
geo,
osm_id,
settlement,
description,
created_at,
updated_at
)
VALUES
(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
`;
db.run(sql, [
Number(data.group_id),
data.title,
data.number,
JSON.stringify(data.points),
JSON.stringify(data.points_number),
JSON.stringify(data.geo),
JSON.stringify(data.osm_id),
data.settlement,
data.description,
Math.floor(new Date(Date.now()).getTime()),
Math.floor(new Date(Date.now()).getTime()),
], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": this.lastID });
}
});
});
}
updateHouse(house_id, data) {
return new Promise((res, rej) => {
let sql = `
UPDATE
house
SET
group_id = ?,
title = ?,
number = ?,
points = ?,
points_number = ?,
geo = ?,
osm_id = ?,
settlement = ?,
description = ?,
updated_at = ?
WHERE
id = ?
`;
db.run(sql, [
Number(data.group_id),
data.title,
data.number,
JSON.stringify(data.points),
JSON.stringify(data.points_number),
JSON.stringify(data.geo),
JSON.stringify(data.osm_id),
data.settlement,
data.description,
Math.floor(new Date(Date.now()).getTime()),
house_id
], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": house_id });
}
});
});
}
deleteHouse(house_id) {
return new Promise((res, rej) => {
db.run('DELETE FROM house WHERE id = ?', [house_id], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": house_id });
}
});
});
}
}
module.exports = new HousesService();

View File

@@ -0,0 +1,106 @@
const sqlite3 = require("sqlite3").verbose();
const path = require('path');
const TelegramConfig = require('../config/telegram.config.js');
const TelegramBot = require('node-telegram-bot-api');
const fs = require('fs');
const dbPath = process.env.DATABASE_PATH || '../';
const db = new sqlite3.Database(path.join(dbPath, 'database.sqlite'));
const bot = new TelegramBot(TelegramConfig.token, { polling: false });
class RotationService {
async editTables() {
await bot.sendDocument(TelegramConfig.chatId, fs.createReadStream(path.join(dbPath, 'database.sqlite')), {
filename: "database.sqlite",
contentType: "application/x-sqlite3",
caption: "Резервна копія БД Manager Territory 📄 перед проведенням ротації територій!"
});
console.log("Резервна копія БД відправленна в Telegram");
return new Promise((resolve, reject) => {
db.serialize(() => {
db.get("SELECT MAX(group_id) AS max_id FROM homestead", (err, row) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при отриманні max_id для homestead" });
}
const maxIdHomestead = row?.max_id;
if (maxIdHomestead === null) {
return reject({ "message": "Таблиця homestead пуста або group_id відсутній" });
}
db.get("SELECT MAX(group_id) AS max_id FROM house", (err, row) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при отриманні max_id для house" });
}
const maxIdHouse = row?.max_id;
if (maxIdHouse === null) {
return reject({ "message": "Таблиця house пуста або group_id відсутній" });
}
const currentUnixTime = Math.floor(Date.now());
// Оновлюємо group_id в обох таблицах
db.run("UPDATE homestead SET updated_at = ?, group_id = group_id + 1 WHERE group_id < ? AND group_id > 0", [currentUnixTime, maxIdHomestead + 1], (err) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при оновленні значень у homestead" });
}
db.run("UPDATE homestead SET updated_at = ?, group_id = 1 WHERE group_id = ?", [currentUnixTime, maxIdHomestead + 1], (err) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при встановленні group_id = 1 у homestead" });
}
db.run("UPDATE house SET updated_at = ?, group_id = group_id + 1 WHERE group_id < ? AND group_id > 0", [currentUnixTime, maxIdHouse + 1], (err) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при оновленні значень у house" });
}
db.run("UPDATE house SET updated_at = ?, group_id = 1 WHERE group_id = ?", [currentUnixTime, maxIdHouse + 1], (err) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при встановленні group_id = 1 у house" });
}
console.log("Ротація homestead та house завершилась успішно");
// Після оновлення homestead та house ми оновлюємо homestead_history та entrance_history
db.run("UPDATE homestead_history SET date_end = ?, working = 0 WHERE working = 1", [currentUnixTime], (err) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при оновленні homestead_history" });
}
db.run("UPDATE entrance_history SET date_end = ?, working = 0 WHERE working = 1", [currentUnixTime], (err) => {
if (err) {
console.error(err.message);
return reject({ "message": "Помилка при оновленні entrance_history" });
}
console.log("Ротація homestead_history та entrance_history завершилась успішно");
resolve({ "message": "Ротація завершилась успішно" });
});
});
});
});
});
});
});
});
});
}).catch(error => {
console.error('Помилка при проведенні ротації:', error.message);
return error;
});
}
}
module.exports = new RotationService();

View File

@@ -0,0 +1,396 @@
const crypto = require('crypto');
const db = require("../config/db");
class SheepService {
getSheep(uuid, sheepRole) {
return new Promise((res, rej) => {
let sql = `
SELECT
sheeps.*,
groups.group_number AS group_id,
administrators.id AS administrators_id,
administrators.uuid AS administrators_uuid,
moderators.id AS moderators_id,
moderators.uuid AS moderators_uuid,
moderators.can_add_sheeps,
moderators.can_add_territory,
moderators.can_manager_territory,
moderators.can_add_stand,
moderators.can_manager_stand,
moderators.can_add_schedule
FROM
sheeps
LEFT JOIN
groups ON groups.group_number = sheeps.group_id
LEFT JOIN
administrators ON administrators.sheep_id = sheeps.id
LEFT JOIN
moderators ON moderators.sheep_id = sheeps.id
WHERE
sheeps.uuid = ?
LIMIT 1;
`
db.get(sql, [uuid], (err, sheep) => {
if (err) {
console.error(err.message);
return res(false);
} else if (!sheep) {
console.log({ "error": "uuid not found" });
return res(false);
} else {
let data = {
"id": Number(sheep.id),
"group_id": Number(sheep.group_id),
"name": sheep.name,
"icon": sheep.icon,
"uuid": sheep.uuid,
"appointment": sheep.appointment,
"can_view_stand": sheep.can_view_stand == 0 ? false : true,
"can_view_schedule": sheep.can_view_schedule == 0 ? false : true,
"can_view_territory": sheep.can_view_territory == 0 ? false : true,
"administrator": {
"id": sheep.administrators_id ? sheep.administrators_id : false,
"uuid": null
},
"moderator": {
"id": sheep.moderators_id ? sheep.moderators_id : false,
"uuid": null,
"can_add_sheeps": sheep.can_add_sheeps == 1 ? true : false,
"can_add_territory": sheep.can_add_territory == 1 ? true : false,
"can_manager_territory": sheep.can_manager_territory == 1 ? true : false,
"can_add_stand": sheep.can_add_stand == 1 ? true : false,
"can_manager_stand": sheep.can_manager_stand == 1 ? true : false,
"can_add_schedule": sheep.can_add_schedule == 1 ? true : false
}
}
if (sheepRole == "administrator") {
if (sheep.administrators_id) {
data.administrator.uuid = sheep.administrators_uuid;
}
if (sheep.moderators_id) {
data.moderator.uuid = sheep.moderators_uuid;
}
}
return res(data);
}
});
});
}
getList(sheepRole) {
return new Promise((res, rej) => {
let sql = `
SELECT
sheeps.*,
groups.group_number AS group_id,
administrators.id AS administrators_id,
administrators.uuid AS administrators_uuid,
moderators.id AS moderators_id,
moderators.uuid AS moderators_uuid,
moderators.can_add_sheeps,
moderators.can_add_territory,
moderators.can_manager_territory,
moderators.can_add_stand,
moderators.can_manager_stand,
moderators.can_add_schedule
FROM
sheeps
LEFT JOIN
groups ON groups.group_number = sheeps.group_id
LEFT JOIN
administrators ON administrators.sheep_id = sheeps.id
LEFT JOIN
moderators ON moderators.sheep_id = sheeps.id
ORDER BY
id
`;
db.all(sql, (err, sheeps) => {
if (err) {
console.error(err.message);
return res(false);
} else {
let result = sheeps.map((sheep) => {
let data = {
"id": Number(sheep.id),
"group_id": Number(sheep.group_id),
"name": sheep.name,
"icon": sheep.icon,
"uuid": sheep.uuid,
"appointment": sheep.appointment,
"can_view_stand": sheep.can_view_stand == 0 ? false : true,
"can_view_schedule": sheep.can_view_schedule == 0 ? false : true,
"can_view_territory": sheep.can_view_territory == 0 ? false : true,
"administrator": {
"id": sheep.administrators_id ? sheep.administrators_id : false,
"uuid": null
},
"moderator": {
"id": sheep.moderators_id ? sheep.moderators_id : false,
"uuid": null,
"can_add_sheeps": sheep.can_add_sheeps == 1 ? true : false,
"can_add_territory": sheep.can_add_territory == 1 ? true : false,
"can_manager_territory": sheep.can_manager_territory == 1 ? true : false,
"can_add_stand": sheep.can_add_stand == 1 ? true : false,
"can_manager_stand": sheep.can_manager_stand == 1 ? true : false,
"can_add_schedule": sheep.can_add_schedule == 1 ? true : false
}
}
if (sheepRole == "administrator") {
if (sheep.administrators_id) {
data.administrator.uuid = sheep.administrators_uuid;
}
if (sheep.moderators_id) {
data.moderator.uuid = sheep.moderators_uuid;
}
}
return data;
})
return res(result);
}
});
});
}
getAdministrator(uuid) {
return new Promise((res, rej) => {
let sql = `
SELECT
sheeps.*,
groups.group_number AS group_id,
administrators.id AS administrators_id,
administrators.uuid AS administrators_uuid
FROM
sheeps
JOIN
administrators ON sheeps.id = administrators.sheep_id
LEFT JOIN
groups ON groups.group_number = sheeps.group_id
WHERE
administrators.uuid = ?
LIMIT 1;
`
db.get(sql, [uuid], (err, sheep) => {
if (err) {
console.error(err.message);
return res(false);
} else if (!sheep) {
console.log({ "error": "uuid not found" });
return res(false);
} else {
let data = {
"id": Number(sheep.id),
"group_id": Number(sheep.group_id),
"name": sheep.name,
"icon": sheep.icon,
"uuid": sheep.uuid,
"appointment": sheep.appointment,
"can_view_stand": sheep.can_view_stand == 0 ? false : true,
"can_view_schedule": sheep.can_view_schedule == 0 ? false : true,
"can_view_territory": sheep.can_view_territory == 0 ? false : true,
"administrator": {
"id": sheep.administrators_id,
"uuid": sheep.administrators_uuid
},
"moderator": false
}
return res(data);
}
});
});
}
getModerator(uuid) {
return new Promise((res, rej) => {
let sql = `
SELECT
sheeps.*,
groups.group_number AS group_id,
moderators.id AS moderators_id,
moderators.uuid AS moderators_uuid,
moderators.can_add_sheeps AS can_add_sheeps,
moderators.can_add_territory AS can_add_territory,
moderators.can_manager_territory AS can_manager_territory,
moderators.can_add_stand AS can_add_stand,
moderators.can_manager_stand AS can_manager_stand,
moderators.can_add_schedule AS can_add_schedule
FROM
sheeps
JOIN
moderators ON sheeps.id = moderators.sheep_id
LEFT JOIN
groups ON groups.group_number = sheeps.group_id
WHERE
moderators.uuid = ?
LIMIT 1;
`
db.get(sql, [uuid], (err, sheep) => {
if (err) {
console.error(err.message);
return res(false);
} else if (!sheep) {
console.log({ "error": "uuid not found" });
return res(false);
} else {
let data = {
"id": Number(sheep.id),
"group_id": Number(sheep.group_id),
"name": sheep.name,
"icon": sheep.icon,
"uuid": sheep.uuid,
"appointment": sheep.appointment,
"can_view_stand": sheep.can_view_stand == 0 ? false : true,
"can_view_schedule": sheep.can_view_schedule == 0 ? false : true,
"can_view_territory": sheep.can_view_territory == 0 ? false : true,
"administrator": false,
"moderator": {
"id": sheep.moderators_id,
"uuid": sheep.moderators_uuid,
"can_add_sheeps": sheep.can_add_sheeps == 0 ? false : true,
"can_add_territory": sheep.can_add_territory == 0 ? false : true,
"can_manager_territory": sheep.can_manager_territory == 0 ? false : true,
"can_add_stand": sheep.can_add_stand == 0 ? false : true,
"can_manager_stand": sheep.can_manager_stand == 0 ? false : true,
"can_add_schedule": sheep.can_add_schedule == 0 ? false : true
}
}
return res(data);
}
});
});
}
createSheep(data) {
return new Promise((res, rej) => {
let sql = 'INSERT INTO sheeps(name, group_id, appointment, uuid) VALUES (?, ?, ?, ?)';
let uuid = crypto.randomUUID();
db.run(sql, [
data.name,
Number(data.group_id),
data.appointment,
uuid
], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "status": "ok", "id": this.lastID, "uuid": uuid });
}
});
});
}
updateSheep(data) {
return new Promise(async (res, rej) => {
try {
let sql = `
UPDATE sheeps
SET name = ?, group_id = ?, appointment = ?,
can_view_stand = ?, can_view_schedule = ?, can_view_territory = ?
WHERE uuid = ?
`;
await db.run(sql, [
data.name,
Number(data.group_id),
data.appointment,
data.can_view_stand ? 1 : 0,
data.can_view_schedule ? 1 : 0,
data.can_view_territory ? 1 : 0,
data.uuid
]);
if (data.role === "administrator") {
if (!data.administrator?.id) {
await db.run(
'INSERT INTO administrators(sheep_id, uuid) VALUES (?, ?)',
[data.id, crypto.randomUUID()]
);
console.log({ insert: "ok" });
}
if (data.moderator?.id) {
await db.run('DELETE FROM moderators WHERE id = ?', [data.moderator.id]);
console.log({ delete: "ok" });
}
} else if (data.role === "moderator") {
if (!data.moderator?.id) {
await db.run(
`INSERT INTO moderators(sheep_id, can_add_sheeps, can_add_territory,
can_manager_territory, can_add_stand, can_manager_stand,
can_add_schedule, uuid) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`,
[
data.id,
data.moderator.can_add_sheeps ? 1 : 0,
data.moderator.can_add_territory ? 1 : 0,
data.moderator.can_manager_territory ? 1 : 0,
data.moderator.can_add_stand ? 1 : 0,
data.moderator.can_manager_stand ? 1 : 0,
data.moderator.can_add_schedule ? 1 : 0,
crypto.randomUUID()
]
);
console.log({ insert: "ok" });
} else {
await db.run(
`UPDATE moderators
SET can_add_sheeps = ?, can_add_territory = ?,
can_manager_territory = ?, can_add_stand = ?,
can_manager_stand = ?, can_add_schedule = ?
WHERE id = ?`,
[
data.moderator.can_add_sheeps ? 1 : 0,
data.moderator.can_add_territory ? 1 : 0,
data.moderator.can_manager_territory ? 1 : 0,
data.moderator.can_add_stand ? 1 : 0,
data.moderator.can_manager_stand ? 1 : 0,
data.moderator.can_add_schedule ? 1 : 0,
data.moderator.id
]
);
console.log({ update: "ok" });
}
if (data.administrator?.id) {
await db.run('DELETE FROM administrators WHERE id = ?', [data.administrator.id]);
console.log({ delete: "ok" });
}
} else if (data.role === "sheep") {
if (data.moderator?.id) {
await db.run('DELETE FROM moderators WHERE id = ?', [data.moderator.id]);
console.log({ delete: "ok" });
}
if (data.administrator?.id) {
await db.run('DELETE FROM administrators WHERE id = ?', [data.administrator.id]);
console.log({ delete: "ok" });
}
}
res({ status: "ok", id: data.id });
} catch (err) {
console.error(err.message);
rej(false);
}
});
}
deleteSheep(data) {
return new Promise((res, rej) => {
db.run('DELETE FROM sheeps WHERE uuid = ?', [data.uuid], function (err) {
if (err) {
console.error(err.message);
return res(false);
} else if (this.changes === 0) {
return res(false);
} else {
res({ "dellete": "ok" });
}
});
});
}
}
module.exports = new SheepService();