Skip to content

Commit 9b645b5

Browse files
author
Hamid Tavakoli
committed
Changed logging and add schedule
2 parents 4992dd7 + ca8c497 commit 9b645b5

File tree

7 files changed

+62
-73
lines changed

7 files changed

+62
-73
lines changed

connect/service.js

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
const sgMail = require('@sendgrid/mail');
66
const config = require('config');
7+
const logger = require('../src/common/logger');
78

89
// set api key for SendGrid email client
910
sgMail.setApiKey(config.SENDGRID_API_KEY);
@@ -49,7 +50,8 @@ const sendEmail = async (templateId, message) => { // send email
4950
bcc,
5051
};
5152
}
52-
return await sgMail.send(msg)
53+
logger.info(`Sending email with templateId: ${templateId} and message: ${JSON.stringify(msg)}`);
54+
return sgMail.send(msg)
5355
}
5456
module.exports = {
5557
sendEmail,

index.js

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,10 +5,11 @@ const express = require('express');
55
const _ = require('lodash');
66
const cors = require('cors');
77
const bodyParser = require('body-parser');
8+
const schedule = require('node-schedule');
89
const helper = require('./src/common/helper');
910
const logger = require('./src/common/logger');
1011
const errors = require('./src/common/errors');
11-
const { initServer } = require('./src/init');
12+
const { initServer, retryEmail } = require('./src/init');
1213

1314
config.TEMPLATE_MAP = JSON.parse(config.TEMPLATE_MAP);
1415

@@ -142,9 +143,14 @@ function start() {
142143
throw new errors.ValidationError('Missing handler(s).');
143144
}
144145

145-
// schedule.scheduleJob(config.EMAIL_RETRY_SCHEDULE, function () {
146-
// app.retryEmail(handlers).catch((err) => logger.error(err));
147-
// });
146+
schedule.scheduleJob(config.EMAIL_RETRY_SCHEDULE, async function () {
147+
try {
148+
await retryEmail(handlers)
149+
} catch (err) {
150+
console.log(err);
151+
logger.error(err);
152+
}
153+
});
148154
app.listen(app.get('port'), () => {
149155
logger.info(`Express server listening on port ${app.get('port')}`);
150156
});

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "tc-email",
3-
"version": "1.0.0",
3+
"version": "2.0.0",
44
"description": "Topcoder Email Services",
55
"main": "index.js",
66
"scripts": {

src/init.js

Lines changed: 30 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,6 @@ async function dataHandler(consumer, handlers) {
7878
status: result.success ? 'Message accepted' : 'Message rejected',
7979
error: result.error ? result.error.toString() : 'No error message',
8080
});
81-
console.log("******************* result *******************", result)
8281

8382
if (result.success) {
8483
emailTries[topicName] = 0;
@@ -101,31 +100,31 @@ async function dataHandler(consumer, handlers) {
101100
},
102101
})
103102

104-
// const errorTypes = ['unhandledRejection', 'uncaughtException']
105-
// const signalTraps = ['SIGTERM', 'SIGINT', 'SIGUSR2']
106-
107-
// errorTypes.forEach(type => {
108-
// process.on(type, async e => {
109-
// try {
110-
// console.log(`process.on ${type}`)
111-
// console.error(e)
112-
// await consumer.disconnect()
113-
// process.exit(0)
114-
// } catch (_) {
115-
// process.exit(1)
116-
// }
117-
// })
118-
// })
119-
120-
// signalTraps.forEach(type => {
121-
// process.once(type, async () => {
122-
// try {
123-
// await consumer.disconnect()
124-
// } finally {
125-
// process.kill(process.pid, type)
126-
// }
127-
// })
128-
// })
103+
const errorTypes = ['unhandledRejection', 'uncaughtException']
104+
const signalTraps = ['SIGTERM', 'SIGINT', 'SIGUSR2']
105+
106+
errorTypes.forEach(type => {
107+
process.on(type, async e => {
108+
try {
109+
console.log(`process.on ${type}`)
110+
console.error(e)
111+
await consumer.disconnect()
112+
process.exit(0)
113+
} catch (_) {
114+
process.exit(1)
115+
}
116+
})
117+
})
118+
119+
signalTraps.forEach(type => {
120+
process.once(type, async () => {
121+
try {
122+
await consumer.disconnect()
123+
} finally {
124+
process.kill(process.pid, type)
125+
}
126+
})
127+
})
129128

130129
}
131130

@@ -135,11 +134,12 @@ async function dataHandler(consumer, handlers) {
135134
* @param {Object} handlers the handlers
136135
*/
137136
async function retryEmail(handlers) {
138-
const models = await models.Email.findAll({ where: { status: 'FAILED', createdAt: { $gt: new Date(new Date() - config.EMAIL_RETRY_MAX_AGE) } } })
137+
const loader = await models.loadEmailModule()
138+
const emailModel = await loader.findAll({ where: { status: 'FAILED', createdAt: { $gt: new Date(new Date() - config.EMAIL_RETRY_MAX_AGE) } } })
139139

140-
if (models.length > 0) {
141-
logger.info(`Found ${models.length} e-mails to be resent`);
142-
models.map(async m => {
140+
if (emailModel.length > 0) {
141+
logger.info(`Found ${emailModel.length} e-mails to be resent`);
142+
emailModel.map(async m => {
143143
// find handler
144144
const handler = handlers[m.topicName];
145145
if (!handler) {

src/models/Email.js

Lines changed: 0 additions & 27 deletions
This file was deleted.

src/models/datasource.js

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
/**
2-
* Copyright (C) 2018 Topcoder Inc., All Rights Reserved.
2+
* Copyright (C) 2022 Topcoder Inc., All Rights Reserved.
33
*/
44

55
/**
66
* Init datasource
77
*
88
* @author TCSCODER
9-
* @version 1.0
9+
* @version 2.0
1010
*/
1111

1212
const config = require('config');

src/models/index.js

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,24 @@
11
/**
2-
* Copyright (C) 2018 TopCoder Inc., All Rights Reserved.
2+
* Copyright (C) 2022TopCoder Inc., All Rights Reserved.
33
*/
44

5-
/**
6-
* the sequelize schema index
7-
*
8-
* @author TCSCODER
9-
* @version 1.0
10-
*/
5+
116

127
const sequelizeInstance = require('./datasource');
138
const DataTypes = require('sequelize/lib/data-types');
14-
const defineEmailModel = require('./Email')
9+
const logger = require('../common/logger');
10+
11+
async function defineEmailModel(sequelize, DataTypes) {
12+
const Email = sequelize.define('Email', {
13+
id: { type: DataTypes.BIGINT, primaryKey: true, autoIncrement: true },
14+
topicName: { type: DataTypes.STRING, allowNull: true, field: 'topic_name' },
15+
data: { type: DataTypes.TEXT, allowNull: false },
16+
recipients: { type: DataTypes.STRING, allowNull: false },
17+
status: { type: DataTypes.STRING, allowNull: false },
18+
});
19+
await Email.sync();
20+
return Email;
21+
}
1522

1623
async function loadSequelizeModule() {
1724
return await sequelizeInstance.getSequelize();
@@ -22,6 +29,7 @@ async function loadEmailModule() {
2229
}
2330

2431
async function init() {
32+
logger.info("Initializing models");
2533
const sequelize = await loadSequelizeModule();
2634
await sequelize.sync();
2735
}

0 commit comments

Comments
 (0)