Implemented basic transactional emails API
This commit is contained in:
		
							parent
							
								
									913c7dc337
								
							
						
					
					
						commit
						4a521a8f0f
					
				
					 4 changed files with 107 additions and 1 deletions
				
			
		|  | @ -8,6 +8,10 @@ const fs = require('fs-extra-promise'); | |||
| const tryRequire = require('try-require'); | ||||
| const posix = tryRequire('posix'); | ||||
| 
 | ||||
| // process.getuid and process.getgid are not supported on Windows 
 | ||||
| process.getuid = process.getuid || (() => 100); | ||||
| process.getgid = process.getuid || (() => 100); | ||||
| 
 | ||||
| function _getConfigUidGid(userKey, groupKey, defaultUid, defaultGid) { | ||||
|     let uid = defaultUid; | ||||
|     let gid = defaultGid; | ||||
|  |  | |||
							
								
								
									
										75
									
								
								server/lib/template-sender.js
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										75
									
								
								server/lib/template-sender.js
									
										
									
									
									
										Normal file
									
								
							|  | @ -0,0 +1,75 @@ | |||
| 'use strict'; | ||||
| 
 | ||||
| const contextHelpers = require('./context-helpers'); | ||||
| const mailers = require('./mailers'); | ||||
| const templates = require('../models/templates'); | ||||
| 
 | ||||
| class TemplateSender { | ||||
|     constructor({ templateId, maxMails = 100 } = {}) { | ||||
|         if (!templateId) { | ||||
|             throw new Error('Cannot create template sender without templateId'); | ||||
|         } | ||||
| 
 | ||||
|         this.templateId = templateId; | ||||
|         this.maxMails = maxMails; | ||||
|     } | ||||
| 
 | ||||
|     async send(options) { | ||||
|         this._validateMailOptions(options); | ||||
| 
 | ||||
|         const [mailer, template] = await Promise.all([ | ||||
|             mailers.getOrCreateMailer(), | ||||
|             templates.getById( | ||||
|                 contextHelpers.getAdminContext(), | ||||
|                 this.templateId, | ||||
|                 false | ||||
|             ) | ||||
|         ]); | ||||
| 
 | ||||
|         const html = this._substituteVariables( | ||||
|             template.html, | ||||
|             options.variables | ||||
|         ); | ||||
|         return mailer.sendTransactionalMail( | ||||
|             { | ||||
|                 to: options.email, | ||||
|                 subject: options.subject | ||||
|             }, | ||||
|             { | ||||
|                 html: { template: html }, | ||||
|                 locale: options.locale | ||||
|             } | ||||
|         ); | ||||
|     } | ||||
| 
 | ||||
|     _validateMailOptions(options) { | ||||
|         let { email, locale } = options; | ||||
| 
 | ||||
|         if (!email || email.length === 0) { | ||||
|             throw new Error('Missing email'); | ||||
|         } | ||||
|         if (typeof email === 'string') { | ||||
|             email = email.split(','); | ||||
|         } | ||||
|         if (email.length > this.maxMails) { | ||||
|             throw new Error( | ||||
|                 `Cannot send more than ${this.maxMails} emails at once` | ||||
|             ); | ||||
|         } | ||||
|         if (!locale) { | ||||
|             throw new Error('Missing locale'); | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     _substituteVariables(html, variables) { | ||||
|         if (!variables) return html; | ||||
|         return Object.keys(variables).reduce((res, key) => { | ||||
|             return res.replace( | ||||
|                 new RegExp(`\\[${key}\\]`, 'gmi'), | ||||
|                 variables[key] | ||||
|             ); | ||||
|         }, html); | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| module.exports = TemplateSender; | ||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue