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

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();