From 092911a3a80279676efae6ff4755933fe35ff40d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ubeyde=20Emir=20=C3=96zdemir?= Date: Fri, 20 Sep 2024 23:47:19 +0300 Subject: [PATCH] [Some work behind the scenes] refactor: Update data files to include search filters for area and altitude This commit updates the data files for Provinces, Districts, Towns, and Villages to include search filters for area and altitude. The new filters allow users to search for entities within a specific range of area or altitude. The code has been refactored to handle the new filters and validate the input values. If the provided values are invalid or out of range, appropriate error messages are thrown. Closes #31 --- src/v1/controller.js | 84 ++++++++++++++++++++++++++++++++---- src/v1/data/Districts.js | 59 +++++++++++++++++++++++++ src/v1/data/Neighborhoods.js | 76 ++++++++++++++++++++++++++++++++ src/v1/data/Provinces.js | 46 ++++++++++++++++++++ src/v1/data/Towns.js | 72 +++++++++++++++++++++++++++++++ src/v1/data/Villages.js | 72 +++++++++++++++++++++++++++++++ 6 files changed, 401 insertions(+), 8 deletions(-) diff --git a/src/v1/controller.js b/src/v1/controller.js index e2048cf..f4402dd 100644 --- a/src/v1/controller.js +++ b/src/v1/controller.js @@ -10,6 +10,10 @@ exports.getProvinces = (req, res) => { name, minPopulation, maxPopulation, + minArea, + maxArea, + minAltitude, + maxAltitude, isMetropolitan, offset, limit, @@ -21,6 +25,10 @@ exports.getProvinces = (req, res) => { name, minPopulation, maxPopulation, + minArea, + maxArea, + minAltitude, + maxAltitude, isMetropolitan, offset, limit, @@ -55,13 +63,28 @@ exports.getExactProvince = (req, res) => { exports.getDistricts = (req, res) => { try { - const { name, minPopulation, maxPopulation, offset, limit, fields, sort } = - req.query; + const { + name, + minPopulation, + maxPopulation, + minArea, + maxArea, + provinceId, + province, + offset, + limit, + fields, + sort, + } = req.query; const districts = Districts.getDistricts( name, minPopulation, maxPopulation, + minArea, + maxArea, + provinceId, + province, offset, limit, fields, @@ -95,13 +118,28 @@ exports.getExactDistrict = (req, res) => { exports.getNeighborhoods = (req, res) => { try { - const { name, minPopulation, maxPopulation, offset, limit, fields, sort } = - req.query; + const { + name, + minPopulation, + maxPopulation, + provinceId, + province, + districtId, + district, + offset, + limit, + fields, + sort, + } = req.query; const neighborhood = Neighborhoods.getNeighborhoods( name, minPopulation, maxPopulation, + provinceId, + province, + districtId, + district, offset, limit, fields, @@ -135,13 +173,28 @@ exports.getExactNeighborhood = (req, res) => { exports.getVillages = (req, res) => { try { - const { name, minPopulation, maxPopulation, offset, limit, fields, sort } = - req.query; + const { + name, + minPopulation, + maxPopulation, + provinceId, + province, + districtId, + district, + offset, + limit, + fields, + sort, + } = req.query; const village = Villages.getVillages( name, minPopulation, maxPopulation, + provinceId, + province, + districtId, + district, offset, limit, fields, @@ -175,13 +228,28 @@ exports.getExactVillage = (req, res) => { exports.getTowns = (req, res) => { try { - const { name, minPopulation, maxPopulation, offset, limit, fields, sort } = - req.query; + const { + name, + minPopulation, + maxPopulation, + provinceId, + province, + districtId, + district, + offset, + limit, + fields, + sort, + } = req.query; const town = Towns.getTowns( name, minPopulation, maxPopulation, + provinceId, + province, + districtId, + district, offset, limit, fields, diff --git a/src/v1/data/Districts.js b/src/v1/data/Districts.js index 4129c23..dcc67c0 100644 --- a/src/v1/data/Districts.js +++ b/src/v1/data/Districts.js @@ -6,6 +6,10 @@ exports.getDistricts = function ( name, minPopulation = 1, maxPopulation = 1000000000, + minArea = 1, + maxArea = 1000000000, + provinceId, + province, offset = 0, limit = 973, fields, @@ -51,6 +55,61 @@ exports.getDistricts = function ( }); } + if (minArea || maxArea) { + if (+minArea <= 0 && +maxArea <= 0) { + throw { + status: 404, + message: "You can't search for a district with an area of 0 or less.", + }; + } + + if (+minArea > +maxArea) { + throw { + status: 404, + message: 'The minimum area cannot be greater than the maximum area.', + }; + } + + districts = districts.filter((item) => { + return item.area >= minArea && item.area <= maxArea; + }); + } + + if (provinceId || province) { + console.log(provinceId, province); + if (provinceId && province) { + throw { + status: 404, + message: + 'You can only use one of the provinceId or province parameters.', + }; + } + + if (provinceId) { + if (!isFinite(provinceId)) { + throw { + status: 404, + message: + 'Invalid province ID. The provinceId parameter must be a number.', + }; + } + + districts = districts.filter((item) => item.provinceId === +provinceId); + } + + if (province) { + const provinceAlt = + province.charAt(0).toLocaleUpperCase('TR') + + province.slice(1).toLocaleLowerCase('tr'); + + districts = districts.filter( + (item) => + item.province.includes(province) || + item.province.includes(provinceAlt), + ); + } + } + if (sort) { const sortArray = sort.split(',').reverse(); diff --git a/src/v1/data/Neighborhoods.js b/src/v1/data/Neighborhoods.js index 1c68e2b..679748f 100644 --- a/src/v1/data/Neighborhoods.js +++ b/src/v1/data/Neighborhoods.js @@ -4,6 +4,10 @@ exports.getNeighborhoods = function ( name, minPopulation = 1, maxPopulation = 1000000000, + provinceId, + province, + districtId, + district, offset = 0, limit, fields, @@ -49,6 +53,78 @@ exports.getNeighborhoods = function ( }); } + if (provinceId || province) { + if (provinceId && province) { + throw { + status: 404, + message: + 'You can only use one of the provinceId or province parameters.', + }; + } + + if (provinceId) { + if (!isFinite(provinceId)) { + throw { + status: 404, + message: + 'Invalid province ID. The provinceId parameter must be a number.', + }; + } + + neighborhoods = neighborhoods.filter( + (item) => item.provinceId === +provinceId, + ); + } + + if (province) { + const provinceAlt = + province.charAt(0).toLocaleUpperCase('TR') + + province.slice(1).toLocaleLowerCase('tr'); + + neighborhoods = neighborhoods.filter( + (item) => + item.province.includes(province) || + item.province.includes(provinceAlt), + ); + } + } + + if (districtId || district) { + if (districtId && district) { + throw { + status: 404, + message: + 'You can only use one of the districtId or district parameters.', + }; + } + + if (districtId) { + if (!isFinite(districtId)) { + throw { + status: 404, + message: + 'Invalid district ID. The districtId parameter must be a number.', + }; + } + + neighborhoods = neighborhoods.filter( + (item) => item.districtId === +districtId, + ); + } + + if (district) { + const districtAlt = + district.charAt(0).toLocaleUpperCase('TR') + + district.slice(1).toLocaleLowerCase('tr'); + + neighborhoods = neighborhoods.filter( + (item) => + item.district.includes(district) || + item.district.includes(districtAlt), + ); + } + } + if (sort) { const sortArray = sort.split(',').reverse(); diff --git a/src/v1/data/Provinces.js b/src/v1/data/Provinces.js index bc4afc9..9c65f8f 100644 --- a/src/v1/data/Provinces.js +++ b/src/v1/data/Provinces.js @@ -7,6 +7,10 @@ exports.getProvinces = function ( name, minPopulation = 1, maxPopulation = 1000000000, + minArea = 1, + maxArea = 1000000000, + minAltitude = 0, + maxAltitude = 10000, isMetropolitan, offset = 0, limit = 81, @@ -66,6 +70,48 @@ exports.getProvinces = function ( }); } + if (minArea || maxArea) { + if (+minArea <= 0 && +maxArea <= 0) { + throw { + status: 404, + message: "You can't search for a province with an area of 0 or less.", + }; + } + + if (+minArea > +maxArea) { + throw { + status: 404, + message: 'The minimum area cannot be greater than the maximum area.', + }; + } + + provinces = provinces.filter((item) => { + return item.area >= minArea && item.area <= maxArea; + }); + } + + if (minAltitude || maxAltitude) { + if (+minAltitude < 0 && +maxAltitude < 0) { + throw { + status: 404, + message: + "You can't search for a province with an altitude of less than 0.", + }; + } + + if (+minAltitude > +maxAltitude) { + throw { + status: 404, + message: + 'The minimum altitude cannot be greater than the maximum altitude.', + }; + } + + provinces = provinces.filter((item) => { + return item.altitude >= minAltitude && item.altitude <= maxAltitude; + }); + } + if (isMetropolitan) { if (isMetropolitan === 'true') { provinces = provinces.filter((item) => item.isMetropolitan === true); diff --git a/src/v1/data/Towns.js b/src/v1/data/Towns.js index 86f3a4d..cd2a0c3 100644 --- a/src/v1/data/Towns.js +++ b/src/v1/data/Towns.js @@ -4,6 +4,10 @@ exports.getTowns = function ( name, minPopulation = 1, maxPopulation = 1000000000, + provinceId, + province, + districtId, + district, offset = 0, limit, fields, @@ -49,6 +53,74 @@ exports.getTowns = function ( }); } + if (provinceId || province) { + if (provinceId && province) { + throw { + status: 404, + message: + 'You can only use one of the provinceId or province parameters.', + }; + } + + if (provinceId) { + if (!isFinite(provinceId)) { + throw { + status: 404, + message: + 'Invalid province ID. The provinceId parameter must be a number.', + }; + } + + towns = towns.filter((item) => item.provinceId === +provinceId); + } + + if (province) { + const provinceAlt = + province.charAt(0).toLocaleUpperCase('TR') + + province.slice(1).toLocaleLowerCase('tr'); + + towns = towns.filter( + (item) => + item.province.includes(province) || + item.province.includes(provinceAlt), + ); + } + } + + if (districtId || district) { + if (districtId && district) { + throw { + status: 404, + message: + 'You can only use one of the districtId or district parameters.', + }; + } + + if (districtId) { + if (!isFinite(districtId)) { + throw { + status: 404, + message: + 'Invalid district ID. The districtId parameter must be a number.', + }; + } + + towns = towns.filter((item) => item.districtId === +districtId); + } + + if (district) { + const districtAlt = + district.charAt(0).toLocaleUpperCase('TR') + + district.slice(1).toLocaleLowerCase('tr'); + + towns = towns.filter( + (item) => + item.district.includes(district) || + item.district.includes(districtAlt), + ); + } + } + if (sort) { const sortArray = sort.split(',').reverse(); diff --git a/src/v1/data/Villages.js b/src/v1/data/Villages.js index 9a1e996..b06de24 100644 --- a/src/v1/data/Villages.js +++ b/src/v1/data/Villages.js @@ -4,6 +4,10 @@ exports.getVillages = function ( name, minPopulation = 1, maxPopulation = 1000000000, + provinceId, + province, + districtId, + district, offset = 0, limit, fields, @@ -49,6 +53,74 @@ exports.getVillages = function ( }); } + if (provinceId || province) { + if (provinceId && province) { + throw { + status: 404, + message: + 'You can only use one of the provinceId or province parameters.', + }; + } + + if (provinceId) { + if (!isFinite(provinceId)) { + throw { + status: 404, + message: + 'Invalid province ID. The provinceId parameter must be a number.', + }; + } + + villages = villages.filter((item) => item.provinceId === +provinceId); + } + + if (province) { + const provinceAlt = + province.charAt(0).toLocaleUpperCase('TR') + + province.slice(1).toLocaleLowerCase('tr'); + + villages = villages.filter( + (item) => + item.province.includes(province) || + item.province.includes(provinceAlt), + ); + } + } + + if (districtId || district) { + if (districtId && district) { + throw { + status: 404, + message: + 'You can only use one of the districtId or district parameters.', + }; + } + + if (districtId) { + if (!isFinite(districtId)) { + throw { + status: 404, + message: + 'Invalid district ID. The districtId parameter must be a number.', + }; + } + + villages = villages.filter((item) => item.districtId === +districtId); + } + + if (district) { + const districtAlt = + district.charAt(0).toLocaleUpperCase('TR') + + district.slice(1).toLocaleLowerCase('tr'); + + villages = villages.filter( + (item) => + item.district.includes(district) || + item.district.includes(districtAlt), + ); + } + } + if (sort) { const sortArray = sort.split(',').reverse();