v0.0.1
This commit is contained in:
102
api/services/apartments.service.js
Normal file
102
api/services/apartments.service.js
Normal 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();
|
||||
84
api/services/auth.service.js
Normal file
84
api/services/auth.service.js
Normal 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();
|
||||
240
api/services/constructor.service.js
Normal file
240
api/services/constructor.service.js
Normal 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();
|
||||
158
api/services/entrances.service.js
Normal file
158
api/services/entrances.service.js
Normal 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();
|
||||
105
api/services/history.entrance.service.js
Normal file
105
api/services/history.entrance.service.js
Normal 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();
|
||||
103
api/services/history.homestead.service.js
Normal file
103
api/services/history.homestead.service.js
Normal 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();
|
||||
260
api/services/homesteads.service.js
Normal file
260
api/services/homesteads.service.js
Normal 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();
|
||||
233
api/services/houses.service.js
Normal file
233
api/services/houses.service.js
Normal 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();
|
||||
106
api/services/rotation.service.js
Normal file
106
api/services/rotation.service.js
Normal 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();
|
||||
396
api/services/sheeps.service.js
Normal file
396
api/services/sheeps.service.js
Normal 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();
|
||||
Reference in New Issue
Block a user