2016-11-30 03:18:51 +08:00
|
|
|
|
2016-12-07 09:51:12 +08:00
|
|
|
function isContactMeaningful(contact) {
|
2016-11-30 03:18:51 +08:00
|
|
|
// some suggestions: http://stackoverflow.com/questions/6317714/apache-camel-mail-to-identify-auto-generated-messages
|
|
|
|
const regex = new RegExp(/^(noreply|no-reply|donotreply|mailer|support|webmaster|news(letter)?@)/ig)
|
|
|
|
|
|
|
|
if (!contact.email) {
|
|
|
|
return false;
|
|
|
|
}
|
|
|
|
if (regex.test(contact.email) || contact.email.length > 60) {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
|
|
|
|
2016-12-06 07:37:17 +08:00
|
|
|
async function extractContacts({db, message}) {
|
2016-12-08 06:43:51 +08:00
|
|
|
const {Contact} = db
|
2016-11-30 03:18:51 +08:00
|
|
|
let allContacts = [];
|
|
|
|
['to', 'from', 'bcc', 'cc'].forEach((field) => {
|
|
|
|
allContacts = allContacts.concat(message[field])
|
|
|
|
})
|
|
|
|
|
2016-12-07 09:51:12 +08:00
|
|
|
const meaningfulContacts = allContacts.filter(c => isContactMeaningful(c));
|
2016-12-08 06:43:51 +08:00
|
|
|
const contactsDataById = new Map()
|
|
|
|
meaningfulContacts.forEach(c => {
|
|
|
|
const id = Contact.hash(c)
|
|
|
|
const cdata = {
|
|
|
|
id,
|
|
|
|
name: c.name,
|
|
|
|
email: c.email,
|
|
|
|
accountId: message.accountId,
|
|
|
|
}
|
|
|
|
contactsDataById.set(id, cdata)
|
|
|
|
})
|
|
|
|
const existingContacts = await Contact.findAll({
|
|
|
|
where: {
|
|
|
|
id: Array.from(contactsDataById.keys()),
|
|
|
|
},
|
|
|
|
})
|
2016-12-07 09:51:12 +08:00
|
|
|
|
|
|
|
await db.sequelize.transaction(async (transaction) => {
|
2016-12-08 06:43:51 +08:00
|
|
|
const promises = []
|
|
|
|
for (const c of contactsDataById.values()) {
|
|
|
|
const existing = existingContacts.find(({id}) => id === c.id)
|
2016-12-07 09:51:12 +08:00
|
|
|
if (!existing) {
|
2016-12-08 06:43:51 +08:00
|
|
|
promises.push(Contact.create(c, {transaction}));
|
2016-12-06 07:37:17 +08:00
|
|
|
} else {
|
2016-12-08 06:43:51 +08:00
|
|
|
const updateRequired = (c.name !== existing.name);
|
2016-12-07 09:51:12 +08:00
|
|
|
if (updateRequired) {
|
2016-12-08 06:43:51 +08:00
|
|
|
promises.push(existing.update(c, {transaction}));
|
2016-12-07 09:51:12 +08:00
|
|
|
}
|
2016-12-06 07:37:17 +08:00
|
|
|
}
|
|
|
|
}
|
2016-12-07 09:51:12 +08:00
|
|
|
await Promise.all(promises);
|
|
|
|
})
|
|
|
|
|
|
|
|
return message;
|
2016-11-30 03:18:51 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = extractContacts
|