169 lines
6.5 KiB
JavaScript
169 lines
6.5 KiB
JavaScript
const db = require("../config/db");
|
|
const genCards = require("../middleware/genCards");
|
|
|
|
class ConstructorService {
|
|
createPack(data) {
|
|
return new Promise((res, rej) => {
|
|
|
|
if (data.type === "house") {
|
|
const sql = `
|
|
INSERT INTO house (
|
|
title, number, points, points_number, geo, osm_id, settlement, created_at
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)`;
|
|
|
|
db.run(sql, [
|
|
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;
|
|
|
|
const entranceStmt = db.prepare(`
|
|
INSERT INTO entrance (
|
|
house_id, entrance_number, title, created_at
|
|
) VALUES (?, ?, ?, ?)`);
|
|
|
|
const apartmentStmt = db.prepare(`
|
|
INSERT INTO apartments (
|
|
entrance_id, apartment_number, title, floors_number
|
|
) VALUES (?, ?, ?, ?)`);
|
|
|
|
let pendingEntrances = data.entrances.length;
|
|
const entranceIdMap = {};
|
|
|
|
if (pendingEntrances === 0) return finalize();
|
|
|
|
// Вставляем подъезды
|
|
data.entrances.forEach(entrance => {
|
|
entranceStmt.run(
|
|
houseId,
|
|
Number(entrance.entrance_number),
|
|
entrance.title,
|
|
Math.floor(Date.now()),
|
|
function (err) {
|
|
if (err) {
|
|
console.error(err.message);
|
|
return res(false);
|
|
}
|
|
|
|
const entranceID = this.lastID;
|
|
entranceIdMap[entrance.entrance_number] = entranceID;
|
|
|
|
// Вставляем квартиры данного подъезда
|
|
let pendingApartments = entrance.apartments.length;
|
|
if (pendingApartments === 0) {
|
|
if (--pendingEntrances === 0) finalize();
|
|
return;
|
|
}
|
|
|
|
entrance.apartments.forEach(apartment => {
|
|
apartmentStmt.run(
|
|
entranceID,
|
|
Number(apartment.apartment_number),
|
|
apartment.title,
|
|
Number(apartment.floors_number),
|
|
function (err) {
|
|
if (err) console.error(err.message);
|
|
|
|
if (--pendingApartments === 0) {
|
|
if (--pendingEntrances === 0) finalize();
|
|
}
|
|
}
|
|
);
|
|
});
|
|
}
|
|
);
|
|
});
|
|
|
|
genCards({type: "house", id: houseId});
|
|
|
|
function finalize() {
|
|
entranceStmt.finalize();
|
|
apartmentStmt.finalize();
|
|
res({ status: "ok", id: houseId });
|
|
}
|
|
});
|
|
|
|
} else if (data.type === "homestead") {
|
|
const sql = `
|
|
INSERT INTO homestead (
|
|
title, number, zoom, points, geo, osm_id, settlement, created_at
|
|
) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
|
|
`;
|
|
|
|
db.run(sql, [
|
|
data.title,
|
|
data.number,
|
|
Number(data.zoom),
|
|
JSON.stringify(data.points),
|
|
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 homesteadId = this.lastID;
|
|
|
|
const buildingStmt = db.prepare(`
|
|
INSERT INTO buildings (
|
|
homestead_id, title, geo
|
|
) VALUES (?, ?, ?)
|
|
`);
|
|
|
|
let pendingBuildings = data.buildings.length;
|
|
|
|
if (pendingBuildings === 0) return finalize();
|
|
|
|
|
|
|
|
data.buildings.forEach(building => {
|
|
buildingStmt.run(
|
|
homesteadId,
|
|
building.title,
|
|
JSON.stringify(building.geo),
|
|
function (err) {
|
|
if (err) {
|
|
console.error(err.message);
|
|
return res(false);
|
|
}
|
|
|
|
if (--pendingBuildings === 0) finalize();
|
|
}
|
|
);
|
|
});
|
|
|
|
genCards({type: "homestead", id: homesteadId});
|
|
|
|
function finalize() {
|
|
buildingStmt.finalize();
|
|
res({ status: "ok", id: homesteadId });
|
|
}
|
|
});
|
|
} else {
|
|
return res(false);
|
|
}
|
|
});
|
|
}
|
|
}
|
|
|
|
module.exports = new ConstructorService(); |