@universis/dining
Version:
Universis api for dining
139 lines (124 loc) • 3.98 kB
JavaScript
;Object.defineProperty(exports, "__esModule", { value: true });exports.afterSave = afterSave;var _mailer = require("@themost/mailer");
var _data = require("@themost/data");
var _common = require("@themost/common");
/**
* @param {DataEventArgs} event
*/
async function afterSaveAsync(event) {
if (event.state === 2) {
const context = event.model.context;
/**
* @type {import('@themost/mailer').MailerHelper}
*/
const mailer = (0, _mailer.getMailer)(context);
const currentCardStatus = await context.
model('StudentDiningCard').
where('id').
equal(event.target.id).
select('active').
value();
let previousCardStatus = 'UnknownStatus';
if (event.previous) {
previousCardStatus = event.previous.active;
} else {
throw new _data.DataError('E_STATE', 'The previous state of an object cannot be determined', null, 'StudentDiningCard');
}
if (currentCardStatus === previousCardStatus) {
return;
}
// get mail template
const mailTemplate = await context.
model('MailConfigurations').
where('target').
equal('DiningCardActiveStatusChange').
silent().
getItem();
if (mailTemplate == null) {
//
return;
}
//get parent action data
let item;
if (typeof event.target.action === 'object' && typeof event.target.action.id === 'number' && Number.isInteger(event.target.action.id) && event.target.action.id > 0) {
item = await context.
model('DiningRequestAction').
where('id').
equal(event.target.action.id).
expand({
name: 'student',
options: {
$expand: 'person' } }).
silent().
getItem();
} else if (typeof event.target.action === 'number' && Number.isInteger(event.target.action) && event.target.action > 0) {
item = await context.
model('DiningRequestAction').
where('id').
equal(event.target.action).
expand({
name: 'student',
options: {
$expand: 'person' } }).
silent().
getItem();
}
const application = await context.
model('WebApplication').
where('alternateName').
equal('students').
and('applicationSuite').
equal('universis').
silent().
getItem();
const config = await context.
model('StudentRequestConfiguration').
where('additionalType').
equal('DiningRequestAction').
and('inLanguage').
equal(event.target.inLanguage || context.locale).
silent().
getItem();
if (item && application && config) {
const email = item.student.person.email;
if (email == null || typeof email !== 'string') {
_common.TraceUtils.warn(`Cannot send email for ${item.student.person.familyName} ${item.student.person.givenName}. Student [${item.student.id}] email does not exist.`);
return;
}
await new Promise(resolve => {
mailer.template(mailTemplate.template).
subject(mailTemplate.subject).
bcc(mailTemplate.bcc || '').
to(email).
send({
model: item,
application: application,
configuration: config },
err => {
if (err) {
try {
_common.TraceUtils.error('An error occurred while trying to send an email notification after status change.');
_common.TraceUtils.error(`Student=${item.student.id}, template=${mailTemplate.template}`);
_common.TraceUtils.error(err);
} catch (err1) {
// do nothing
}
return resolve();
}
return resolve();
});
});
}
}
}
/**
* @param {DataEventArgs} event
* @param {Function} callback
*/
function afterSave(event, callback) {
return afterSaveAsync(event).then(() => {
return callback();
}).catch(err => {
return callback(err);
});
}
//# sourceMappingURL=SendEmailAfterCardStatusChangeListener.js.map