Files
IRTH-Touch/server/src/routes/apartments.ts
T

331 lines
8.1 KiB
TypeScript

import { Router } from "express";
import { aparmentsApi, searchApartmentApi } from "../consts.js";
import { logger } from "../utils/logger.js";
interface IApartment {
Floor: number;
Property_Status: string;
Unit_Type: string;
Project_Name: string;
Suite_Area_Sqft: number;
Balcony_Area_Sqft: number;
No_Of_Bedrooms: number;
Unit_No: string;
id: string;
Total_Area_Sqft: number;
No_of_Bathrooms: number;
Property_Name: string;
Unit_View: string;
}
const router = Router();
async function getAllApartments(
page: number,
accessToken: string,
apartments: IApartment[]
) {
const response = await fetch(`${aparmentsApi}&page=${page}&per_page=200`, {
headers: {
Authorization: accessToken,
},
});
const result = await response.json();
if (result?.code && result?.code === "INVALID_TOKEN") {
throw new Error("INVALID_TOKEN");
}
const updatedApartment = apartments.concat([...result.data]);
const isMoreRecords = result.info.more_records;
if (!isMoreRecords) {
return updatedApartment;
}
return await getAllApartments(page + 1, accessToken, updatedApartment);
}
function filterApartments(
apartments: IApartment[],
roveHome?: string[],
apartmentType?: string[],
costBetween?: string[],
totalAreaBetween?: string[],
floorBetween?: string[],
views?: string[]
) {
const filteredApartments = apartments
.filter((apart) => {
// Rove home filter
if (!roveHome || roveHome.length === 0) {
return true;
}
if (roveHome.some((rove) => rove === apart.Project_Name)) {
return true;
}
return false;
})
.filter((apart) => {
// Apartment type filter
if (!apartmentType || apartmentType.length === 0) {
return true;
}
if (apartmentType.some((rove) => rove === apart.Unit_Type)) {
return true;
}
return false;
})
.filter((apart) => {
// Cost between filter еще не доступен тк нет цен
if (!costBetween || costBetween.length === 0) {
return true;
}
const leftCost = Number(costBetween[0]);
const rightCost = Number(costBetween[1]);
return true;
// if (costBetween.some((rove) => rove === apart.Unit_Type)) {
// return true;
// }
// return false;
})
.filter((apart) => {
// Total area filter
if (!totalAreaBetween || totalAreaBetween.length === 0) {
return true;
}
const leftArea = Number(totalAreaBetween[0]);
const rightArea = Number(totalAreaBetween[1]);
if (
(leftArea <= apart.Total_Area_Sqft &&
rightArea >= apart.Total_Area_Sqft) ||
(leftArea >= apart.Total_Area_Sqft &&
rightArea <= apart.Total_Area_Sqft)
) {
return true;
}
return false;
})
.filter((apart) => {
// Views filter
if (!views || views.length === 0) {
return true;
}
//view "Canal" "Amenities"
// Canal / Amenities
// разделение по / с пробелом и без
const apartViews = apart.Unit_View.split(" / ").join("/").split("/");
for (let i = 0; i < apartViews.length; i++) {
// Удаление Corner-
const withoutCorner =
apartViews[i].split("-").length > 1
? apartViews[i].split("-")[1]
: apartViews[i];
//удаление View
const withoutView = withoutCorner.replace(" View", "");
if (views.some((view) => view === withoutView)) {
return true;
}
}
return false;
})
.filter((apart) => {
// Floor filter
if (!floorBetween || floorBetween.length === 0) {
return true;
}
const leftFloor = Number(floorBetween[0]);
const rightFloor = Number(floorBetween[1]);
if (
(leftFloor <= apart.Floor && rightFloor >= apart.Floor) ||
(leftFloor >= apart.Floor && rightFloor <= apart.Floor)
) {
return true;
}
return false;
});
return filteredApartments;
}
router.get("/", async (req, res) => {
const accessToken = req?.headers?.authorization;
const {
per_page = 1000,
page = 1,
rove_home = "",
apartment_type = "",
cost_between = "",
total_area_between = "",
floor_between = "",
views = "",
sort_by = "",
} = req.query;
try {
const roveHomeFilter = (rove_home as string)
.split(",")
.filter((rove) => rove !== "");
const apartmentTypeFilter = (apartment_type as string)
.split(",")
.filter((rove) => rove !== "");
const costBetweenFilter = (cost_between as string)
.split(",")
.filter((cost) => cost !== "");
const totalAreaBetween = (total_area_between as string)
.split(",")
.filter((area) => area !== "");
const viewsFilter = (views as string)
.split(",")
.filter((view) => view !== "");
const floorBetweenFilter = (floor_between as string)
.split(",")
.filter((floor) => floor !== "");
if (!accessToken)
return res
.status(401)
.json({ message: "Отсутсвует access token", code: 401 });
try {
const allApartments = await getAllApartments(1, accessToken, []);
const filteredApartments = filterApartments(
allApartments,
roveHomeFilter,
apartmentTypeFilter,
costBetweenFilter,
totalAreaBetween,
floorBetweenFilter,
viewsFilter
);
const sortedApartments = [...filteredApartments].sort((a, b) => {
if (sort_by === "asc_price") {
return 1;
}
if (sort_by === "decr_price") {
return 1;
}
if (sort_by === "asc_sqr") {
return a.Total_Area_Sqft - b.Total_Area_Sqft;
}
if (sort_by === "asc_floor") {
return a.Floor - b.Floor;
}
return 1;
});
const slicedApartments = sortedApartments.slice(
((page as number) - 1) * (per_page as number),
(per_page as number) * (page as number)
);
res.status(200).json({
message: "ok",
apartments: slicedApartments,
code: 200,
});
return;
} catch (error) {
if (
(error as Error).message === "invalid oauth token" ||
(error as Error).message === "INVALID_TOKEN"
) {
console.log("error", error);
logger.error(error);
return res
.status(401)
.json({ message: "Неправильный токен или токен устарел", code: 401 });
}
console.log("error", error);
logger.error(error);
return res.status(500).json({ message: "Server Error", code: 500 });
}
} catch (error) {
logger.error(error);
console.log("error", error);
}
});
// router.get("/:id", async (req, res) => {
// const accessToken = req?.headers?.authorization;
// const {id} = req.params;
// try {
// const response = await fetch(`${aparmentsApi}&page=${page}&per_page=200`, {
// headers: {
// Authorization: accessToken,
// },
// });
// if (!accessToken)
// return res
// .status(401)
// .json({ message: "Отсутсвует access token", code: 401 });
// try {
// res.status(200).json({
// message: "ok",
// apartments: slicedApartments,
// code: 200,
// });
// return;
// } catch (error) {
// if (
// (error as Error).message === "invalid oauth token" ||
// (error as Error).message === "INVALID_TOKEN"
// ) {
// console.log("error", error);
// logger.error(error);
// return res
// .status(401)
// .json({ message: "Неправильный токен или токен устарел", code: 401 });
// }
// console.log("error", error);
// logger.error(error);
// return res.status(500).json({ message: "Server Error", code: 500 });
// }
// } catch (error) {
// logger.error(error);
// console.log("error", error);
// }
// });
const apartmentsRoute = router;
export default apartmentsRoute;