1 | fs = require 'fs'
|
2 | path = require 'path'
|
3 | {EventEmitter} = require 'events'
|
4 | _ = require 'lodash'
|
5 | handlebars = require 'handlebars'
|
6 | nodemailer = require "nodemailer"
|
7 | Promise = require 'bluebird'
|
8 | typeOf = require 'typeof'
|
9 |
|
10 | TestTransport = require './TestTransport'
|
11 |
|
12 | getViews = (viewRoot, name) ->
|
13 | getView = (path) -> handlebars.compile fs.readFileSync path, 'utf8'
|
14 | getPath = (ext) -> path.resolve viewRoot, "#{name}#{ext}.handlebars"
|
15 | views = {}
|
16 |
|
17 | views.text = if fs.existsSync p = getPath '' then getView p
|
18 | else if fs.existsSync p = getPath '.text' then getView p
|
19 |
|
20 | views.html = getView p if fs.existsSync p = getPath '.html'
|
21 |
|
22 | views
|
23 |
|
24 | class Mailer
|
25 | mainOnly: no
|
26 |
|
27 | constructor: (mailer, @_config, @_transport) ->
|
28 | if _.isFunction mailer
|
29 | @mainOnly = yes
|
30 | mailer = main : mailer
|
31 |
|
32 | if mailer.defaults?
|
33 | @defaults = mailer.defaults
|
34 | delete mailer.defaults
|
35 | else @defaults = {}
|
36 |
|
37 | if @defaults.data and @_config.defaults.data?
|
38 | _.defaults @defaults.data, @_config.defaults.data
|
39 |
|
40 | _.defaults @defaults, @_config.defaults
|
41 |
|
42 | @setMethod name, method for name, method of mailer
|
43 | return @main if @mainOnly
|
44 |
|
45 | setMethod: (name, method) ->
|
46 | templateName = if @mainOnly then @_config.name else name
|
47 | views = getViews @_config.views, templateName
|
48 |
|
49 | @[name] = (args...) =>
|
50 | cb = if _.isFunction _.last args then args.pop() else ->
|
51 | that = mail: (message = {}) => @_mail views, message, cb
|
52 | method.apply that, args
|
53 |
|
54 | _mail: (views = {}, message = {}, cb) ->
|
55 | if message.data? and @defaults.data?
|
56 | _.defaults message.data, @defaults.data
|
57 |
|
58 | _.defaults message, @defaults
|
59 | message.text = views.text message.data if views.text?
|
60 | message.html = views.html message.data if views.html?
|
61 |
|
62 | sendMail = Promise.promisify @_transport.sendMail, @_transport
|
63 |
|
64 | sendMail(message).nodeify cb
|
65 |
|
66 | module.exports = class Hermes extends EventEmitter
|
67 | constructor: (@config, mailers) ->
|
68 | @createTransport()
|
69 | @addMailer name, mailer for name, mailer of mailers
|
70 |
|
71 | createTransport: ->
|
72 | @_transport = switch typeOf @config.transport
|
73 | when 'object' then nodemailer.createTransport @config.transport.type, @config.transport
|
74 | when 'string'
|
75 | if @config.transport is 'test'
|
76 | nodemailer.createTransport TestTransport, hermes: @
|
77 | else
|
78 | throw new Error "Bad Mail Transport"
|
79 | when 'function' then nodemailer.createTransport @config.transport
|
80 | else throw new Error "Bad Mail Transport"
|
81 |
|
82 |
|
83 | addMailer: (name, mailer) ->
|
84 | config = _.clone @config
|
85 | config.name = name
|
86 | config.views = if _.isFunction mailer
|
87 | @config.views
|
88 | else
|
89 | path.resolve @config.views, name
|
90 |
|
91 | @[name] = new Mailer mailer, config, @_transport
|
92 |
|
93 |
|
94 |
|
95 |
|
96 | close: -> @_transport.close() |
\ | No newline at end of file |