2019-06-03 10:34:59 +02:00
2019-06-27 17:29:57 +02:00
const dotenv = require ( 'dotenv' ) . config ( ) ;
2019-06-11 10:26:48 +02:00
const { getRealEstateTypeEnum } = require ( './enums' ) ;
const { getRegionName , getMunicipalityName } = require ( './codes' ) ;
2019-07-02 21:49:56 +02:00
const { allRERequestByUiid } = require ( './db/dbHelper' ) ;
2019-06-27 17:29:57 +02:00
var AWS = require ( 'aws-sdk' ) ;
2019-07-04 09:51:04 +02:00
const TEMPLATE _NAME = "MarketAlertTemplate"
2019-06-27 17:29:57 +02:00
2019-06-03 10:34:59 +02:00
AWS . config . update ( {
region : process . env . AMAZON _REGION ,
credentials :
{
accessKeyId : process . env . AMAZON _ACCES _KEY _ID ,
secretAccessKey : process . env . AMAZON _SECRET _ACCESS _KEY
}
} ) ;
const sendTemplatedEmail = async ( email , request ) => {
const params = {
Destination : { /* required */
CcAddresses : [
] ,
ToAddresses : [
email
]
} ,
Message : { /* required */
Body : { /* required */
Html : {
Charset : "UTF-8" ,
2019-06-28 18:06:19 +02:00
Data : getGreetingsEmailHTML ( request )
2019-06-03 10:34:59 +02:00
} ,
Text : {
Charset : "UTF-8" ,
2019-06-28 18:06:19 +02:00
Data : getGreetingsEmaiTextVersion ( request )
2019-06-03 10:34:59 +02:00
}
} ,
Subject : {
Charset : 'UTF-8' ,
2019-07-03 15:13:59 +02:00
Data : ` Javimi Potvrda: ${ getSubject ( request . realEstateType , request . region , request . municipality ) } `
2019-06-03 10:34:59 +02:00
}
} ,
2019-06-11 10:26:48 +02:00
Source : process . env . SOURCE _EMAIL , /* required */
2019-06-03 10:34:59 +02:00
ReplyToAddresses : [
2019-06-11 10:26:48 +02:00
process . env . SOURCE _EMAIL ,
2019-06-03 10:34:59 +02:00
] ,
} ;
const sendEmailPromise = new AWS . SES ( { apiVersion : '2010-12-01' } ) . sendEmail ( params ) . promise ( ) ;
await sendEmailPromise ;
}
2019-06-28 18:06:19 +02:00
const getGreetingsEmailHTML = ( realestateRequest ) => {
2019-06-11 10:26:48 +02:00
const realEstateType = getRealEstateTypeEnum ( realestateRequest . realEstateType ) ;
const gardenSize = realEstateType . hasGardenSize ? ` <div><strong>Kvadratura okućnice: Od ${ realestateRequest . gardenSizeMin } do ${ realestateRequest . gardenSizeMax } m2 </strong></div> ` : ` `
2019-06-03 10:34:59 +02:00
return ` <h1> Zdravo,
Naručio / la si da ti javimo ako se nekretnina pojavi u oglasima . < / h 1 >
< h2 > Ovo je tražena nekretnina : < / h 2 >
< div >
2019-06-11 10:26:48 +02:00
< div > < strong > Tip nekretnine : $ { realEstateType . title } < / s t r o n g > < / d i v >
< div > < strong > Područje : $ { getRegionName ( realestateRequest . region ) } < / s t r o n g > < / d i v >
< div > < strong > Mjesto : $ { getMunicipalityName ( realestateRequest . region , realestateRequest . municipality ) } < / s t r o n g > < / d i v >
< div > < strong > Kvadratura nekretnine : Od $ { realestateRequest . sizeMin } do $ { realestateRequest . sizeMax } m2 < / s t r o n g > < / d i v >
$ { gardenSize }
< div > < strong > Cijena : $ { realestateRequest . priceMin } do $ { realestateRequest . priceMax } KM < / s t r o n g > < / d i v >
< / d i v >
< div >
2019-06-03 10:34:59 +02:00
< / d i v >
< div > < strong > Ako želis prestati dobijati obavještenja za ovu pretragu klikni $ { process . env . APP _URL } / odjava / $ { realestateRequest . uniqueId } < / s t r o n g > < / d i v >
< div > < strong > Ako želiš promijeniti uslove pretrage klikni $ { process . env . APP _URL } / pregled / $ { realestateRequest . uniqueId } < / s t r o n g > < / d i v >
< h4 > Tvoj ,
Javimi tim .
< / h 4 > `
}
2019-06-28 18:06:19 +02:00
const getGreetingsEmaiTextVersion = ( realestateRequest ) => {
2019-06-11 10:26:48 +02:00
const realEstateType = getRealEstateTypeEnum ( realestateRequest . realEstateType ) ;
2019-06-27 17:29:57 +02:00
const gardenSize = realEstateType . hasGardenSize ? "Kvadratura okućnice od " + realestateRequest . gardenSizeMin + " do " + realestateRequest . gardenSizeMax : ""
2019-06-11 10:26:48 +02:00
2019-06-03 10:34:59 +02:00
const text = "Zdravo, \n Naručio/la si da ti javimo ako se nekretnina pojavi u oglasima \n Ovo je tražena nekretnina: \n , Tip nekretnine: "
+ realestateRequest . realEstateType + "\n Područje" + getRegionName ( realestateRequest . region ) + "\n Mjesto " + getMunicipalityName ( realestateRequest . region , realestateRequest . municipality )
+ "\n Kvadratura nekretnine Od " + realestateRequest . sizeMin + " do " + realestateRequest . sizeMaX +
2019-06-11 10:26:48 +02:00
+ gardenSize
2019-06-27 17:29:57 +02:00
"\n Cijena od " + realestateRequest . priceMin + " do " + realestateRequest . priceMax +
2019-06-03 10:34:59 +02:00
"\n Ako želis prestati dobijati obavještenja za ovu pretragu klikni" + process . env . APP _URL + "/odjava/" + realestateRequest . uniqueId +
"\n Ako želiš promijeniti uslove pretrage klikni " + process . env . APP _URL + "/odpregled/" + realestateRequest . uniqueId +
"\n Tvoj,\n Javimi tim"
return text ;
}
2019-06-27 17:29:57 +02:00
const sendBulkEmail = async ( marketAlerts ) => {
try {
destinations = [ ]
2019-07-02 21:49:56 +02:00
groupedRERequests = [ ] ;
2019-07-04 17:28:09 +02:00
const RERequestUuidsMaped = marketAlerts . map ( marketAlert => marketAlert . request ) ;
2019-07-03 15:13:59 +02:00
2019-07-04 17:28:09 +02:00
const RERequestUuidsArray = Array . from ( new Set ( RERequestUuidsMaped ) ) ;
2019-07-03 15:13:59 +02:00
2019-07-04 17:28:09 +02:00
const RERequestUuids = RERequestUuidsArray . map ( marketAlert => {
2019-07-02 21:49:56 +02:00
return { uniqueId : marketAlert }
} ) ;
2019-07-03 15:13:59 +02:00
2019-07-02 21:49:56 +02:00
const RERequest = await allRERequestByUiid ( RERequestUuids ) ;
const requestDataValues = [ ] ;
2019-07-03 15:13:59 +02:00
2019-07-02 21:49:56 +02:00
RERequest . forEach ( RERequest => {
var formatedRequest = { } ;
2019-07-03 15:13:59 +02:00
formatedRequest [ RERequest . uniqueId ] =
requestDataValues [ RERequest . uniqueId ] = {
realEstateType : RERequest . realEstateType ,
region : RERequest . region ,
municipality : RERequest . municipality
} ;
} ) ;
2019-06-27 17:29:57 +02:00
marketAlerts . forEach ( marketAlert => {
2019-07-03 15:13:59 +02:00
const requestObject = {
email : marketAlert . email ,
realEstateType : requestDataValues [ marketAlert . request ] . realEstateType ,
municipality : requestDataValues [ marketAlert . request ] . municipality ,
region : requestDataValues [ marketAlert . request ] . region ,
}
2019-07-02 21:49:56 +02:00
if ( ! groupedRERequests [ marketAlert . request ] ) {
2019-07-03 15:13:59 +02:00
groupedRERequests [ marketAlert . request ] = {
requestObject : requestObject ,
marketAlertArray : [ ]
} ;
2019-06-28 18:06:19 +02:00
}
2019-07-02 21:49:56 +02:00
2019-07-03 15:13:59 +02:00
groupedRERequests [ marketAlert . request ] . marketAlertArray . push ( {
2019-07-02 21:49:56 +02:00
url : marketAlert . url ,
title : marketAlert . title ,
} ) ;
2019-06-28 18:06:19 +02:00
} ) ;
2019-07-02 21:49:56 +02:00
for ( request in groupedRERequests ) {
2019-06-28 18:06:19 +02:00
2019-07-02 21:49:56 +02:00
const marketAlert = groupedRERequests [ request ] ;
2019-07-03 15:13:59 +02:00
let extractedData = toAWSArray ( marketAlert . marketAlertArray ) ;
const realEstateType = getRealEstateTypeEnum ( marketAlert . requestObject . realEstateType ) . title ;
const region = getRegionName ( marketAlert . requestObject . region ) ;
const municipality = getMunicipalityName ( marketAlert . requestObject . region , marketAlert . requestObject . municipality ) ;
let repData = ` { "marketAlertUrl":[ ${ extractedData } ], "realestateType":" ${ realEstateType } ", "region":" ${ region } ", "municipality":" ${ municipality } " } `
2019-06-28 18:06:19 +02:00
2019-06-27 17:29:57 +02:00
destinations . push ( {
Destination : {
ToAddresses : [
2019-07-03 15:13:59 +02:00
marketAlert . requestObject . email
2019-06-27 17:29:57 +02:00
]
} ,
2019-06-28 18:06:19 +02:00
ReplacementTemplateData : repData
2019-06-27 17:29:57 +02:00
} )
2019-06-28 18:06:19 +02:00
}
2019-07-02 11:54:33 +02:00
console . log ( "AWS EMAIL : Bulk email replacement data:" ) ;
2019-07-03 15:13:59 +02:00
console . log ( destinations ) ;
2019-06-27 17:29:57 +02:00
var params = {
2019-06-28 18:06:19 +02:00
Destinations :
destinations ,
2019-06-27 17:29:57 +02:00
Source : process . env . SOURCE _EMAIL , /* required */
Template : TEMPLATE _NAME , /* required */
DefaultTemplateData : '{ \"REPLACEMENT_TAG_NAME\":\"REPLACEMENT_VALUE\" }' ,
ReplyToAddresses : [
process . env . SOURCE _EMAIL ,
]
} ;
// Create the promise and SES service object
2019-06-28 18:06:19 +02:00
const sendPromise = new AWS . SES ( { apiVersion : '2010-12-01' } ) . sendBulkTemplatedEmail ( params ) . promise ( ) ;
2019-07-02 11:54:33 +02:00
const awsResult = await sendPromise ;
console . log ( "AWS SES bulk email response" ) ;
console . log ( awsResult ) ;
2019-06-27 17:29:57 +02:00
} catch ( e ) {
console . log ( "Could not send bulk email" , e )
}
2019-06-28 18:06:19 +02:00
}
const toAWSArray = ( urlArray ) => {
2019-07-03 15:13:59 +02:00
2019-06-28 18:06:19 +02:00
let arrayString = ""
urlArray . forEach ( element => {
2019-07-02 12:25:22 +02:00
const formatetdTitle = element . title . replace ( /"/g , "" ) ;
arrayString = arrayString + ` {"url":" ${ element . url . trim ( ) } " , "title":" ${ formatetdTitle } "}, `
2019-06-28 18:06:19 +02:00
} ) ;
2019-07-02 11:54:33 +02:00
return arrayString . slice ( 0 , - 1 ) ;
2019-07-03 15:13:59 +02:00
2019-06-28 18:06:19 +02:00
}
const getNotificationEmailHtml = ( ) => {
return ` <h2> Zdravo,
Pronašli smo nekretninu koju ste tražili . < / h 2 >
< h3 > Ovo su tražene nekretnine : < / h 3 >
< div >
< div > { { # each marketAlertUrl } } < li > < a href = "{{url}}" > { { title } } < / a > < / l i > < b r / > { { / e a c h } } < d i v / >
< div / >
< / d i v > `
}
const getNotificationEmailText = ( ) => {
return ` Zdravo,
Pronašli smo nekretninu koju ste tražili . Ovo su tražene nekretnine : { { # each marketAlertUrl } } { { url } } { { title } } { { / e a c h } } `
2019-06-27 17:29:57 +02:00
}
const createMarketAlertEmailTemplate = async ( ) => {
const marketAlertTemplate = {
Template : {
2019-07-02 21:49:56 +02:00
TemplateName : TEMPLATE _NAME ,
SubjectPart : "Javi mi obavijest: {{realestateType}}, {{region}}, {{municipality}}" ,
2019-07-02 11:54:33 +02:00
TextPart : getNotificationEmailText ( ) ,
2019-06-28 18:06:19 +02:00
HtmlPart : getNotificationEmailHtml ( )
2019-06-27 17:29:57 +02:00
}
}
try {
2019-06-28 18:06:19 +02:00
const templatePromise = new AWS . SES ( { apiVersion : '2010-12-01' } ) . updateTemplate ( marketAlertTemplate ) . promise ( ) ;
2019-06-27 17:29:57 +02:00
await templatePromise
} catch ( e ) {
console . log ( "Could not create MarketAlertEmailTemplate" , e ) ;
}
}
2019-07-03 15:13:59 +02:00
const getSubject = ( realEstateType , region , municipality ) => {
return ` ${ getRealEstateTypeEnum ( realEstateType ) . title } ${ getRegionName ( region ) } , ${ getMunicipalityName ( region , municipality ) } `
}
2019-06-03 10:34:59 +02:00
module . exports = {
2019-06-27 17:29:57 +02:00
sendTemplatedEmail ,
sendBulkEmail ,
createMarketAlertEmailTemplate
2019-06-03 10:34:59 +02:00
} ;