apply prettier on all files

This commit is contained in:
Bilal Catic
2019-09-05 11:14:54 +02:00
parent 719cf4d8f9
commit 60e618fd22
45 changed files with 1749 additions and 1621 deletions

View File

@@ -1,32 +1,31 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const { getRealEstateTypeEnum } = require('../helpers/enums'); const { getRealEstateTypeEnum } = require("../helpers/enums");
const getGardenSize = (req,res) => { const getGardenSize = (req, res) => {
const title = "Koliko okućnice tražite ?";
const title = "Koliko okućnice tražite ?" const unit = " m2";
const unit = " m2"
const rangeFrom = { const rangeFrom = {
min : 10, min: 10,
max : 3000, max: 3000,
value : 0, value: 0,
step : 10 step: 10
} };
const rangeTo = { const rangeTo = {
min : 10, min: 10,
max : 3000, max: 3000,
value : 100, value: 100,
step : 10 step: 10
} };
res.render('gardenSize', { rangeFrom, rangeTo, unit, title }); res.render("gardenSize", { rangeFrom, rangeTo, unit, title });
}; };
const postGardenSize = async (req, res) => { const postGardenSize = async (req, res) => {
const request = await currentRERequest(req); const request = await currentRERequest(req);
const nextStepPage = req.query.nextStep || 'cijena'; const nextStepPage = req.query.nextStep || "cijena";
const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`; const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`;
const realEstateType = getRealEstateTypeEnum(request.realEstateType); const realEstateType = getRealEstateTypeEnum(request.realEstateType);

View File

@@ -1,6 +1,6 @@
const getGoAgain = async (req,res) => { const getGoAgain = async (req, res) => {
const title = "Želite li pretražiti još jednu nekretninu ?"; const title = "Želite li pretražiti još jednu nekretninu ?";
res.render('goAgain', {title}); res.render("goAgain", { title });
}; };
module.exports = { module.exports = {

View File

@@ -1,20 +1,26 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const { getMunicipalitiesForRegion, getMunicipalityName } = require('../helpers/codes'); const {
getMunicipalitiesForRegion,
getMunicipalityName
} = require("../helpers/codes");
const getMunicipality = async (req, res) => { const getMunicipality = async (req, res) => {
const title = "U kojem mjestu tražite nekretninu?";
const title = "U kojem mjestu tražite nekretninu?"
let request = await currentRERequest(req); let request = await currentRERequest(req);
const municipalities = getMunicipalitiesForRegion(request.region); const municipalities = getMunicipalitiesForRegion(request.region);
res.render('municipality', { municipalities, title }); res.render("municipality", { municipalities, title });
}; };
const postMunicipality = async (req, res) => { const postMunicipality = async (req, res) => {
const request = await currentRERequest(req); const request = await currentRERequest(req);
const nextStepParam = req.query.nextStep ? "?nextStep=" + req.query.nextStep : ""; const nextStepParam = req.query.nextStep
const nextStepUrl = `/${'naselje'}/${request.uniqueId}/${getMunicipalityName(request.region, req.body.municipality)}${nextStepParam}`; ? "?nextStep=" + req.query.nextStep
: "";
const nextStepUrl = `/${"naselje"}/${request.uniqueId}/${getMunicipalityName(
request.region,
req.body.municipality
)}${nextStepParam}`;
request.municipality = req.body.municipality; request.municipality = req.body.municipality;
await request.save(); await request.save();

View File

@@ -1,41 +1,37 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const getNeighborhood = async (req, res) => { const getNeighborhood = async (req, res) => {
const title = "U kojem naselju tražite nekretninu?";
const municipality = req.params.municipality;
const nextStep = req.query.nextStep || "/";
const title = "U kojem naselju tražite nekretninu?" res.render("neighborhoodMap", {
const municipality = req.params.municipality nextStep,
const nextStep = req.query.nextStep || '/'; municipality,
title
res.render('neighborhoodMap', { });
nextStep,
municipality,
title
});
}; };
const postNeighborhood = async (req, res) => { const postNeighborhood = async (req, res) => {
let request = await currentRERequest(req); let request = await currentRERequest(req);
const northWest = [req.body.west, req.body.north]; const northWest = [req.body.west, req.body.north];
const northEast = [req.body.east, req.body.north]; const northEast = [req.body.east, req.body.north];
const southEast = [req.body.east, req.body.south]; const southEast = [req.body.east, req.body.south];
const southWest = [req.body.west, req.body.south]; const southWest = [req.body.west, req.body.south];
request.bounding_box = { request.bounding_box = {
type: 'Polygon', coordinates: [ type: "Polygon",
[northWest, northEast, southEast, coordinates: [[northWest, northEast, southEast, southWest, northWest]]
southWest, northWest] };
] await request.save();
};
await request.save();
const nextStepPage = req.query.nextStep || 'povrsina'; const nextStepPage = req.query.nextStep || "povrsina";
const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`; const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`;
res.redirect(nextStepUrl); res.redirect(nextStepUrl);
}; };
module.exports = { module.exports = {
getNeighborhood, getNeighborhood,
postNeighborhood postNeighborhood
}; };

View File

@@ -1,32 +1,30 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const getPrice = (req,res) => { const getPrice = (req, res) => {
const title = "Koja Vam okvirna cijena odgovara ?";
const title = "Koja Vam okvirna cijena odgovara ?" const unit = " KM";
const unit = " KM"
const rangeFrom = { const rangeFrom = {
min : 1000, min: 1000,
max : 250000, max: 250000,
value : 0, value: 0,
step : 1000 step: 1000
} };
const rangeTo = { const rangeTo = {
min : 1000, min: 1000,
max : 250000, max: 250000,
value : 50000, value: 50000,
step : 1000 step: 1000
} };
res.render("price", { rangeFrom, rangeTo, unit, title });
res.render('price', {rangeFrom, rangeTo, unit, title });
}; };
const postPrice = async (req, res) => { const postPrice = async (req, res) => {
const request = await currentRERequest(req); const request = await currentRERequest(req);
const nextStepPage = req.query.nextStep || 'pregled'; const nextStepPage = req.query.nextStep || "pregled";
const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`; const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`;
request.priceMin = req.body.from; request.priceMin = req.body.from;

View File

@@ -1,10 +1,16 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const { getRegionName, getMunicipalityName } = require('../helpers/codes'); const { getRegionName, getMunicipalityName } = require("../helpers/codes");
const { realEstateTypes, sizes, gardenSizes, prices, getEnumTypeTitle, getRealEstateTypeEnum } = require('../helpers/enums'); const {
realEstateTypes,
sizes,
gardenSizes,
prices,
getEnumTypeTitle,
getRealEstateTypeEnum
} = require("../helpers/enums");
const getQueryReview = async (req,res) => { const getQueryReview = async (req, res) => {
const title = "Da li je ovo to što ste tražili ?";
const title = "Da li je ovo to što ste tražili ?"
const request = await currentRERequest(req); const request = await currentRERequest(req);
const nextStep = req.query.nextStep; const nextStep = req.query.nextStep;
@@ -21,54 +27,64 @@ const getQueryReview = async (req,res) => {
gardenSizeMin, gardenSizeMin,
gardenSizeMax, gardenSizeMax,
priceMin, priceMin,
priceMax } = request.dataValues; priceMax
} = request.dataValues;
const realEstateTypeObject = getRealEstateTypeEnum(realEstateType); const realEstateTypeObject = getRealEstateTypeEnum(realEstateType);
const enableGardenSizeEdit = realEstateTypeObject ? realEstateTypeObject.hasGardenSize : false; const enableGardenSizeEdit = realEstateTypeObject
? realEstateTypeObject.hasGardenSize
: false;
const realEstateTypeTitle = realEstateType ? getEnumTypeTitle(realEstateTypes, realEstateType) : null; const realEstateTypeTitle = realEstateType
? getEnumTypeTitle(realEstateTypes, realEstateType)
: null;
const regionName = region ? getRegionName(region) : null; const regionName = region ? getRegionName(region) : null;
const municipalityName = (region && municipality) ? getMunicipalityName(region, municipality) : null; const municipalityName =
region && municipality ? getMunicipalityName(region, municipality) : null;
const sizeTitle = sizeMin ? sizeMin + "-" + sizeMax + " m2" : null; const sizeTitle = sizeMin ? sizeMin + "-" + sizeMax + " m2" : null;
const gardenSizeTitle = gardenSizeMin ? gardenSizeMin + "-" + gardenSizeMax + " m2" : null; const gardenSizeTitle = gardenSizeMin
const priceTitle = priceMin ? priceMin + "-" + priceMax + " KM" : null; ? gardenSizeMin + "-" + gardenSizeMax + " m2"
: null;
const priceTitle = priceMin ? priceMin + "-" + priceMax + " KM" : null;
const uniqueId = request.dataValues.uniqueId ? request.dataValues.uniqueId : ''; const uniqueId = request.dataValues.uniqueId
? request.dataValues.uniqueId
: "";
const queryData = [ const queryData = [
{ {
id: 'realEstateType', id: "realEstateType",
title: realEstateTypeTitle, title: realEstateTypeTitle,
url: `/vrstanekretnine/${uniqueId}?nextStep=pregled`, url: `/vrstanekretnine/${uniqueId}?nextStep=pregled`
}, },
{ {
id: 'region', id: "region",
title: regionName, title: regionName,
url: `/grad/${uniqueId}?nextStep=mjesto`, url: `/grad/${uniqueId}?nextStep=mjesto`
}, },
{ {
id: 'municipality', id: "municipality",
title: municipalityName, title: municipalityName,
url: `/mjesto/${uniqueId}?nextStep=pregled`, url: `/mjesto/${uniqueId}?nextStep=pregled`
}, },
{ {
id: 'size', id: "size",
title: sizeTitle, title: sizeTitle,
url: `/povrsina/${uniqueId}?nextStep=pregled`, url: `/povrsina/${uniqueId}?nextStep=pregled`
}, },
{ {
id: 'gardenSize', id: "gardenSize",
title: gardenSizeTitle, title: gardenSizeTitle,
url: enableGardenSizeEdit ? `/okucnica/${uniqueId}?nextStep=pregled` : '', url: enableGardenSizeEdit ? `/okucnica/${uniqueId}?nextStep=pregled` : ""
}, },
{ {
id: 'price', id: "price",
title: priceTitle, title: priceTitle,
url: `/cijena/${uniqueId}?nextStep=pregled` url: `/cijena/${uniqueId}?nextStep=pregled`
} }
]; ];
res.render('queryReview', { res.render("queryReview", {
nextStep, nextStep,
queryData, queryData,
title title

View File

@@ -1,14 +1,13 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const { isValidEmail } = require('../helpers/email'); const { isValidEmail } = require("../helpers/email");
const { sendTemplatedEmail} = require('../helpers/awsEmail'); const { sendTemplatedEmail } = require("../helpers/awsEmail");
const getQuerySubmit = async (req, res) => { const getQuerySubmit = async (req, res) => {
const title = "Upišite vaš e-mail";
const title = "Upišite vaš e-mail"
const nextStep = req.query.nextStep; const nextStep = req.query.nextStep;
const error = req.query.error; const error = req.query.error;
res.render('querySubmit', { res.render("querySubmit", {
nextStep, nextStep,
error, error,
title title
@@ -17,25 +16,23 @@ const getQuerySubmit = async (req, res) => {
const postQuerySubmit = async (req, res) => { const postQuerySubmit = async (req, res) => {
const request = await currentRERequest(req); const request = await currentRERequest(req);
const nextStep = req.query.nextStep || '/ponovo'; const nextStep = req.query.nextStep || "/ponovo";
const emailInput = req.body.email; const emailInput = req.body.email;
const emailConfirmInput = req.body.confirm; const emailConfirmInput = req.body.confirm;
let error = "Greška ! Unesite validan email"; let error = "Greška ! Unesite validan email";
if (!isValidEmail(emailInput) || !isValidEmail(emailConfirmInput)) { if (!isValidEmail(emailInput) || !isValidEmail(emailConfirmInput)) {
error = "Greška ! Unesite validan email"; error = "Greška ! Unesite validan email";
res.render('querySubmit', { res.render("querySubmit", {
error error
}); });
return; return;
} }
if (emailInput !== emailConfirmInput) { if (emailInput !== emailConfirmInput) {
error = "Greška ! Unešeni emailovi nisu isti"; error = "Greška ! Unešeni emailovi nisu isti";
res.render('querySubmit', { res.render("querySubmit", {
error error
}); });
return; return;

View File

@@ -1,42 +1,39 @@
const db = require('../models/index'); const db = require("../models/index");
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const { realEstateTypes, getRealEstateTypeEnum } = require('../helpers/enums'); const { realEstateTypes, getRealEstateTypeEnum } = require("../helpers/enums");
const getRealEstateTypes = (req, res) => {
const getRealEstateTypes = (req,res) => { const title = "Koju nekretninu tražite?";
const title = "Koju nekretninu tražite?" res.render("realEstateType", { realEstateTypes, title });
res.render('realEstateType', { realEstateTypes, title });
}; };
const postRealEstateTypes = async (req, res) => { const postRealEstateTypes = async (req, res) => {
const request = await currentRERequest(req); const request = await currentRERequest(req);
const nextStepPage = req.query.nextStep || 'grad'; const nextStepPage = req.query.nextStep || "grad";
if (request && request.uniqueId) { if (request && request.uniqueId) {
const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`; const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`;
request.realEstateType = req.body.realestatetype; request.realEstateType = req.body.realestatetype;
if (!getRealEstateTypeEnum(request.realEstateType).hasGardenSize){ if (!getRealEstateTypeEnum(request.realEstateType).hasGardenSize) {
request.gardenSize = null; request.gardenSize = null;
} }
await request.save(); await request.save();
res.redirect(nextStepUrl) res.redirect(nextStepUrl);
} else { } else {
db.RealEstateRequest.create({ db.RealEstateRequest.create({
realEstateType: req.body.realestatetype realEstateType: req.body.realestatetype
}).then( (result) => { })
const nextStepUrl = `/${nextStepPage}/${result.uniqueId}`; .then(result => {
res.redirect(nextStepUrl); const nextStepUrl = `/${nextStepPage}/${result.uniqueId}`;
}).catch( (e) => { res.redirect(nextStepUrl);
res.send(e); })
}); .catch(e => {
res.send(e);
});
} }
}; };
module.exports = { module.exports = {

View File

@@ -1,18 +1,16 @@
const { allMarketAlertsByRequest } = require("../helpers/db/dbHelper");
const {allMarketAlertsByRequest} = require('../helpers/db/dbHelper'); const getRealEstates = async (req, res) => {
console.log("Enter get realestates");
const request = req.params["request_id"];
console.log(req.params["request_id"]);
const realEstates = await allMarketAlertsByRequest(request);
console.log(realEstates);
const getRealEstates = async (req,res) => { const title = "Ovo su nekretnine koje smo pronašli za vas";
console.log("Enter get realestates"); res.render("realEstates", { realEstates, title });
const request = req.params['request_id']; };
console.log(req.params['request_id']);
const realEstates = await allMarketAlertsByRequest(request);
console.log(realEstates);
const title = "Ovo su nekretnine koje smo pronašli za vas"
res.render('realEstates', {realEstates, title } );
};
module.exports = {
getRealEstates
};
module.exports = {
getRealEstates
};

View File

@@ -1,25 +1,25 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const { getRegions } = require('../helpers/codes'); const { getRegions } = require("../helpers/codes");
const regions = getRegions(); const regions = getRegions();
const getRegion = (req,res) => { const getRegion = (req, res) => {
const title = "U kojoj regiji tražite nekretninu?" const title = "U kojoj regiji tražite nekretninu?";
res.render('region', { regions, title }); res.render("region", { regions, title });
}; };
const postRegion = async (req, res) => { const postRegion = async (req, res) => {
const request = await currentRERequest(req); const request = await currentRERequest(req);
const nextStepQueryParam = req.query.nextStep ? '?nextStep=pregled' : ''; const nextStepQueryParam = req.query.nextStep ? "?nextStep=pregled" : "";
const nextStepPage = req.query.nextStep || 'mjesto'; const nextStepPage = req.query.nextStep || "mjesto";
const nextStepUrl = `/${nextStepPage}/${request.uniqueId}${nextStepQueryParam}`; const nextStepUrl = `/${nextStepPage}/${request.uniqueId}${nextStepQueryParam}`;
request.region = req.body.region; request.region = req.body.region;
request.municipality = null; request.municipality = null;
await request.save(); await request.save();
res.redirect(nextStepUrl) res.redirect(nextStepUrl);
}; };
module.exports = { module.exports = {

View File

@@ -1,25 +1,24 @@
const { currentRERequest } = require('../helpers/url'); const { currentRERequest } = require("../helpers/url");
const { sizes, getRealEstateTypeEnum } = require('../helpers/enums'); const { sizes, getRealEstateTypeEnum } = require("../helpers/enums");
const getSize = (req,res) => { const getSize = (req, res) => {
const title = "Od koliko kvadrata tražite nekretninu ?";
const title = "Od koliko kvadrata tražite nekretninu ?" const unit = " m2";
const unit = " m2"
const rangeFrom = { const rangeFrom = {
min : 10, min: 10,
max : 250, max: 250,
value : 0, value: 0,
step : 10 step: 10
} };
const rangeTo = { const rangeTo = {
min : 10, min: 10,
max : 250, max: 250,
value : 50, value: 50,
step : 10 step: 10
} };
res.render('size', { rangeFrom, rangeTo, unit, title }); res.render("size", { rangeFrom, rangeTo, unit, title });
}; };
const postSize = async (req, res) => { const postSize = async (req, res) => {
@@ -27,7 +26,8 @@ const postSize = async (req, res) => {
const realEstateType = getRealEstateTypeEnum(request.realEstateType); const realEstateType = getRealEstateTypeEnum(request.realEstateType);
const nextStep = realEstateType && realEstateType.hasGardenSize ? 'okucnica' : 'cijena'; const nextStep =
realEstateType && realEstateType.hasGardenSize ? "okucnica" : "cijena";
const nextStepPage = req.query.nextStep || nextStep; const nextStepPage = req.query.nextStep || nextStep;
const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`; const nextStepUrl = `/${nextStepPage}/${request.uniqueId}`;
request.sizeMin = req.body.from; request.sizeMin = req.body.from;

View File

@@ -1,17 +1,14 @@
const { currentRERequest } = require("../helpers/url");
const { currentRERequest } = require('../helpers/url');
const getUnsubscribe = async (req, res) => { const getUnsubscribe = async (req, res) => {
const title = "Uspješno ste se odjavili";
const request = await currentRERequest(req);
request.subscribed = false;
await request.save();
const title = "Uspješno ste se odjavili" res.render("unsubscribe", { nextStep: "/vrstanekretnine", title });
const request = await currentRERequest(req);
request.subscribed = false;
await request.save();
res.render('unsubscribe', { nextStep: '/vrstanekretnine', title });
}; };
module.exports = { module.exports = {
getUnsubscribe getUnsubscribe
}; };

View File

@@ -1,6 +1,6 @@
const getWelcome = (req,res) => { const getWelcome = (req, res) => {
const title = "Koju nekretninu tražite?" const title = "Koju nekretninu tražite?";
res.render('welcome', { nextStep: '/vrstanekretnine', title } ); res.render("welcome", { nextStep: "/vrstanekretnine", title });
}; };
module.exports = { module.exports = {

View File

@@ -57,9 +57,7 @@ const getGreetingsEmailHTML = realestateRequest => {
realestateRequest.realEstateType realestateRequest.realEstateType
); );
const gardenSize = realEstateType.hasGardenSize const gardenSize = realEstateType.hasGardenSize
? `<div><strong>Kvadratura okućnice: Od ${ ? `<div><strong>Kvadratura okućnice: Od ${realestateRequest.gardenSizeMin} do ${realestateRequest.gardenSizeMax} m2 </strong></div>`
realestateRequest.gardenSizeMin
} do ${realestateRequest.gardenSizeMax} m2 </strong></div>`
: ``; : ``;
return `<h1> Zdravo, return `<h1> Zdravo,

File diff suppressed because it is too large Load Diff

View File

@@ -1,7 +1,6 @@
const isValidEmail = email => {
const isValidEmail = (email) => {
const simpleEmailRegex = /^.+@.+\..+$/; const simpleEmailRegex = /^.+@.+\..+$/;
return (email && email.length < 250 && simpleEmailRegex.test(email)); return email && email.length < 250 && simpleEmailRegex.test(email);
}; };
module.exports = { module.exports = {

View File

@@ -1,57 +1,57 @@
const realEstateTypes = [ const realEstateTypes = [
{ title: "Kuća", id: "kuca", hasGardenSize: true, olxCategory: 24 }, { title: "Kuća", id: "kuca", hasGardenSize: true, olxCategory: 24 },
{ title: "Stan", id: "stan", hasGardenSize: false, olxCategory: 23}, { title: "Stan", id: "stan", hasGardenSize: false, olxCategory: 23 },
{ title: "Vikendica", id: "vikendica", hasGardenSize: true, olxCategory: 26 } { title: "Vikendica", id: "vikendica", hasGardenSize: true, olxCategory: 26 }
]; ];
const sizes = [ const sizes = [
{ title: "do 50 m2", id: "50m2" }, { title: "do 50 m2", id: "50m2" },
{ title: "do 75 m2", id: "75m2" }, { title: "do 75 m2", id: "75m2" },
{ title: "do 100 m2", id: "100m2" }, { title: "do 100 m2", id: "100m2" },
{ title: "do 150 m2", id: "150m2" }, { title: "do 150 m2", id: "150m2" },
{ title: "do 200 m2", id: "200m2" }, { title: "do 200 m2", id: "200m2" },
{ title: "preko 200 m2", id: "moreThan200m2" } { title: "preko 200 m2", id: "moreThan200m2" }
]; ];
const gardenSizes = [ const gardenSizes = [
{ title: "do 100 m2", id: "100m2" }, { title: "do 100 m2", id: "100m2" },
{ title: "do 500 m2", id: "500m2" }, { title: "do 500 m2", id: "500m2" },
{ title: "do 1 dunum", id: "1000m2" }, { title: "do 1 dunum", id: "1000m2" },
{ title: "do 2 dunuma", id: "2000m2" }, { title: "do 2 dunuma", id: "2000m2" },
{ title: "do 3 dunuma", id: "3000m2" }, { title: "do 3 dunuma", id: "3000m2" },
{ title: "preko 3 dunuma", id: "moreThan3000m2" } { title: "preko 3 dunuma", id: "moreThan3000m2" }
]; ];
const prices = [ const prices = [
{ title: "do 50 000 KM", id: "50kKM" }, { title: "do 50 000 KM", id: "50kKM" },
{ title: "do 100 000 KM", id: "100kKM" }, { title: "do 100 000 KM", id: "100kKM" },
{ title: "do 150 000 KM", id: "150kKM" }, { title: "do 150 000 KM", id: "150kKM" },
{ title: "do 200 000 KM", id: "200kKM" }, { title: "do 200 000 KM", id: "200kKM" },
{ title: "do 250 000 KM", id: "250kKM" }, { title: "do 250 000 KM", id: "250kKM" },
{ title: "preko 250 000 KM", id: "moreThan250kKM" } { title: "preko 250 000 KM", id: "moreThan250kKM" }
]; ];
const getEnumObject = (enumType, enumId) => { const getEnumObject = (enumType, enumId) => {
return enumType.find(enumValue => enumValue.id === enumId); return enumType.find(enumValue => enumValue.id === enumId);
}; };
const getRealEstateTypeEnum = (enumId) => { const getRealEstateTypeEnum = enumId => {
return getEnumObject(realEstateTypes, enumId) || null; return getEnumObject(realEstateTypes, enumId) || null;
} };
const getEnumTypeTitle = (enumType, enumId) => { const getEnumTypeTitle = (enumType, enumId) => {
const enumObject = getEnumObject(enumType, enumId); const enumObject = getEnumObject(enumType, enumId);
if (!enumObject){ if (!enumObject) {
return null; return null;
} }
return enumObject.title; return enumObject.title;
}; };
module.exports = { module.exports = {
realEstateTypes, realEstateTypes,
sizes, sizes,
gardenSizes, gardenSizes,
prices, prices,
getRealEstateTypeEnum, getRealEstateTypeEnum,
getEnumTypeTitle, getEnumTypeTitle
}; };

View File

@@ -1,12 +1,12 @@
const db = require('../models/index'); const db = require("../models/index");
const currentRERequest = async (req) => { const currentRERequest = async req => {
const uniqueId = req.params['request_id']; const uniqueId = req.params["request_id"];
if(!uniqueId) return null; if (!uniqueId) return null;
const request = await db.RealEstateRequest.findOne({ where: {uniqueId} }); const request = await db.RealEstateRequest.findOne({ where: { uniqueId } });
return request; return request;
}; };
module.exports = { module.exports = {
currentRERequest, currentRERequest
}; };

View File

@@ -1,9 +1,8 @@
const scrapTheItems = require("./scrapTheItems"); const scrapTheItems = require("./scrapTheItems");
const convertToDate = require("./convertToDate"); const convertToDate = require("./convertToDate");
const AWS = require('aws-sdk'); const AWS = require("aws-sdk");
// AWS.config.update({region: 'eu-central-1'}); // AWS.config.update({region: 'eu-central-1'});
async function sendNotification(marketAlert) { async function sendNotification(marketAlert) {
const { id, email, olx_url } = marketAlert; const { id, email, olx_url } = marketAlert;
let url = let url =
@@ -19,37 +18,37 @@ async function sendNotification(marketAlert) {
// Create sendEmail params // Create sendEmail params
const params = { const params = {
Destination: { /* required */ Destination: {
CcAddresses: [ /* required */
], CcAddresses: [],
ToAddresses: [ ToAddresses: [email]
email
]
}, },
Message: { /* required */ Message: {
Body: { /* required */ /* required */
Body: {
/* required */
Html: { Html: {
Charset: "UTF-8", Charset: "UTF-8",
Data: message Data: message
}, },
Text: { Text: {
Charset: "UTF-8", Charset: "UTF-8",
Data: message // TODO: convert to text Data: message // TODO: convert to text
} }
}, },
Subject: { Subject: {
Charset: 'UTF-8', Charset: "UTF-8",
Data: 'Javimi alert' Data: "Javimi alert"
} }
}, },
Source: 'info@saburly.com', /* required */ Source: "info@saburly.com" /* required */,
ReplyToAddresses: [ ReplyToAddresses: ["info@saburly.com"]
'info@saburly.com',
],
}; };
if (message) { if (message) {
const sendPromise = new AWS.SES({apiVersion: '2010-12-01'}).sendEmail(params).promise(); const sendPromise = new AWS.SES({ apiVersion: "2010-12-01" })
.sendEmail(params)
.promise();
await sendPromise; await sendPromise;
return { id, date: String(convertToDate(lastDate)) }; return { id, date: String(convertToDate(lastDate)) };
} }

View File

@@ -1,7 +1,7 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.createTable('MarketAlerts', { return queryInterface.createTable("MarketAlerts", {
id: { id: {
allowNull: false, allowNull: false,
autoIncrement: true, autoIncrement: true,
@@ -29,6 +29,6 @@ module.exports = {
}); });
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('MarketAlerts'); return queryInterface.dropTable("MarketAlerts");
} }
}; };

View File

@@ -1,7 +1,7 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.createTable('RealEstateRequests', { return queryInterface.createTable("RealEstateRequests", {
id: { id: {
allowNull: false, allowNull: false,
autoIncrement: true, autoIncrement: true,
@@ -28,6 +28,6 @@ module.exports = {
}); });
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.dropTable('RealEstateRequests'); return queryInterface.dropTable("RealEstateRequests");
} }
}; };

View File

@@ -1,18 +1,15 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn(
'RealEstateRequests', "RealEstateRequests",
'city', "city",
Sequelize.STRING Sequelize.STRING
); );
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("RealEstateRequests", "city");
'RealEstateRequests',
'city'
);
} }
}; };

View File

@@ -1,18 +1,15 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn(
'RealEstateRequests', "RealEstateRequests",
'place', "place",
Sequelize.STRING Sequelize.STRING
); );
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("RealEstateRequests", "place");
'RealEstateRequests',
'place'
);
} }
}; };

View File

@@ -1,19 +1,19 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.renameColumn( return queryInterface.renameColumn(
'RealEstateRequests', "RealEstateRequests",
'place', "place",
'municipality' "municipality"
); );
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.renameColumn( return queryInterface.renameColumn(
'RealEstateRequests', "RealEstateRequests",
'municipality', "municipality",
'place' "place"
); );
} }
}; };

View File

@@ -1,19 +1,11 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.renameColumn( return queryInterface.renameColumn("RealEstateRequests", "city", "region");
'RealEstateRequests',
'city',
'region'
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.renameColumn( return queryInterface.renameColumn("RealEstateRequests", "region", "city");
'RealEstateRequests',
'region',
'city'
);
} }
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("RealEstateRequests", "size", {
'RealEstateRequests', type: Sequelize.STRING
'size', });
{
type: Sequelize.STRING
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("RealEstateRequests", "size");
'RealEstateRequests',
'size'
);
} }
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("RealEstateRequests", "gardenSize", {
'RealEstateRequests', type: Sequelize.STRING
'gardenSize', });
{
type: Sequelize.STRING
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("RealEstateRequests", "gardenSize");
'RealEstateRequests',
'gardenSize'
);
} }
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("RealEstateRequests", "price", {
'RealEstateRequests', type: Sequelize.STRING
'price', });
{
type: Sequelize.STRING
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("RealEstateRequests", "price");
'RealEstateRequests',
'price'
);
} }
}; };

View File

@@ -1,15 +1,19 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.sequelize.query("CREATE EXTENSION postgis").then(([results, metadata]) => { return queryInterface.sequelize
/// No result .query("CREATE EXTENSION postgis")
}) .then(([results, metadata]) => {
/// No result
});
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.sequelize.query("DROP EXTENSION IF EXISTS postgis").then(([results, metadata]) => { return queryInterface.sequelize
.query("DROP EXTENSION IF EXISTS postgis")
.then(([results, metadata]) => {
/// No result /// No result
}) });
} }
}; };

View File

@@ -1,17 +1,21 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.sequelize
return queryInterface.sequelize.query("ALTER TABLE \"RealEstateRequests\" ADD COLUMN bounding_box geometry(Polygon);").then(([results, metadata]) => { .query(
/// No result 'ALTER TABLE "RealEstateRequests" ADD COLUMN bounding_box geometry(Polygon);'
}) )
.then(([results, metadata]) => {
/// No result
});
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.sequelize.query("ALTER TABLE \"RealEstateRequests\" DROP COLUMN bounding_box").then(([results, metadata]) => { return queryInterface.sequelize
/// No result .query('ALTER TABLE "RealEstateRequests" DROP COLUMN bounding_box')
}) .then(([results, metadata]) => {
/// No result
});
} }
}; };

View File

@@ -1,27 +1,48 @@
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.addColumn('RealEstateRequests', 'sizeRange', { queryInterface.addColumn(
type: Sequelize.STRING "RealEstateRequests",
}, { transaction: t }), "sizeRange",
queryInterface.addColumn('RealEstateRequests', 'gardenSizeRange', { {
type: Sequelize.STRING, type: Sequelize.STRING
}, { transaction: t }), },
queryInterface.addColumn('RealEstateRequests', 'priceRange', { { transaction: t }
type: Sequelize.STRING, ),
}, { transaction: t }) queryInterface.addColumn(
]) "RealEstateRequests",
}) "gardenSizeRange",
}, {
type: Sequelize.STRING
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"priceRange",
{
type: Sequelize.STRING
},
{ transaction: t }
)
]);
});
},
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.removeColumn('RealEstateRequests', 'sizeRange', { transaction: t }), queryInterface.removeColumn("RealEstateRequests", "sizeRange", {
queryInterface.removeColumn('RealEstateRequests', 'gardenSizeRange', { transaction: t }), transaction: t
queryInterface.removeColumn('RealEstateRequests', 'priceRange', { transaction: t }) }),
]) queryInterface.removeColumn("RealEstateRequests", "gardenSizeRange", {
transaction: t
}),
queryInterface.removeColumn("RealEstateRequests", "priceRange", {
transaction: t
}) })
} ]);
});
}
}; };

View File

@@ -1,63 +1,147 @@
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.removeColumn('RealEstateRequests', 'sizeRange', { transaction: t }), queryInterface.removeColumn("RealEstateRequests", "sizeRange", {
queryInterface.removeColumn('RealEstateRequests', 'gardenSizeRange', { transaction: t }), transaction: t
queryInterface.removeColumn('RealEstateRequests', 'priceRange', { transaction: t }), }),
queryInterface.removeColumn('RealEstateRequests', 'size', { transaction: t }), queryInterface.removeColumn("RealEstateRequests", "gardenSizeRange", {
queryInterface.removeColumn('RealEstateRequests', 'gardenSize', { transaction: t }), transaction: t
queryInterface.removeColumn('RealEstateRequests', 'price', { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'gardenSizeMin', { queryInterface.removeColumn("RealEstateRequests", "priceRange", {
type: Sequelize.INTEGER, transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'gardenSizeMax', { queryInterface.removeColumn("RealEstateRequests", "size", {
type: Sequelize.INTEGER, transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'sizeMin', { queryInterface.removeColumn("RealEstateRequests", "gardenSize", {
type: Sequelize.INTEGER transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'sizeMax', { queryInterface.removeColumn("RealEstateRequests", "price", {
type: Sequelize.INTEGER, transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'priceMin', { queryInterface.addColumn(
type: Sequelize.INTEGER, "RealEstateRequests",
}, { transaction: t }), "gardenSizeMin",
queryInterface.addColumn('RealEstateRequests', 'priceMax', { {
type: Sequelize.INTEGER type: Sequelize.INTEGER
}, { transaction: t }) },
]) { transaction: t }
}) ),
}, queryInterface.addColumn(
"RealEstateRequests",
"gardenSizeMax",
{
type: Sequelize.INTEGER
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"sizeMin",
{
type: Sequelize.INTEGER
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"sizeMax",
{
type: Sequelize.INTEGER
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"priceMin",
{
type: Sequelize.INTEGER
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"priceMax",
{
type: Sequelize.INTEGER
},
{ transaction: t }
)
]);
});
},
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.removeColumn('RealEstateRequests', 'gardenSizeMin', { transaction: t }), queryInterface.removeColumn("RealEstateRequests", "gardenSizeMin", {
queryInterface.removeColumn('RealEstateRequests', 'gardenSizeMax', { transaction: t }), transaction: t
queryInterface.removeColumn('RealEstateRequests', 'sizeMin', { transaction: t }), }),
queryInterface.removeColumn('RealEstateRequests', 'sizeMax', { transaction: t }), queryInterface.removeColumn("RealEstateRequests", "gardenSizeMax", {
queryInterface.removeColumn('RealEstateRequests', 'priceMin', { transaction: t }), transaction: t
queryInterface.removeColumn('RealEstateRequests', 'priceMin', { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'priceMax', { queryInterface.removeColumn("RealEstateRequests", "sizeMin", {
type: Sequelize.STRING transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'gardenSizeRange', { queryInterface.removeColumn("RealEstateRequests", "sizeMax", {
type: Sequelize.STRING, transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'priceRange', { queryInterface.removeColumn("RealEstateRequests", "priceMin", {
type: Sequelize.STRING, transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'size', { queryInterface.removeColumn("RealEstateRequests", "priceMin", {
type: Sequelize.STRING transaction: t
}, { transaction: t }), }),
queryInterface.addColumn('RealEstateRequests', 'gardenSize', { queryInterface.addColumn(
type: Sequelize.STRING, "RealEstateRequests",
}, { transaction: t }), "priceMax",
queryInterface.addColumn('RealEstateRequests', 'price', { {
type: Sequelize.STRING, type: Sequelize.STRING
}, { transaction: t }) },
]) { transaction: t }
}) ),
} queryInterface.addColumn(
"RealEstateRequests",
"gardenSizeRange",
{
type: Sequelize.STRING
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"priceRange",
{
type: Sequelize.STRING
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"size",
{
type: Sequelize.STRING
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"gardenSize",
{
type: Sequelize.STRING
},
{ transaction: t }
),
queryInterface.addColumn(
"RealEstateRequests",
"price",
{
type: Sequelize.STRING
},
{ transaction: t }
)
]);
});
}
}; };

View File

@@ -1,18 +1,15 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn(
'RealEstateRequests', "RealEstateRequests",
'subscribed', "subscribed",
Sequelize.BOOLEAN Sequelize.BOOLEAN
); );
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("RealEstateRequests", "subscribed");
'RealEstateRequests',
'subscribed'
);
} }
}; };

View File

@@ -1,37 +1,70 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.addColumn('MarketAlerts', 'size', { queryInterface.addColumn(
type: Sequelize.INTEGER, "MarketAlerts",
}, { transaction: t }), "size",
queryInterface.addColumn('MarketAlerts', 'gardenSize', { {
type: Sequelize.INTEGER, type: Sequelize.INTEGER
}, { transaction: t }), },
queryInterface.addColumn('MarketAlerts', 'price', { { transaction: t }
type: Sequelize.INTEGER, ),
}, { transaction: t }), queryInterface.addColumn(
queryInterface.addColumn('MarketAlerts', 'municipality', { "MarketAlerts",
type: Sequelize.STRING, "gardenSize",
}, { transaction: t }), {
queryInterface.addColumn('MarketAlerts', 'region', { type: Sequelize.INTEGER
type: Sequelize.STRING, },
}, { transaction: t }) { transaction: t }
]) ),
}) queryInterface.addColumn(
}, "MarketAlerts",
"price",
{
type: Sequelize.INTEGER
},
{ transaction: t }
),
queryInterface.addColumn(
"MarketAlerts",
"municipality",
{
type: Sequelize.STRING
},
{ transaction: t }
),
queryInterface.addColumn(
"MarketAlerts",
"region",
{
type: Sequelize.STRING
},
{ transaction: t }
)
]);
});
},
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.removeColumn('MarketAlerts', 'size', { transaction: t }), queryInterface.removeColumn("MarketAlerts", "size", { transaction: t }),
queryInterface.removeColumn('MarketAlerts', 'gardenSize', { transaction: t }), queryInterface.removeColumn("MarketAlerts", "gardenSize", {
queryInterface.removeColumn('MarketAlerts', 'price', { transaction: t }), transaction: t
queryInterface.removeColumn('MarketAlerts', 'municipality', { transaction: t }), }),
queryInterface.removeColumn('MarketAlerts', 'region', { transaction: t }) queryInterface.removeColumn("MarketAlerts", "price", {
]) transaction: t
}),
queryInterface.removeColumn("MarketAlerts", "municipality", {
transaction: t
}),
queryInterface.removeColumn("MarketAlerts", "region", {
transaction: t
}) })
} ]);
});
}
}; };

View File

@@ -1,33 +1,59 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.removeColumn('MarketAlerts', 'olxUrl', { transaction: t }), queryInterface.removeColumn("MarketAlerts", "olxUrl", {
queryInterface.addColumn('MarketAlerts', 'url', { transaction: t
type: Sequelize.STRING, }),
}, { transaction: t }), queryInterface.addColumn(
queryInterface.addColumn('MarketAlerts', 'realestateOrigin', { "MarketAlerts",
type: Sequelize.STRING, "url",
}, { transaction: t }), {
queryInterface.addColumn('MarketAlerts', 'originId', { type: Sequelize.STRING
type: Sequelize.STRING, },
}, { transaction: t }) { transaction: t }
]) ),
}) queryInterface.addColumn(
}, "MarketAlerts",
"realestateOrigin",
{
type: Sequelize.STRING
},
{ transaction: t }
),
queryInterface.addColumn(
"MarketAlerts",
"originId",
{
type: Sequelize.STRING
},
{ transaction: t }
)
]);
});
},
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.sequelize.transaction((t) => { return queryInterface.sequelize.transaction(t => {
return Promise.all([ return Promise.all([
queryInterface.removeColumn('MarketAlerts', 'url', { transaction: t }), queryInterface.removeColumn("MarketAlerts", "url", { transaction: t }),
queryInterface.removeColumn('MarketAlerts', 'realestateOrigin', { transaction: t }), queryInterface.removeColumn("MarketAlerts", "realestateOrigin", {
queryInterface.removeColumn('MarketAlerts', 'originId', { transaction: t }), transaction: t
queryInterface.addColumn('MarketAlerts', 'olxUrl', { }),
type: Sequelize.STRING queryInterface.removeColumn("MarketAlerts", "originId", {
}, { transaction: t }) transaction: t
]) }),
}) queryInterface.addColumn(
} "MarketAlerts",
"olxUrl",
{
type: Sequelize.STRING
},
{ transaction: t }
)
]);
});
}
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("MarketAlerts", "realEstateType", {
'MarketAlerts', type: Sequelize.STRING
'realEstateType', });
{
type: Sequelize.STRING
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("MarketAlerts", "realEstateType");
'MarketAlerts',
'realEstateType'
);
} }
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("MarketAlerts", "notified", {
'MarketAlerts', type: Sequelize.BOOLEAN
'notified', });
{
type: Sequelize.BOOLEAN
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("MarketAlerts", "notified");
'MarketAlerts',
'notified'
);
} }
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("MarketAlerts", "title", {
'MarketAlerts', type: Sequelize.STRING
'title', });
{
type: Sequelize.STRING
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("MarketAlerts", "title");
'MarketAlerts',
'title'
);
} }
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("MarketAlerts", "request", {
'MarketAlerts', type: Sequelize.STRING
'request', });
{
type: Sequelize.STRING
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("MarketAlerts", "request");
'MarketAlerts',
'request'
);
} }
}; };

View File

@@ -1,20 +1,13 @@
'use strict'; "use strict";
module.exports = { module.exports = {
up: (queryInterface, Sequelize) => { up: (queryInterface, Sequelize) => {
return queryInterface.addColumn( return queryInterface.addColumn("MarketAlerts", "hasLocation", {
'MarketAlerts', type: Sequelize.BOOLEAN
'hasLocation', });
{
type: Sequelize.BOOLEAN
}
);
}, },
down: (queryInterface, Sequelize) => { down: (queryInterface, Sequelize) => {
return queryInterface.removeColumn( return queryInterface.removeColumn("MarketAlerts", "hasLocation");
'MarketAlerts',
'hasLocation'
);
} }
}; };

View File

@@ -1,27 +1,33 @@
'use strict'; "use strict";
const fs = require('fs'); const fs = require("fs");
const path = require('path'); const path = require("path");
const Sequelize = require('sequelize'); const Sequelize = require("sequelize");
const basename = path.basename(__filename); const basename = path.basename(__filename);
const env = process.env.NODE_ENV || 'development'; const env = process.env.NODE_ENV || "development";
const config = require(__dirname + '/../config/config.json')[env]; const config = require(__dirname + "/../config/config.json")[env];
const db = {}; const db = {};
let sequelize; let sequelize;
if (config.use_env_variable) { if (config.use_env_variable) {
sequelize = new Sequelize(process.env[config.use_env_variable], config); sequelize = new Sequelize(process.env[config.use_env_variable], config);
} else { } else {
sequelize = new Sequelize(config.database, config.username, config.password, config); sequelize = new Sequelize(
config.database,
config.username,
config.password,
config
);
} }
fs fs.readdirSync(__dirname)
.readdirSync(__dirname)
.filter(file => { .filter(file => {
return (file.indexOf('.') !== 0) && (file !== basename) && (file.slice(-3) === '.js'); return (
file.indexOf(".") !== 0 && file !== basename && file.slice(-3) === ".js"
);
}) })
.forEach(file => { .forEach(file => {
const model = sequelize['import'](path.join(__dirname, file)); const model = sequelize["import"](path.join(__dirname, file));
db[model.name] = model; db[model.name] = model;
}); });

View File

@@ -1,26 +1,30 @@
'use strict'; "use strict";
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
const MarketAlert = sequelize.define('MarketAlert', { const MarketAlert = sequelize.define(
url: DataTypes.STRING, "MarketAlert",
realestateOrigin: DataTypes.STRING, {
originId: DataTypes.STRING, url: DataTypes.STRING,
lastDate: DataTypes.STRING, realestateOrigin: DataTypes.STRING,
size : DataTypes.INTEGER, originId: DataTypes.STRING,
gardenSize : DataTypes.INTEGER, lastDate: DataTypes.STRING,
price : DataTypes.INTEGER, size: DataTypes.INTEGER,
municipality : DataTypes.STRING, gardenSize: DataTypes.INTEGER,
region : DataTypes.STRING, price: DataTypes.INTEGER,
realEstateType : DataTypes.STRING, municipality: DataTypes.STRING,
notified : DataTypes.BOOLEAN, region: DataTypes.STRING,
title : DataTypes.STRING, realEstateType: DataTypes.STRING,
request: DataTypes.STRING, notified: DataTypes.BOOLEAN,
hasLocation: DataTypes.BOOLEAN, title: DataTypes.STRING,
request: DataTypes.STRING,
hasLocation: DataTypes.BOOLEAN,
email: { email: {
type: DataTypes.STRING, type: DataTypes.STRING,
allowNul: false allowNul: false
} }
}, {}); },
{}
);
MarketAlert.associate = function(models) { MarketAlert.associate = function(models) {
// associations can be defined here // associations can be defined here
}; };

View File

@@ -1,26 +1,29 @@
'use strict'; "use strict";
module.exports = (sequelize, DataTypes) => { module.exports = (sequelize, DataTypes) => {
const RealEstateRequest = sequelize.define(
const RealEstateRequest = sequelize.define('RealEstateRequest', { "RealEstateRequest",
uniqueId: { {
type: DataTypes.UUID, uniqueId: {
defaultValue: DataTypes.UUIDV4, type: DataTypes.UUID,
allowNull: false defaultValue: DataTypes.UUIDV4,
allowNull: false
},
realEstateType: DataTypes.STRING,
email: DataTypes.STRING,
region: DataTypes.STRING,
municipality: DataTypes.STRING,
sizeMin: DataTypes.INTEGER,
sizeMax: DataTypes.INTEGER,
gardenSizeMin: DataTypes.INTEGER,
gardenSizeMax: DataTypes.INTEGER,
priceMin: DataTypes.INTEGER,
priceMax: DataTypes.INTEGER,
bounding_box: DataTypes.GEOMETRY("POINT", 4326),
subscribed: DataTypes.BOOLEAN
}, },
realEstateType: DataTypes.STRING, {}
email: DataTypes.STRING, );
region: DataTypes.STRING,
municipality: DataTypes.STRING,
sizeMin: DataTypes.INTEGER,
sizeMax: DataTypes.INTEGER,
gardenSizeMin: DataTypes.INTEGER,
gardenSizeMax: DataTypes.INTEGER,
priceMin: DataTypes.INTEGER,
priceMax: DataTypes.INTEGER,
bounding_box: DataTypes.GEOMETRY('POINT', 4326),
subscribed: DataTypes.BOOLEAN
}, {});
RealEstateRequest.associate = function(models) { RealEstateRequest.associate = function(models) {
// associations can be defined here // associations can be defined here
}; };

View File

@@ -1,85 +1,93 @@
const Promise = require("bluebird"); const Promise = require("bluebird");
const OlxCrawler = require("../helpers/crawlers/olxClawler"); const OlxCrawler = require("../helpers/crawlers/olxClawler");
const db = require("../models/index"); const db = require("../models/index");
const { allMarketAlerts } = require('../helpers/db/dbHelper'); const { allMarketAlerts } = require("../helpers/db/dbHelper");
async function crawlAll() { async function crawlAll() {
console.log("CRAWLER SERVICE: crawlAll"); console.log("CRAWLER SERVICE: crawlAll");
try { try {
const marketAlertsFromDb = await allMarketAlerts(true); const marketAlertsFromDb = await allMarketAlerts(true);
const hrefs = []; const hrefs = [];
marketAlertsFromDb.map(marketAlert => { marketAlertsFromDb.map(marketAlert => {
if (hrefs[marketAlert.request] === undefined) { if (hrefs[marketAlert.request] === undefined) {
hrefs[marketAlert.request] = [] hrefs[marketAlert.request] = [];
} }
hrefs[marketAlert.request].push(marketAlert.url); hrefs[marketAlert.request].push(marketAlert.url);
}) });
console.log("CRAWLER SERVICE: GLOBAL HREFS"); console.log("CRAWLER SERVICE: GLOBAL HREFS");
console.log(hrefs); console.log(hrefs);
const olxCrawler = new OlxCrawler(hrefs); const olxCrawler = new OlxCrawler(hrefs);
const crawlers = [ const crawlers = [olxCrawler];
olxCrawler,
];
return Promise.map(crawlers, function (crawler) { return Promise.map(crawlers, function(crawler) {
return crawler.crawl(); return crawler.crawl();
}).then(async (results) => { }).then(async results => {
try {
const marketAlertsFromDb = await allMarketAlerts(false, true);
try { console.log(
"CRAWLER SERVICE: number of existing MarketAlerts from db: " +
marketAlertsFromDb.length
);
const marketAlertsFromDb = await allMarketAlerts(false, true); const marketAlerts = [];
const mergedResults = [].concat.apply([], results);
console.log("CRAWLER SERVICE: number of existing MarketAlerts from db: " + marketAlertsFromDb.length); for (const result of mergedResults) {
marketAlerts.push({
url: result.url,
realestateOrigin: "OLX",
originId: 1,
size: result.size,
price: result.price,
email: result.email,
request: result.uuid,
municipality: result.municipality,
region: result.region,
gardenSize: isNaN(result.gardenSize) ? 0 : result.gardenSize,
realEstateType: result.realEstateType,
title: result.title,
notified: false,
hasLocation: result.hasLocation
});
}
console.log(
"CRAWLER SERVICE: Number of crawler results: " + marketAlerts.length
);
const marketAlerts = []; try {
const mergedResults = [].concat.apply([], results); const filteredMarketAlerts = marketAlerts.filter(
elem =>
!marketAlertsFromDb.find(({ url, request }) => {
return elem.url === url && elem.request === request;
})
);
console.log(
"CRAWLER SERVICE: Number of new crawler results: " +
filteredMarketAlerts.length
);
for (const result of mergedResults) { await db.MarketAlert.bulkCreate(filteredMarketAlerts);
marketAlerts.push({ } catch (e) {
url: result.url, console.log(
realestateOrigin: "OLX", "CRAWLER SERVICE: Could not bulkCreate marketalers reason: ",
originId: 1, e
size: result.size, );
price: result.price, }
email: result.email, } catch (e) {
request: result.uuid, console.log(
municipality: result.municipality, "CRAWLER SERVICE: Error crawling. Trying next crawler! ",
region: result.region, e
gardenSize: isNaN(result.gardenSize) ? 0 : result.gardenSize, );
realEstateType: result.realEstateType, }
title: result.title, });
notified: false, } catch (e) {
hasLocation: result.hasLocation console.error("CRAWLER SERVICE:could not fetch marketalerts ", e);
}) }
} }
console.log("CRAWLER SERVICE: Number of crawler results: " + marketAlerts.length);
try {
const filteredMarketAlerts = marketAlerts.filter((elem) => !marketAlertsFromDb.find(({ url, request }) => {
return (elem.url === url && elem.request === request)
}));
console.log("CRAWLER SERVICE: Number of new crawler results: " + filteredMarketAlerts.length);
await db.MarketAlert.bulkCreate(filteredMarketAlerts);
} catch (e) {
console.log("CRAWLER SERVICE: Could not bulkCreate marketalers reason: ", e);
}
} catch (e) {
console.log("CRAWLER SERVICE: Error crawling. Trying next crawler! ", e);
}
})
} catch (e) {
console.error("CRAWLER SERVICE:could not fetch marketalerts ", e);
}
};
module.exports = crawlAll; module.exports = crawlAll;

View File

@@ -1,29 +1,34 @@
const db = require("../models/index"); const db = require("../models/index");
const { allMarketAlerts } = require('../helpers/db/dbHelper'); const { allMarketAlerts } = require("../helpers/db/dbHelper");
const { createMarketAlertEmailTemplate, sendBulkEmail } = require('../helpers/awsEmail'); const {
createMarketAlertEmailTemplate,
sendBulkEmail
} = require("../helpers/awsEmail");
async function processNotifications() { async function processNotifications() {
try {
try { const marketAlerts = await allMarketAlerts(false, false);
const marketAlerts = await allMarketAlerts(false, false); console.log(marketAlerts.length);
console.log(marketAlerts.length) await createMarketAlertEmailTemplate();
await createMarketAlertEmailTemplate(); if (marketAlerts.length > 0) {
if (marketAlerts.length > 0) { console.log(
console.log("NOTIFICATION SERVICE: Number of new alerts: " + marketAlerts.length) "NOTIFICATION SERVICE: Number of new alerts: " + marketAlerts.length
await sendBulkEmail(marketAlerts); );
} else { await sendBulkEmail(marketAlerts);
console.log("NOTIFICATION SERVICE: No new alerts"); } else {
} console.log("NOTIFICATION SERVICE: No new alerts");
await db.MarketAlert.update(
{ notified: true }, /* set attributes' value */
{ where: { notified: false } } /* where criteria */
);
} catch (e) {
console.log("NOTIFICATION SERVICE: could not send notifications reason: ", e);
} }
await db.MarketAlert.update(
{ notified: true } /* set attributes' value */,
{ where: { notified: false } } /* where criteria */
);
} catch (e) {
console.log(
"NOTIFICATION SERVICE: could not send notifications reason: ",
e
);
}
} }
module.exports = processNotifications; module.exports = processNotifications;