Skip to content

Commit

Permalink
Updates to Notifications and corrections to revision strategy
Browse files Browse the repository at this point in the history
  • Loading branch information
abdulFarooqui committed Feb 5, 2025
1 parent 68cba25 commit 12653c5
Show file tree
Hide file tree
Showing 33 changed files with 1,028 additions and 966 deletions.
5 changes: 1 addition & 4 deletions Phase2/clients/Auth/keycloak.js
Original file line number Diff line number Diff line change
Expand Up @@ -66,13 +66,12 @@ const _getAuthTokenDecoded = (req) => {
return jwt.decode(userAuthz?.tokenSet?.access_token)
}

const getServiceUserToken = async (access_token) => {
const getServiceUserToken = async () => {
let options = {
method: 'POST',
url: issuerMetadata.token_endpoint,
headers: {
"Content-Type": "application/x-www-form-urlencoded",
"Authorization": "Bearer " + access_token
},
data: qs.stringify(serviceUserMetadata)
}
Expand Down Expand Up @@ -189,8 +188,6 @@ const getReviewerEmails = async (reviewer_type = roleNames.REVIEWER, serviceUser
const getSubmitterEmail = async (submitterId, serviceUserToken) => {
let user = await _getUserById(submitterId, serviceUserToken)

console.log(user)

return user.email;
}

Expand Down
10 changes: 10 additions & 0 deletions Phase2/clients/Config/config.json
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,15 @@
"REVIEWER": "Registry_reviewer",
"ONBOARDING_MANAGER": "Onboarding_manager",
"ADMIN": "Registry_admin"
},
"enrollmentReviewStatuses": {
"PENDING": "pending",
"APPROVED": "approved",
"REJECTED": "rejected"
},
"networkSubmissionStatuses": {
"PENDING": "Submitted",
"APPROVED": "Accepted and Published",
"REJECTED": "Rejected"
}
}
1 change: 0 additions & 1 deletion Phase2/clients/Config/keycloak.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
{
"realm": "RegiTRUST",
"realmAdminEmail": "admin-email",
"auth-server-url": "keycloak-server-url",
"ssl-required": "external",
"resource": "keycloak-client",
Expand Down
4 changes: 2 additions & 2 deletions Phase2/clients/data/TRAIN/trainApiService.js
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@ const getTspHistory = async (tspid = '', token) => {
})
.then(res => res.data)
.catch(err => {
console.log(err);
// console.log(err);
return null;
});

Expand All @@ -54,7 +54,7 @@ const getTspDetail = async (tspid, version = null,token) => {
})
.then(res => res.data)
.catch(err => {
console.log(err);
// console.log(err);
return null;
});

Expand Down
27 changes: 19 additions & 8 deletions Phase2/clients/data/submissionFormatting/submissionFormatting.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
var SubmissionModel = require('../../data/MongoDB/mongoose').SubmissionModel;

