Compare commits
1 Commits
email-dens
...
rename-var
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
8435afe9c5 |
@@ -9,14 +9,14 @@ const APP_URL =
|
|||||||
? process.env.APP_URL || "http://market-alarm"
|
? process.env.APP_URL || "http://market-alarm"
|
||||||
: process.env.APP_URL || `${APP_BASE_URL}:${APP_PORT}`;
|
: process.env.APP_URL || `${APP_BASE_URL}:${APP_PORT}`;
|
||||||
|
|
||||||
const STAGING = process.env.ENVIRONMENT !== "production";
|
const USE_KIVI_ENVIRONMENT_TAG = process.env.KIVI_ENVIRONMENT !== "production";
|
||||||
|
|
||||||
const DEFAULT_TIMEZONE = "Europe/Sarajevo";
|
const DEFAULT_TIMEZONE = "Europe/Sarajevo";
|
||||||
|
|
||||||
const CRAWLER_INTERVAL = parseInt(process.env.CRAWLER_INTERVAL) || 60;
|
const CRAWLER_INTERVAL = parseInt(process.env.CRAWLER_INTERVAL) || 60;
|
||||||
const STOP_CRAWLER = !!parseInt(process.env.STOP_CRAWLER);
|
const STOP_CRAWLER = !!parseInt(process.env.STOP_CRAWLER);
|
||||||
|
|
||||||
const CHECK_UP_DAYS = parseInt(process.env.CHECK_UP_DAYS) || 10;
|
const NO_CHECK_UP_DAYS = parseInt(process.env.NO_CHECK_UP_DAYS) || 10;
|
||||||
|
|
||||||
const AWS_EMAIL_CONFIG = {
|
const AWS_EMAIL_CONFIG = {
|
||||||
REGION: process.env.AWS_REGION || "",
|
REGION: process.env.AWS_REGION || "",
|
||||||
@@ -34,7 +34,7 @@ const MAX_REAL_ESTATES_IN_FIRST_EMAIL =
|
|||||||
|
|
||||||
const PRINT_CRAWLER_DEBUG = process.env.PRINT_CRAWLER_DEBUG_INFO || 0;
|
const PRINT_CRAWLER_DEBUG = process.env.PRINT_CRAWLER_DEBUG_INFO || 0;
|
||||||
|
|
||||||
const API_MAP_KEY = process.env.API_MAP_KEY || "";
|
const GOOGLE_MAP_KEY = process.env.GOOGLE_MAP_KEY || "";
|
||||||
|
|
||||||
const PROSTOR_LOGIN = {
|
const PROSTOR_LOGIN = {
|
||||||
EMAIL: process.env.PROSTOR_LOGIN_EMAIL,
|
EMAIL: process.env.PROSTOR_LOGIN_EMAIL,
|
||||||
@@ -55,9 +55,9 @@ module.exports = {
|
|||||||
MAX_REAL_ESTATES_IN_EMAIL,
|
MAX_REAL_ESTATES_IN_EMAIL,
|
||||||
MAX_REAL_ESTATES_IN_FIRST_EMAIL,
|
MAX_REAL_ESTATES_IN_FIRST_EMAIL,
|
||||||
PRINT_CRAWLER_DEBUG,
|
PRINT_CRAWLER_DEBUG,
|
||||||
API_MAP_KEY,
|
GOOGLE_MAP_KEY,
|
||||||
STAGING,
|
USE_KIVI_ENVIRONMENT_TAG,
|
||||||
CHECK_UP_DAYS,
|
NO_CHECK_UP_DAYS,
|
||||||
PROSTOR_LOGIN,
|
PROSTOR_LOGIN,
|
||||||
USER_AGENT
|
USER_AGENT
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -17,15 +17,15 @@ const getLocation = async (req, res) => {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const selectedArea = searchRequest.areaToSearch;
|
const selectedArea = searchRequest.areaToSearch;
|
||||||
const sw = selectedArea.coordinates[0][3];
|
const southWest = selectedArea.coordinates[0][3];
|
||||||
const ne = selectedArea.coordinates[0][1];
|
const northEast = selectedArea.coordinates[0][1];
|
||||||
|
|
||||||
if (sw[0] && ne[0]) {
|
if (sw[0] && ne[0]) {
|
||||||
selectedLatLngBounds = {
|
selectedLatLngBounds = {
|
||||||
swLat: sw[1],
|
swLat: southWest[1],
|
||||||
swLng: sw[0],
|
swLng: southWest[0],
|
||||||
neLat: ne[1],
|
neLat: northEast[1],
|
||||||
neLng: ne[0]
|
neLng: northEast[0]
|
||||||
};
|
};
|
||||||
boundsSelected = true;
|
boundsSelected = true;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -156,11 +156,33 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
// If real estate dont have defined number of rooms ex. null
|
// If real estate dont have defined number of rooms ex. null
|
||||||
//It returns all search requests except for ones that dont want incpomlete ads
|
//It returns requests that didn't choose number of rooms - also null
|
||||||
|
//Or ones that picked some values but also picked to includeIncomplete ads (or default)
|
||||||
numberOfRoomsQuery = {
|
numberOfRoomsQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
numberOfRoomsMin: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
numberOfRoomsMax: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.or]: {
|
||||||
|
[Op.eq]: true,
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -190,9 +212,30 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
numberOfFloorsQuery = {
|
numberOfFloorsQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
numberOfFloorsMin: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
numberOfFloorsMax: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.or]: {
|
||||||
|
[Op.eq]: true,
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -221,9 +264,30 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else {
|
} else {
|
||||||
floorQuery = {
|
floorQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
floorMin: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
floorMax: {
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.or]: {
|
||||||
|
[Op.eq]: true,
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -232,7 +296,7 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
//If user dont check checkbox for ex. elevator it does not mean he only wants no elevator
|
//If user dont check checkbox for ex. elevator it does not mean he only wants no elevator
|
||||||
//If real estate characteristic =true find all req, one that wants charachertistic or dont care - dont need query
|
//If real estate characteristic =true find all req, one that wants charachertistic or dont care - dont need query
|
||||||
//If real estate characteristic = false, find all req exept for ones that wants characteristic to be true
|
//If real estate characteristic = false, find all req exept for ones that wants characteristic to be true
|
||||||
//If real estate characteristic = null, dont know if true or false, find all req except ones that dont want incomplete ads
|
//If real estate characteristic = null, dont know if true or false, find req that dont care or want char and want incomplete ads
|
||||||
let balconyQuery = {};
|
let balconyQuery = {};
|
||||||
if (realEstateTypeObject.hasBalconyProp && balcony !== true) {
|
if (realEstateTypeObject.hasBalconyProp && balcony !== true) {
|
||||||
if (balcony === false) {
|
if (balcony === false) {
|
||||||
@@ -243,9 +307,30 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else if (balcony === null) {
|
} else if (balcony === null) {
|
||||||
balconyQuery = {
|
balconyQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
balcony: {
|
||||||
|
[Op.ne]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
balcony: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.or]: {
|
||||||
|
[Op.eq]: true,
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -259,9 +344,30 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else if (newBuilding === null) {
|
} else if (newBuilding === null) {
|
||||||
newBuildingQuery = {
|
newBuildingQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
newBuilding: {
|
||||||
|
[Op.ne]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
newBuilding: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.or]: {
|
||||||
|
[Op.eq]: true,
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -275,13 +381,33 @@ const findSearchRequestsForRealEstate = async realEstate => {
|
|||||||
};
|
};
|
||||||
} else if (elevator === null) {
|
} else if (elevator === null) {
|
||||||
elevatorQuery = {
|
elevatorQuery = {
|
||||||
includeIncompleteAds: {
|
[Op.or]: [
|
||||||
[Op.ne]: false
|
{
|
||||||
}
|
elevator: {
|
||||||
|
[Op.ne]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
[Op.and]: [
|
||||||
|
{
|
||||||
|
elevator: {
|
||||||
|
[Op.eq]: true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
includeIncompleteAds: {
|
||||||
|
[Op.or]: {
|
||||||
|
[Op.eq]: true,
|
||||||
|
[Op.is]: null
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//General query consists of each individual query
|
//General query consists of each individual query
|
||||||
const query = {
|
const query = {
|
||||||
adType,
|
adType,
|
||||||
|
|||||||
@@ -2,7 +2,7 @@
|
|||||||
const db = require("../../models/index");
|
const db = require("../../models/index");
|
||||||
const sequelize = require("sequelize");
|
const sequelize = require("sequelize");
|
||||||
const Op = sequelize.Op;
|
const Op = sequelize.Op;
|
||||||
const { CHECK_UP_DAYS } = require("../../config/appConfig");
|
const { NO_CHECK_UP_DAYS } = require("../../config/appConfig");
|
||||||
|
|
||||||
const findRealEstatesForSearchRequest = async searchRequestId => {
|
const findRealEstatesForSearchRequest = async searchRequestId => {
|
||||||
const query = {
|
const query = {
|
||||||
@@ -45,9 +45,9 @@ const findNotNotifiedMatches = async () => {
|
|||||||
};
|
};
|
||||||
const findAllRequestsForCheckUp = async () => {
|
const findAllRequestsForCheckUp = async () => {
|
||||||
//First we find IDs of search request that don't need to be emailed for check up - to EXCLUDE
|
//First we find IDs of search request that don't need to be emailed for check up - to EXCLUDE
|
||||||
//The ones that received notification for real estate CHECK_UP_DAYS days from now
|
//The ones that received notification for real estate NO_CHECK_UP_DAYS days from now
|
||||||
const date = new Date();
|
const date = new Date();
|
||||||
const checkUpDate = date.getDate() - CHECK_UP_DAYS;
|
const checkUpDate = date.getDate() - NO_CHECK_UP_DAYS;
|
||||||
date.setDate(checkUpDate);
|
date.setDate(checkUpDate);
|
||||||
const dateQuery = {
|
const dateQuery = {
|
||||||
createdAt: {
|
createdAt: {
|
||||||
|
|||||||
@@ -3,12 +3,12 @@
|
|||||||
const {
|
const {
|
||||||
MAX_REAL_ESTATES_IN_EMAIL,
|
MAX_REAL_ESTATES_IN_EMAIL,
|
||||||
APP_URL,
|
APP_URL,
|
||||||
STAGING
|
USE_KIVI_ENVIRONMENT_TAG
|
||||||
} = require("../config/appConfig");
|
} = require("../config/appConfig");
|
||||||
const { AD_CATEGORY, AD_TYPE, EMAIL_FREQUENCY } = require("../common/enums");
|
const { AD_CATEGORY, AD_TYPE, EMAIL_FREQUENCY } = require("../common/enums");
|
||||||
|
|
||||||
//Tag to recognize staging from development
|
//Tag to recognize staging from development if needed
|
||||||
const stagingTag = STAGING ? "[STAGING] " : "";
|
const stagingTag = USE_KIVI_ENVIRONMENT_TAG ? "[STAGING] " : "";
|
||||||
|
|
||||||
const generateEmailFooter = (searchRequestId, emailFrequencyTitle) => {
|
const generateEmailFooter = (searchRequestId, emailFrequencyTitle) => {
|
||||||
return ` <div>Trenutno ste prijavljeni da obavještenja o novim nekretninama primate <strong>${emailFrequencyTitle.toLowerCase()} </strong>.</div>
|
return ` <div>Trenutno ste prijavljeni da obavještenja o novim nekretninama primate <strong>${emailFrequencyTitle.toLowerCase()} </strong>.</div>
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
"use strict";
|
"use strict";
|
||||||
const { STAGING } = require("../config/appConfig");
|
const { USE_KIVI_ENVIRONMENT_TAG } = require("../config/appConfig");
|
||||||
|
|
||||||
const stagingTag = STAGING ? "[STAGING] " : "";
|
const stagingTag = USE_KIVI_ENVIRONMENT_TAG ? "[STAGING] " : "";
|
||||||
|
|
||||||
const {
|
const {
|
||||||
matchRealEstates,
|
matchRealEstates,
|
||||||
|
|||||||
@@ -217,7 +217,7 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<script
|
<script
|
||||||
src="https://maps.googleapis.com/maps/api/js?key=<%= process.env.API_MAP_KEY %>&language=bs&libraries=places&callback=initMap"
|
src="https://maps.googleapis.com/maps/api/js?key=<%= process.env.GOOGLE_MAP_KEY %>&language=bs&libraries=places&callback=initMap"
|
||||||
async
|
async
|
||||||
defer
|
defer
|
||||||
></script>
|
></script>
|
||||||
|
|||||||
@@ -8,19 +8,19 @@ SEQUELIZE_LOGGING=0- no sequelize logging, 1- log to the console
|
|||||||
PORT=Port for the app, defaults to 5000
|
PORT=Port for the app, defaults to 5000
|
||||||
APP_BASE_URL=base url for the app
|
APP_BASE_URL=base url for the app
|
||||||
|
|
||||||
ENVIRONMENT=Variable to denote development, staging and production
|
KIVI_ENVIRONMENT=Variable to denote development, staging and production
|
||||||
|
|
||||||
USER_AGENT=User agent header to send in fetch requests
|
USER_AGENT=User agent header to send in fetch requests
|
||||||
|
|
||||||
MAX_REAL_ESTATES_IN_EMAIL=Max number of real estates that will be shown in email, others will be truncated and URL with full list will be shwon
|
MAX_REAL_ESTATES_IN_EMAIL=Max number of real estates that will be shown in email, others will be truncated and URL with full list will be shwon
|
||||||
MAX_REAL_ESTATES_IN_FIRST_EMAIL=Max number of real estates that will be shown in first (welcome) email
|
MAX_REAL_ESTATES_IN_FIRST_EMAIL=Max number of real estates that will be shown in first (welcome) email
|
||||||
|
|
||||||
CHECK_UP_DAYS=Check up email is sent after this number of days without notification
|
NO_CHECK_UP_DAYS=Check up email is sent after this number of days without notification
|
||||||
#=============== GOOGLE ANALYTICS =============#
|
#=============== GOOGLE ANALYTICS =============#
|
||||||
GA_ID=Google Analytics ID
|
GA_ID=Google Analytics ID
|
||||||
|
|
||||||
#=============== GOOGLE MAPS =============#
|
#=============== GOOGLE MAPS =============#
|
||||||
API_MAP_KEY=(your-key-here)
|
GOOGLE_MAP_KEY=(your-key-here)
|
||||||
|
|
||||||
#=============== AWS SDK EMAIL SETTINGS =======#
|
#=============== AWS SDK EMAIL SETTINGS =======#
|
||||||
AWS_KEY_ID=(your-key-here)
|
AWS_KEY_ID=(your-key-here)
|
||||||
|
|||||||
Reference in New Issue
Block a user