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

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

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

View File

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