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 };