Files
2023-09-15 13:37:12 +05:00

898 lines
22 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
import express, { json } from "express";
import cors from "cors";
import mongoose from "mongoose";
import nodemailer from "nodemailer";
import Mail from "./models/Mail.js";
const app = express();
const port = 3000;
app.use(cors());
app.use(json());
app.get("/", (req, res) => {
res.json({ ok: 1 });
});
app.get("/regions", async (req, res) => {
let regions = [
{
name: "Центральный ФО",
regions: [
{ id: 31, name: "Белгородская область" },
{ id: 32, name: "Брянская область" },
{ id: 33, name: "Владимирская область" },
{ id: 36, name: "Воронежская область" },
{ id: 37, name: "Ивановская область" },
{ id: 40, name: "Калужская область" },
{ id: 44, name: "Костромская область" },
{ id: 46, name: "Курская область" },
{ id: 48, name: "Липецкая область" },
{ id: 50, name: "Московская область" },
{ id: 57, name: "Орловская область" },
{ id: 62, name: "Рязанская область" },
{ id: 67, name: "Смоленская область" },
{ id: 68, name: "Тамбовская область" },
{ id: 69, name: "Тверская область" },
{ id: 71, name: "Тульская область" },
{ id: 76, name: "Ярославская область" },
{ id: 77, name: "Город Москва" },
],
},
{
name: "Северо-Западный ФО",
regions: [
{ id: 10, name: "Республика Карелия" },
{ id: 11, name: "Республика Коми" },
{ id: 29, name: "Архангельская область" },
{ id: 35, name: "Вологодская область" },
{ id: 39, name: "Калининградская область" },
{ id: 47, name: "Ленинградская область" },
{ id: 51, name: "Мурманская область" },
{ id: 53, name: "Новгородская область" },
{ id: 60, name: "Псковская область" },
{ id: 78, name: "Город Санкт-Петербург" },
{ id: 83, name: "Ненецкий АО" },
],
},
{
name: "Южный ФО",
regions: [
{ id: 1, name: "Республика Адыгея" },
{ id: 8, name: "Республика Калмыкия" },
{ id: 23, name: "Краснодарский край" },
{ id: 30, name: "Астраханская область" },
{ id: 34, name: "Волгоградская область" },
{ id: 61, name: "Ростовская область" },
{ id: 91, name: "Республика Крым" },
{ id: 92, name: "Город Севастополь" },
],
},
{
name: "Северо-Кавказский ФО",
regions: [
{ id: 5, name: "Республика Дагестан" },
{ id: 6, name: "Республика Ингушетия" },
{ id: 7, name: "Кабардино-Балкарская Республика" },
{ id: 9, name: "Карачаево-Черкесская Республика" },
{ id: 15, name: "Республика Северная Осетия" },
{ id: 20, name: "Чеченская Республика" },
{ id: 26, name: "Ставропольский край" },
],
},
{
name: "Приволжский ФО",
regions: [
{ id: 2, name: "Республика Башкортостан" },
{ id: 12, name: "Республика Марий Эл" },
{ id: 13, name: "Республика Мордовия" },
{ id: 16, name: "Республика Татарстан" },
{ id: 18, name: "Удмуртская Республика" },
{ id: 21, name: "Чувашская Республика" },
{ id: 43, name: "Кировская область" },
{ id: 52, name: "Нижегородская область" },
{ id: 56, name: "Оренбургская область" },
{ id: 58, name: "Пензенская область" },
{ id: 59, name: "Пермский край" },
{ id: 63, name: "Самарская область" },
{ id: 64, name: "Саратовская область" },
{ id: 73, name: "Ульяновская область" },
],
},
{
name: "Уральский ФО",
regions: [
{ id: 45, name: "Курганская область" },
{ id: 66, name: "Свердловская область" },
{ id: 72, name: "Тюменская область" },
{ id: 74, name: "Челябинская область" },
{ id: 86, name: "Ханты-Мансийский АО - Югра" },
{ id: 89, name: "Ямало-Ненецкий АО" },
],
},
{
name: "Сибирский ФО",
regions: [
{ id: 4, name: "Республика Алтай" },
{ id: 17, name: "Республика Тыва" },
{ id: 19, name: "Республика Хакасия" },
{ id: 22, name: "Алтайский край" },
{ id: 24, name: "Красноярский край" },
{ id: 38, name: "Иркутская область" },
{ id: 42, name: "Кемеровская область - Кузбасс" },
{ id: 54, name: "Новосибирская область" },
{ id: 55, name: "Омская область" },
{ id: 70, name: "Томская область" },
],
},
{
name: "Дальневосточный ФО",
regions: [
{ id: 3, name: "Республика Бурятия" },
{ id: 14, name: "Республика Саха (Якутия)" },
{ id: 25, name: "Приморский край" },
{ id: 27, name: "Хабаровский край" },
{ id: 28, name: "Амурская область" },
{ id: 41, name: "Камчатский край" },
{ id: 49, name: "Магаданская область" },
{ id: 65, name: "Сахалинская область" },
{ id: 75, name: "Забайкальский край" },
{ id: 79, name: "Еврейская АО" },
{ id: 87, name: "Чукотский АО" },
],
},
];
regions = regions
.map((item) => item.regions)
.flat()
.sort((a, b) => (a.name > b.name ? 1 : -1))
.filter((region) => {
if (![79, 41, 51, 83, 6, 87].includes(region.id)) {
return region;
}
});
res.json(regions);
});
app.get("/region/:id", async (req, res) => {
const regionsData = [
{
id: 1,
totalArea: 328326.4,
flatCount: 7433,
priceAvg: 71655,
objSquareLivingAmt: 328326.36,
objCnt: 49,
},
{
id: 2,
totalArea: 2667309.0,
flatCount: 55441,
priceAvg: 98441,
objSquareLivingAmt: 2667646.9,
objCnt: 247,
},
{
id: 3,
totalArea: 384171.1,
flatCount: 6932,
priceAvg: 70582,
objSquareLivingAmt: 384171.07,
objCnt: 62,
},
{
id: 4,
totalArea: 51068.6,
flatCount: 1132,
priceAvg: 89784,
objSquareLivingAmt: 51068.63,
objCnt: 11,
},
{
id: 5,
totalArea: 283714.4,
flatCount: 4571,
priceAvg: 34194,
objSquareLivingAmt: 283714.37,
objCnt: 33,
},
// {
// id: 6,
// totalArea: 31057.6,
// flatCount: 376,
// "objSquareLivingAmt": 31057.63,
// "objCnt": 4,
// },
{
id: 7,
totalArea: 302164.8,
flatCount: 4254,
priceAvg: 62048,
objSquareLivingAmt: 302164.81,
objCnt: 69,
},
{
id: 8,
totalArea: 40553.1,
flatCount: 676,
priceAvg: 52949,
objSquareLivingAmt: 40553.11,
objCnt: 9,
},
{
id: 9,
totalArea: 66177.7,
flatCount: 1025,
priceAvg: 73179,
objSquareLivingAmt: 66177.73,
objCnt: 6,
},
{
id: 10,
totalArea: 169525.7,
flatCount: 3441,
priceAvg: 107511,
objSquareLivingAmt: 169525.71,
objCnt: 26,
},
{
id: 11,
totalArea: 83689.5,
flatCount: 2005,
priceAvg: 80559,
objSquareLivingAmt: 83689.47,
objCnt: 9,
},
{
id: 12,
totalArea: 313555.9,
flatCount: 5252,
priceAvg: 62782,
objSquareLivingAmt: 313555.87,
objCnt: 51,
},
{
id: 13,
totalArea: 187186.1,
flatCount: 3609,
priceAvg: 72793,
objSquareLivingAmt: 187186.12,
objCnt: 25,
},
{
id: 14,
totalArea: 395419.9,
flatCount: 7983,
priceAvg: 120368,
objSquareLivingAmt: 395419.87,
objCnt: 55,
},
{
id: 15,
totalArea: 314864.7,
flatCount: 4873,
priceAvg: 71655,
objSquareLivingAmt: 314864.74,
objCnt: 50,
},
{
id: 16,
totalArea: 2270183.8,
flatCount: 44495,
priceAvg: 135012,
objSquareLivingAmt: 2270183.83,
objCnt: 234,
},
{
id: 17,
totalArea: 92368.1,
flatCount: 2082,
priceAvg: 123219,
objSquareLivingAmt: 92368.12,
objCnt: 29,
},
{
id: 18,
totalArea: 1515583.9,
flatCount: 30624,
priceAvg: 82633,
objSquareLivingAmt: 328326.36,
objCnt: 49,
},
{
id: 19,
totalArea: 272158.0,
flatCount: 5265,
priceAvg: 67283,
objSquareLivingAmt: 272157.99,
objCnt: 50,
},
{
id: 20,
totalArea: 244186.6,
flatCount: 3465,
priceAvg: 57603,
objSquareLivingAmt: 244186.6,
objCnt: 12,
},
{
id: 21,
totalArea: 727391.5,
flatCount: 12551,
priceAvg: 74907,
objSquareLivingAmt: 727391.49,
objCnt: 94,
},
{
id: 22,
totalArea: 595249.9,
flatCount: 11996,
priceAvg: 82778,
objSquareLivingAmt: 595249.94,
objCnt: 71,
},
{
id: 23,
totalArea: 8316302.2,
flatCount: 184301,
priceAvg: 118376,
objSquareLivingAmt: 8316302.17,
objCnt: 735,
},
{
id: 24,
totalArea: 1548047.8,
flatCount: 28193,
priceAvg: 98763,
objSquareLivingAmt: 1548047.81,
objCnt: 108,
},
{
id: 25,
totalArea: 2191066.9,
flatCount: 43965,
priceAvg: 133366,
objSquareLivingAmt: 2191066.88,
objCnt: 284,
},
{
id: 26,
totalArea: 1303948.2,
flatCount: 24103,
priceAvg: 79643,
objSquareLivingAmt: 1303948.21,
objCnt: 168,
},
{
id: 27,
totalArea: 894343.7,
flatCount: 16806,
priceAvg: 109923,
objSquareLivingAmt: 894343.67,
objCnt: 107,
},
{
id: 28,
totalArea: 268490.4,
flatCount: 5627,
priceAvg: 130501,
objSquareLivingAmt: 268490.39,
objCnt: 46,
},
{
id: 29,
totalArea: 485896.2,
flatCount: 11015,
priceAvg: 101319,
objSquareLivingAmt: 485896.18,
objCnt: 74,
},
{
id: 30,
totalArea: 521433.7,
flatCount: 10353,
priceAvg: 95551,
objSquareLivingAmt: 521433.67,
objCnt: 44,
},
{
id: 31,
totalArea: 301602.6,
flatCount: 5916,
priceAvg: 86137,
objSquareLivingAmt: 301602.61,
objCnt: 66,
},
{
id: 32,
totalArea: 410642.1,
flatCount: 7010,
priceAvg: 59869,
objSquareLivingAmt: 410642.1,
objCnt: 56,
},
{
id: 33,
totalArea: 728408.1,
flatCount: 13023,
priceAvg: 54047,
objSquareLivingAmt: 728408.08,
objCnt: 97,
},
{
id: 34,
totalArea: 929572.5,
flatCount: 18003,
priceAvg: 76183,
objSquareLivingAmt: 929572.53,
objCnt: 126,
},
{
id: 35,
totalArea: 623014.5,
flatCount: 12220,
priceAvg: 54415,
objSquareLivingAmt: 623014.54,
objCnt: 119,
},
{
id: 36,
totalArea: 1937243.4,
flatCount: 40193,
priceAvg: 76931,
objSquareLivingAmt: 1937243.38,
objCnt: 149,
},
{
id: 37,
totalArea: 316507.6,
flatCount: 5442,
priceAvg: 59796,
objSquareLivingAmt: 316507.64,
objCnt: 48,
},
{
id: 38,
totalArea: 785409.3,
flatCount: 15338,
priceAvg: 102540,
objSquareLivingAmt: 785409.27,
objCnt: 155,
},
{
id: 39,
totalArea: 1203847.6,
flatCount: 21650,
priceAvg: 87364,
objSquareLivingAmt: 1203847.68,
objCnt: 167,
},
{
id: 40,
totalArea: 415127.4,
flatCount: 7503,
priceAvg: 87725,
objSquareLivingAmt: 415127.41,
objCnt: 53,
},
// {
// id: 41,
// totalArea: 121973.3,
// flatCount: 1906,
// "objSquareLivingAmt": 121973.3,
// "objCnt": 12,
// },
{
id: 42,
totalArea: 573204.1,
flatCount: 11113,
priceAvg: 71425,
objSquareLivingAmt: 573204.09,
objCnt: 79,
},
{
id: 43,
totalArea: 337445.1,
flatCount: 6655,
priceAvg: 80492,
objSquareLivingAmt: 337445.09,
objCnt: 54,
},
{
id: 44,
totalArea: 163623.3,
flatCount: 2953,
priceAvg: 67385,
objSquareLivingAmt: 163623.29,
objCnt: 58,
},
{
id: 45,
totalArea: 233679.6,
flatCount: 4447,
priceAvg: 62972,
objSquareLivingAmt: 233679.61,
objCnt: 43,
},
{
id: 46,
totalArea: 295893.8,
flatCount: 5469,
priceAvg: 89784,
objSquareLivingAmt: 295893.85,
objCnt: 42,
},
{
id: 47,
totalArea: 3294300.7,
flatCount: 82121,
priceAvg: 133977,
objSquareLivingAmt: 3294300.7,
objCnt: 266,
},
{
id: 48,
totalArea: 454826.8,
flatCount: 7783,
priceAvg: 69140,
objSquareLivingAmt: 454826.77,
objCnt: 73,
},
{
id: 49,
totalArea: 3186.8,
flatCount: 58,
priceAvg: 85363,
objSquareLivingAmt: 3186.83,
objCnt: 1,
},
{
id: 50,
totalArea: 8218500.2,
flatCount: 178738,
priceAvg: 148558,
objSquareLivingAmt: 8218500.37,
objCnt: 622,
},
{
id: 51,
totalArea: 5271.4,
flatCount: 100,
priceAvg: 70602,
objSquareLivingAmt: 5271.4,
objCnt: 1,
},
{
id: 52,
totalArea: 1147532.2,
flatCount: 21682,
priceAvg: 106487,
objSquareLivingAmt: 1147532.16,
objCnt: 131,
},
{
id: 53,
totalArea: 77383.8,
flatCount: 1450,
priceAvg: 71014,
objSquareLivingAmt: 77383.75,
objCnt: 13,
},
{
id: 54,
totalArea: 3465916.9,
flatCount: 68169,
priceAvg: 106530,
objSquareLivingAmt: 3468482.46,
objCnt: 514,
},
{
id: 55,
totalArea: 552013.5,
flatCount: 10068,
priceAvg: 84691,
objSquareLivingAmt: 552013.51,
objCnt: 64,
},
{
id: 56,
totalArea: 438084.8,
flatCount: 8975,
priceAvg: 66808,
objSquareLivingAmt: 438085.17,
objCnt: 57,
},
{
id: 57,
totalArea: 311673.4,
flatCount: 5381,
priceAvg: 34194,
objSquareLivingAmt: 311673.43,
objCnt: 27,
},
{
id: 58,
totalArea: 1257497.0,
flatCount: 23172,
priceAvg: 74291,
objSquareLivingAmt: 1257497.04,
objCnt: 98,
},
{
id: 59,
totalArea: 1656401.4,
flatCount: 33743,
priceAvg: 101629,
objSquareLivingAmt: 1656401.38,
objCnt: 140,
},
{
id: 60,
totalArea: 218481.0,
flatCount: 4233,
priceAvg: 59133,
objSquareLivingAmt: 218481.01,
objCnt: 38,
},
{
id: 61,
totalArea: 2790815.6,
flatCount: 57789,
priceAvg: 94335,
objSquareLivingAmt: 2790815.55,
objCnt: 254,
},
{
id: 62,
totalArea: 1122750.6,
flatCount: 22772,
priceAvg: 76168,
objSquareLivingAmt: 1122750.59,
objCnt: 77,
},
{
id: 63,
totalArea: 2082471.7,
flatCount: 37726,
priceAvg: 82324,
objSquareLivingAmt: 2082471.74,
objCnt: 197,
},
{
id: 64,
totalArea: 638664.9,
flatCount: 11982,
priceAvg: 59320,
objSquareLivingAmt: 638664.92,
objCnt: 82,
},
{
id: 65,
totalArea: 277718.5,
flatCount: 5418,
priceAvg: 153297,
objSquareLivingAmt: 277718.51,
objCnt: 49,
},
{
id: 66,
totalArea: 4051855.4,
flatCount: 85142,
priceAvg: 110720,
objSquareLivingAmt: 4051855.37,
objCnt: 325,
},
{
id: 67,
totalArea: 325201.7,
flatCount: 5895,
priceAvg: 53924,
objSquareLivingAmt: 325201.67,
objCnt: 59,
},
{
id: 68,
totalArea: 305018.1,
flatCount: 5691,
priceAvg: 61498,
objSquareLivingAmt: 305018.06,
objCnt: 46,
},
{
id: 69,
totalArea: 467081.2,
flatCount: 8962,
priceAvg: 79237,
objSquareLivingAmt: 467081.17,
objCnt: 82,
},
{
id: 70,
totalArea: 281391.0,
flatCount: 5551,
priceAvg: 104611,
objSquareLivingAmt: 281391.03,
objCnt: 64,
},
{
id: 71,
totalArea: 992802.1,
flatCount: 20633,
priceAvg: 89967,
objSquareLivingAmt: 992802.07,
objCnt: 129,
},
{
id: 72,
totalArea: 3115076.8,
flatCount: 60096,
priceAvg: 100219,
objSquareLivingAmt: 3115076.85,
objCnt: 275,
},
{
id: 73,
totalArea: 437822.7,
flatCount: 9120,
priceAvg: 75329,
objSquareLivingAmt: 437822.72,
objCnt: 61,
},
{
id: 74,
totalArea: 1044332.8,
flatCount: 20379,
priceAvg: 78438,
objSquareLivingAmt: 1044332.82,
objCnt: 121,
},
{
id: 75,
totalArea: 163028.2,
flatCount: 3388,
priceAvg: 129153,
objSquareLivingAmt: 163028.15,
objCnt: 23,
},
{
id: 76,
totalArea: 656699.4,
flatCount: 12248,
priceAvg: 77390,
objSquareLivingAmt: 656699.39,
objCnt: 101,
},
{
id: 77,
totalArea: 16322256.6,
flatCount: 309477,
priceAvg: 295872,
objSquareLivingAmt: 1.632225665e7,
objCnt: 703,
},
{
id: 78,
totalArea: 7370217.2,
flatCount: 170718,
priceAvg: 202300,
objSquareLivingAmt: 7370217.18,
objCnt: 436,
},
{
id: 79,
totalArea: 2146.0,
flatCount: 50,
priceAvg: 62048,
objSquareLivingAmt: 2145.95,
objCnt: 1,
},
{
id: 86,
totalArea: 439174.3,
flatCount: 7860,
priceAvg: 109173,
objSquareLivingAmt: 439174.26,
objCnt: 48,
},
{
id: 89,
totalArea: 152761.8,
flatCount: 3062,
priceAvg: 144671,
objSquareLivingAmt: 152761.83,
objCnt: 38,
},
{
id: 91,
totalArea: 882872.1,
flatCount: 18151,
priceAvg: 95417,
objSquareLivingAmt: 882872.05,
objCnt: 163,
},
{
id: 92,
totalArea: 112259.8,
flatCount: 2367,
priceAvg: 135839,
objSquareLivingAmt: 112259.82,
objCnt: 19,
},
];
try {
const { totalArea, flatCount, priceAvg, objSquareLivingAmt, objCnt } =
regionsData.find((item) => item.id == req.params.id);
const avgApartmentArea = Math.round(totalArea / flatCount);
const price = Math.round(priceAvg / 1000);
const avgAreaInComplex = Math.round(objSquareLivingAmt / objCnt);
res.json({ avgApartmentArea, price, avgAreaInComplex });
} catch (error) {
res.json({ error: 1 });
}
});
app.post("/mail", async (req, res) => {
try {
const referer = req.headers.referer;
const { fullname, email, phone, request } = req.body;
await Mail.create({ fullname, email, phone, request, referer });
// create reusable transporter object using the default SMTP transport
let transporter = nodemailer.createTransport({
host: "mail.netangels.ru",
port: 587,
secure: false, // true for 465, false for other ports
auth: {
user: "test@graff.tech", // generated ethereal user
pass: "ZmL0pKiDFWUyCDMq", // generated ethereal password
},
});
// send mail with defined transport object
let info = await transporter.sendMail({
from: email, // sender address
to: "info@graff.tech", // list of receivers
subject: "Заявка с сайта estate.graff.tech", // Subject line
text: `
Имя Фамилия: ${fullname}
Email: ${email}
Телефон: ${phone}
Текст запроса: ${request}
`, // plain text body
html: `<div>
<p>Имя: ${fullname}</p>
<p>Email: ${email}</p>
<p>Телефон: ${phone}</p>
<p>Текст запроса: ${request}</p>
</div>`, // html body
});
console.log(info);
console.log(req.body);
res.json({ ok: 1 });
} catch (error) {
console.log(error);
res.json({ error: 1 });
}
});
app.listen(port, async () => {
await mongoose.connect(
"mongodb://root:p62Z!ZatgY25@194.26.138.94:27017/",
{ dbName: "estate" },
console.log("DB connection...")
);
console.log(`Server is started on port ${port}...`);
});