From 31ffc3253f90a428d1f507f56031f96c4619069e Mon Sep 17 00:00:00 2001 From: Bilal Catic Date: Mon, 30 Sep 2019 10:30:13 +0200 Subject: [PATCH] add method to find search requests for real estate --- app/helpers/db/searchRequest.js | 53 ++++++++++++++++++++++++++++++++- 1 file changed, 52 insertions(+), 1 deletion(-) diff --git a/app/helpers/db/searchRequest.js b/app/helpers/db/searchRequest.js index e4bac0c..a136915 100644 --- a/app/helpers/db/searchRequest.js +++ b/app/helpers/db/searchRequest.js @@ -1,5 +1,7 @@ "use strict"; const db = require("../../models/index"); +const sequelize = require("sequelize"); +const Op = sequelize.Op; const getSearchRequest = async searchRequestId => { return await db.SearchRequest.findByPk(searchRequestId); @@ -9,7 +11,56 @@ const createSearchRequest = async (searchRequestFields = {}) => { return await db.SearchRequest.create(searchRequestFields); }; +const findSearchRequestsForRealEstate = async realEstate => { + const { + price, + area, + adType, + realEstateType, + locationLat, + locationLong + } = realEstate; + + const stGeometry = sequelize.fn( + "ST_GEOMFROMTEXT", + `POINT (${locationLong} ${locationLat})`, + 4326 + ); + const areaToSearchColumn = sequelize.col("areaToSearch"); + const contains = sequelize.fn("ST_Contains", areaToSearchColumn, stGeometry); + + const geoSearchQueryPart = sequelize.where(contains, true); + + const query = { + adType, + realEstateType, + subscribed: true, + [Op.and]: geoSearchQueryPart + }; + + if (price) { + query.priceMin = { + [Op.lte]: price + }; + query.priceMax = { + [Op.gte]: price + }; + } + + if (area) { + query.sizeMin = { + [Op.lte]: area + }; + query.sizeMax = { + [Op.gte]: area + }; + } + + return await db.SearchRequest.findAll({ where: query }); +}; + module.exports = { getSearchRequest, - createSearchRequest + createSearchRequest, + findSearchRequestsForRealEstate };