Add sessionHolding template, unique 8-digit codes, reason slot for sessionCancelled, and disable unused notifications

This commit is contained in:
2026-08-21 10:44:51 +03:30
parent 5328f36f06
commit 091e519280
28 changed files with 2180 additions and 280 deletions
@@ -8,6 +8,9 @@ const config = require('../../config/config');
const { commitTempFile, generatePresignedUrl, deleteFromBucket } = require('../../utils/s3Client');
const eventEmitter = require('../../events/eventEmitter');
const EVENT_NAMES = require('../../constants/eventNames');
const { notifyAction } = require('../../utils/actionNotify');
const { sendCertificateIssuedSms } = require('../../utils/senders/smsMessages');
const Course = require('../courses/courseModel');
const { parsePaginationAndSort, buildFilterQuery, calculateMeta } = require('../../utils/pagination');
const BUCKET = 'certificates';
@@ -54,6 +57,30 @@ const createCertificate = async (data) => {
eventEmitter.emit(EVENT_NAMES.CERTIFICATE_ISSUED, { certificateId: certificate._id, userId: user._id });
try {
let courseName = '';
if (certificate.course) {
const course = await Course.findById(certificate.course).select('title').lean();
courseName = course?.title || '';
}
await notifyAction({
actionKey: 'certificateIssued',
userId: user._id,
phoneNumber: user.phoneNumber,
email: user.email,
subject: 'صدور گواهینامه',
body: `گواهینامه «${certificate.title}» با کد ${certificate.uniqueCode || ''} صادر شد.`,
smsHandler: () => sendCertificateIssuedSms(user.phoneNumber, {
fullName: user.name || '',
certificateTitle: certificate.title,
certificateCode: certificate.uniqueCode || '',
courseName
}, user._id)
});
} catch {
// Notification failure should not block certificate creation
}
return withAccessUrl(certificate);
};