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: `

Имя: ${fullname}

Email: ${email}

Телефон: ${phone}

Текст запроса: ${request}

`, // 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}...`); });