const formatDate = (date) => {
const options = {
year: 'numeric',
Expand Down Expand Up @@ -48,15 +50,27 @@ const mongoToForm = (submission) => {
//Each key and value formatted as labels and values as they will appear on screen
// Object format:
// { Formatted Field Label : Formatted Field Value }
const mongoToReview = (submission, formType = "network") => {
const mongoToReview = async (submission, formType = "network") => {
//Review Information section
const ReviewInfo = submission.ReviewInfo
let ReviewInfo = submission.ReviewInfo
if(!ReviewInfo) {
let localSubmission = await SubmissionModel.findOne({ "TrustServiceProvider.TSPID": submission.TSPID }).select('ReviewInfo')
ReviewInfo = localSubmission.ReviewInfo
}

let SubmitterInfo = submission.Submitter
if(formType !== "enroll"){
if(!SubmitterInfo) {
let localSubmission = await SubmissionModel.findOne({ "TrustServiceProvider.TSPID": submission.TSPID }).select('Submitter')
SubmitterInfo = localSubmission.Submitter
}
}

return Object.assign(jsonToDetailPage(submission, formType), { ReviewInfo })
return Object.assign(jsonToDetailPage(submission, formType), { ReviewInfo, SubmitterInfo })
}

const jsonToDetailPage = (json, formType = "network") => {
const _id = json && json._id ? json._id : null;
const _id = json && json._id ? json._id : json.TSPID ? json.TSPID : null;

switch(formType) {
case "framework":
Expand Down Expand Up @@ -150,10 +164,7 @@ const jsonToDetailPage = (json, formType = "network") => {
let opsAgent = service.OpsAgentInfo

return Object.assign( { "Name:": opsAgent.OpsAgentName.Name }, buildAddressViewFormat(opsAgent.OpsAgentAddress))
})

console.log(json);

})

json = json.SubmitterInfo

Expand Down
122 changes: 85 additions & 37 deletions Phase2/clients/notifications/emailService.js
Original file line number Diff line number Diff line change
@@ -1,11 +1,10 @@
const nodemailer = require('nodemailer')
const smtp = require('../Config/config.json').Notifications
const client = require('../Config/config.json').Client
const realmAdminEmail = require('../Config/keycloak.json').realmAdminEmail
const pug = require('pug')
const { getReviewerEmails, getSubmitterEmail, getServiceUserToken } = require('../Auth/keycloak')
const fs = require('fs')
const roleNames = require('../Config/config.json').roleNames
const { roleNames, networkSubmissionStatuses } = require('../Config/config.json')

const templatePath = './notifications/emailTemplates/'
const linkBaseUrl = client.hostname
Expand All @@ -27,105 +26,154 @@ const mailCallback = (err, info) => {
console.error(err)

else {
console.log(info)
logNotification(info.envelope.to[0])
}
}

const logNotification = (recipient) => {
const line = `\n${new Date().toLocaleString()} -- Email sent to ${recipient}`

fs.appendFile('./logs/emailNotifLog.txt', line, err => { if(err) console.error(err) })
fs.mkdir('./logs', { recursive: true }, (err) => {
if (err) return console.error('Error creating log directory:', err);

fs.appendFile('./logs/emailNotifLog.txt', line, { flag: 'a' }, (err) => {
if (err) console.error('Error writing to log:', err);
});
});
}

const notifyNewSubmission = async (entityName, submissionId, accessToken) => {
const submissionReviewLink = reviewLink + submissionId
const html = pug.renderFile(templatePath + 'receivedSubmission.pug', { entityName, submissionReviewLink })

const reviewerEmails = await getReviewerEmails(undefined, accessToken)
reviewerEmails?.forEach(toAddr => {
const message = {
from: '[email protected]',
to: toAddr,
subject: `New Submission from ${entityName}`,
html
const message = {
from: smtp.username,
subject: `[RegiTrust] New Submission from ${entityName}`,
html
}
for (const toAddr of reviewerEmails) {
message.to = toAddr;
try {
await new Promise((resolve, reject) => {
transport.sendMail(message, (error, info) => {
mailCallback(error, info);

if (error) return reject(error);
resolve(info);
});
});
} catch (error) {
console.error("Error sending email to", toAddr, error);
}

transport.sendMail(message, mailCallback)
})
}
}

const notifyNewEnrollmentRequest = async (submitterEmail, entityName, submissionId, accessToken) => {
const submissionReviewLink = reviewEnrollmentLink + submissionId
html = pug.renderFile(templatePath + 'receivedEnrollmentRequest.pug', { entityName, submissionReviewLink, isReviewer: true })

accessToken = await getServiceUserToken()

/********************message to reviewers********************/
let message = {
from: '[email protected]',
subject: `New Enrollment Request from ${entityName}`,
from: smtp.username,
subject: `[RegiTrust] New Enrollment Request from ${entityName}`,
html
};

const reviewerEmails = await getReviewerEmails(roleNames.ONBOARDING_MANAGER, accessToken)
reviewerEmails?.forEach(toAddr => {
const reviewerEmails = await getReviewerEmails(roleNames.ONBOARDING_MANAGER, accessToken);
for (const toAddr of reviewerEmails) {
message.to = toAddr;
transport.sendMail(message, mailCallback)
})
try {
await new Promise((resolve, reject) => {
transport.sendMail(message, (error, info) => {
mailCallback(error, info);

if (error) return reject(error);
resolve(info);
});
});
} catch (error) {
console.error("Error sending email to", toAddr, error);
}
}

/********************message to submitter********************/
message.to = submitterEmail,
message.subject = `Enrollment Request from ${entityName} Confirmation`,
message.subject = `[RegiTrust] Enrollment Request from ${entityName} Confirmation`,
message.html = pug.renderFile(templatePath + 'receivedEnrollmentRequest.pug', { entityName, submissionReviewLink, isReviewer: false });

transport.sendMail(message, mailCallback)
}

const notifySubmissionUpdated = (submitterEmail, entityName, submissionId) => {
const notifySubmissionUpdated = async (submitterId, entityName, submissionId, isSubmitterEdit) => {
const submissionReviewLink = reviewLink + submissionId
const html = pug.renderFile(templatePath + 'submissionUpdated.pug', { entityName, submissionReviewLink })
const html = pug.renderFile(templatePath + 'submissionUpdated.pug', { entityName, submissionReviewLink, isSubmitterEdit })

const accessToken = await getServiceUserToken()
const submitterEmail = await getSubmitterEmail(submitterId, accessToken)

const message = {
from: '[email protected]',
from: smtp.username,
to: submitterEmail,
subject: 'A Reviewer has Made Changes to Your Submission',
html
}

transport.sendMail(message, mailCallback)
if(!isSubmitterEdit) {
message.subject = `[RegiTrust] A Reviewer has Made Changes to Your Submission`;
transport.sendMail(message, mailCallback)
}else{
message.subject = `[RegiTrust] A Submission has been Updated`
const accessToken = await getServiceUserToken()
const reviewerEmails = await getReviewerEmails(roleNames.REVIEWER, accessToken)
for (const toAddr of reviewerEmails) {
message.to = toAddr;
try {
await new Promise((resolve, reject) => {
transport.sendMail(message, (error, info) => {
mailCallback(error, info);

if (error) return reject(error);
resolve(info);
});
});
} catch (error) {
console.error("Error sending email to", toAddr, error);
}
}
}
}

const notifySubmissionReviewed = async (submitterId, entityName, reviewStatus, submissionId) => {
const submissionReviewLink = reviewLink + submissionId
const html = pug.renderFile(templatePath + 'submissionReviewed.pug', { entityName, reviewStatus, submissionReviewLink })
const html = pug.renderFile(templatePath + 'submissionReviewed.pug', { entityName, isApproved: reviewStatus == networkSubmissionStatuses.APPROVED, submissionReviewLink })

const accessToken = await getServiceUserToken()
const submitterEmail = await getSubmitterEmail(submitterId, accessToken)

const message = {
from: '[email protected]',
from: smtp.username,
to: submitterEmail,
subject: `A Reviewer has ${reviewStatus} Your Submission`,
subject: `[RegiTrust] A Reviewer has ${reviewStatus} Your Submission`,
html
}

transport.sendMail(message, mailCallback)
}

const notifyEnrollmentRequestReviewed = async (submitterEmail, entityName, reviewStatus, submissionId) => {
const submissionReviewLink = reviewEnrollmentLink + submissionId
html = pug.renderFile(templatePath + 'enrollmentRequestReviewed.pug', { entityName, reviewStatus, submissionReviewLink, isAdmin: false })
const notifyEnrollmentRequestApproved = async (submitterEmail, entityName) => {
html = pug.renderFile(templatePath + 'enrollmentRequestApproved.pug', { entityName })

/**************Notify Submitter********************** */
const message = {
from: '[email protected]',
from: smtp.username,
to: submitterEmail,
subject: `Enrollment Request Reviewed`,
subject: `[RegiTrust] Enrollment Request has Been Reviewed`,
html
}

if(reviewStatus == "Approved"){
transport.sendMail(message, mailCallback)
}
transport.sendMail(message, mailCallback)
}

module.exports = { notifyNewSubmission, notifyNewEnrollmentRequest, notifySubmissionUpdated, notifySubmissionReviewed, notifyEnrollmentRequestReviewed }
module.exports = { notifyNewSubmission, notifyNewEnrollmentRequest, notifySubmissionUpdated, notifySubmissionReviewed, notifyEnrollmentRequestApproved }
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
html(lang='en')
body
h1 Regi-Trust Registry Network
h2=`${isReviewer ? 'A new Registry Service Provider Enrollment request was submitted for' : 'We have received your enrollment request for'} ${entityName}`
p
a(href=submissionReviewLink) Click here
span to review this request.
if isReviewer
p A new Trust Service Provider Enrollment request has been received for #{entityName}.
p
a(href=submissionReviewLink) Click here
span to review this request.
else
p Your enrollment request for #{entityName} is under review. You will be notified if approved.
br
p RegiTrust
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
html(lang='en')
body
h1 Regi-Trust Registry Network
h2 A new registry entry has been submitted for review
p=`${entityName} has created a registry entry and submitted it for you to review.`
h2 Next steps:
p A new network entry has been submitted for #{entityName}.
p
a(href=submissionReviewLink) Click here
span to review this submission, make changes, or accept it into the registry.
span to review this submission, make changes, or accept it into the registry.
br
p RegiTrust
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
html(lang='en')
body
h1 Regi-Trust Registry Network
h2 Your registry entry has been !{reviewStatus}
p=`Your registry entry submission for ${entityName} was ${reviewStatus} by a registry reviewer${reviewStatus === 'Accepted and Published' ? ' and the entry was added to the registry' : ''}. `
p Your network entry for #{entityName} was #{isApproved ? 'approved' : 'declined'}. by a registry reviewer #{isApproved ? 'and has been added to the registry' : ''}.
p
a(href=submissionReviewLink) Click here
span to view the submission.
span to view the submission.
br
p RegiTrust
19 changes: 12 additions & 7 deletions Phase2/clients/notifications/emailTemplates/submissionUpdated.pug
Original file line number Diff line number Diff line change
@@ -1,9 +1,14 @@
html(lang='en')
body
h1 Regi-Trust Registry Network
h2 Changes were made to your registry entry submission by a reviewer
p=`Your registry entry submission for ${entityName} was altered by a registry reviewer after their initial review.`
h2 Next steps:
p
a(href=submissionReviewLink) Click here
span to view these changes or make any necessary updates.
if isSubmitterEdit
p A submission for #{entityName} has been updated.
p
a(href=submissionReviewLink) Click here
span to view these changes or make any updates.
else
p Your network entry submission for #{entityName} was modified by a registry reviewer.
p
a(href=submissionReviewLink) Click here
span to view these changes or make any necessary updates.
br
p RegiTrust
Loading

0 comments on commit 12653c5

Please sign in to comment.