48hr.email/infrastructure/web/template-context.js

115 lines
4.2 KiB
JavaScript

const config = require('../../application/config')
const Helper = require('../../application/helper')
/**
* Template Context Builder
* Generates common variables for all template renders
*/
class TemplateContext {
constructor() {
this.helper = new Helper()
this.purgeTime = this.helper.purgeTimeElemetBuilder()
// Cache domains to avoid reprocessing on every request
this.cachedDomains = this.helper.getDomains()
}
/**
* Get base context that should be available in all templates
* @param {Object} req - Express request object
* @returns {Object} Base template context
*/
getBaseContext(req) {
const inboxLock = req.app.get('inboxLock')
const address = req.params && req.params.address
const userId = req.session && req.session.userId
const isAuthenticated = !!(req.session && req.session.userId)
// Calculate lock status for current address
const isLocked = address && inboxLock ? inboxLock.isLocked(address) : false
const hasAccess = address && isAuthenticated && userId && inboxLock ?
(inboxLock.isLockedByUser(address, userId) || req.session.lockedInbox === address) :
(address && req.session && req.session.lockedInbox === address)
// Get user's verified forward emails if logged in
let userForwardEmails = []
if (isAuthenticated && userId) {
const userRepository = req.app.get('userRepository')
if (userRepository) {
userForwardEmails = userRepository.getForwardEmails(userId)
}
}
return {
// Config values
config: config,
branding: config.http.features.branding || ['48hr.email', 'Service', 'https://example.com'],
purgeTime: this.purgeTime,
purgeTimeRaw: config.email.purgeTime,
expiryTime: config.email.purgeTime.time,
expiryUnit: config.email.purgeTime.unit,
refreshInterval: config.imap.refreshIntervalSeconds,
locktimer: config.user.lockReleaseHours,
// Feature flags
authEnabled: config.user.authEnabled,
statisticsEnabled: config.http.features.statistics,
smtpEnabled: config.email.features.smtp,
showInfoSection: config.http.features.infoSection,
// User session & authentication
currentUser: req.session && req.session.username ? req.session.username : null,
isAuthenticated: isAuthenticated,
userForwardEmails: userForwardEmails,
// Lock status
isLocked: isLocked,
hasAccess: hasAccess,
// Session messages/errors (auto-clear after reading)
error: this._getAndClearSession(req, 'lockError'),
unlockError: this._getAndClearSession(req, 'unlockError'),
errorMessage: this._getAndClearSession(req, 'errorMessage'),
// Query parameters
verificationSent: req.query && req.query.verificationSent === 'true',
verificationEmail: req.query && req.query.email || '',
forwardSuccess: req.query && req.query.forwarded === 'true',
forwardAllSuccess: req.query && req.query.forwardedAll ? parseInt(req.query.forwardedAll) : null,
// Request info
redirectTo: req.originalUrl,
address: address,
// Common data
domains: this.cachedDomains,
example: config.email.examples.account
}
}
/**
* Helper to get and clear session value
* @private
*/
_getAndClearSession(req, key) {
if (!req.session) return undefined
const value = req.session[key]
delete req.session[key]
return value
}
/**
* Merge base context with page-specific data
* @param {Object} req - Express request object
* @param {Object} pageData - Page-specific template data
* @returns {Object} Complete template context
*/
build(req, pageData = {}) {
return {
...this.getBaseContext(req),
...pageData
}
}
}
// Export singleton instance
module.exports = new TemplateContext()