node-payments
Version:
node-payments is a express based facade to multiple payment services.
164 lines (142 loc) • 4.04 kB
text/coffeescript
config = require( "./config" )
_ = require( "lodash" )
Redirects = require( "./redirects" )
MemoryStore = require( "./paymentstores/memorystore" )
module.exports = class Payments extends require( "./basic" )
constructor: ( options )->
# initialize configuration
config.init( options )
super( options )
= false
# proxy the methods until the module is ready
=
=
=
# init the payment store
if not options?.express?
= new Redirects( @ )
else
= new Redirects( @, options.express )
= {}
# init internal providers
_providers = config.get( "providers" )
"list of standard providers", _providers
for type in config.get( "providers" )
try
catch _err
#console.log _err.stack
if _err?.customError?
throw _err
return
return
# init the payment store
if not options?.paymentStore?
else
return
getExpress: =>
return .server
getUrls: ( pid = ":pid", prefix = "" )=>
_baseroute = config.get( "baseroute" )
if _.isFunction( _baseroute )
success: _baseroute( @, "success", pid )
cancel: _baseroute( @, "cancel", pid )
else
success: "#{ prefix }#{ _baseroute }success/#{ pid }"
cancel: "#{ prefix }#{ _baseroute }cancel/#{ pid }"
initPaymentStore: ( store )=>
# check for existing methods
for _m in [ "connect", "get", "set", "destroy" ] when not ( store[ _m ]? or _.isFunction( store[ _m ] ) )
return
store.on "connect", =>
"payment store connected"
= true
"ready"
return
store.on "disconnect", =>
"payment store disconnected"
= false
return
= store
store.connect()
return store
_provider: ( type, cb )=>
if [ type ]?
cb( null, [ type ] )
else
return
_createPayment: ()=>
[ args..., cb ] = arguments
[ type, data ] = args
type, ( err, _prov )=>
if err
cb( err )
return
cb( null, _prov.create( data ) )
return
return
addProvider: ( pname, Provider )=>
_provider = new Provider( @ )
[ pname ] = _provider
"added provider `#{pname}`"
return _provider
_getStore: ( cb )=>
cb( null, )
return
onSuccessReturn: ( id, token, payer_id, cb )=>
id, ( err, payment )=>
if err
cb( err )
return
payment.payer_id = payer_id if payer_id?
"payment for execution", payment.valueOf()
payment._executePayment token, ( err )=>
if err
cb( err )
return
cb( null, payment )
return
return
return
onCancelReturn: ( id, cb )=>
id, ( err, payment )=>
if err
cb( err )
return
payment.cancel( cb )
return
return
getPayment: ( id, cb )=>
( err, store )=>
if err
cb( err )
return
store.get id, ( err, data )=>
if err
cb( err )
return
if not data?
return
"got data from store", data
data?.provider, data, ( err, payment )=>
if err
cb( err )
return
cb( null, payment)
return
return
return
return
ERRORS: =>
super,
"EPAYMENTNOTFOUND": "the Payment with id `<%= id %>` is not availible."
"EREQUIREPROVIDER": "The provider `<%= type %>` cannot be required."
"EUINVALIDPROVIDER": "The provider `<%= type %>` is not valid. Please use one of `<%= types %>`."
"ESTOREVALIDATION": "The user payment store misses a method called `.<%= method %>()`."