UNPKG

signup-login-with-authorizedotnet

Version:
421 lines (367 loc) 11.7 kB
'use strict'; var path = require('path'); var createSubscription = require('../../service/createSubscription') var updateSubscription = require('../../service/updateSubscription') var cancelSubscription = require('../../service/cancelSubscription') var getSubscription = require('../../service/getSubscription') const sgMail = require('@sendgrid/mail'); sgMail.setApiKey('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') const loggingService = require('../../service/loggingService'); var utils = require('../../../loopback/lib/utils'); var g = require('../../../loopback/lib/globalize'); var modelName = path.basename(__filename, path.extname(__filename)) module.exports = function(Users) { Users.signup = function(credentials, fn) { credentials.email = credentials.email.toLowerCase(); fn = fn || utils.createPromiseCallback(); Users.create(credentials, function(err, result) { if(err) { var defaultError = new Error(g.f(err.message)); defaultError.statusCode = 400; defaultError.code = 'BAD_REQUEST'; fn(defaultError); } else { createSubscription.createSubscription(credentials, function (err, transaction_result) { if (err) { fn(err); } else { if(transaction_result.messages.resultCode == "Error") { var err1 = new Error(g.f(transaction_result.messages.message[0].text)); err1.statusCode = 401; var code = transaction_result.messages.message[0].text.toUpperCase(); err1.code = code; fn(err1); } else { var where= { "id":result.id}; var data= { "subscription_id":transaction_result.subscriptionId,"subscription_status" : "active"}; Users.upsertWithWhere(where, data , function(err, user) { if (err) { fn(err); } user.subscription_id = transaction_result.subscriptionId; const msg = { to: user.email, from: 'test.nuevesolutions@gmail.com', subject: 'Subscription successfully completed', html: '<strong>Hi </strong>'+user.username+'<p>Your subscription successfully completed</p><p>Your subscription ID: <strong>'+user.subscription_id+'</strong></p>', }; sgMail.send(msg); fn(err, user); }); } } }); } return fn.promise; }) } Users.updateSubscription = function(credentials, fn) { fn = fn || utils.createPromiseCallback(); var subscription_id =credentials.subscription_id; updateSubscription.updateSubscription(subscription_id, credentials , function (err, transaction_result) { if (err) { fn(err); } else { if(transaction_result.messages.resultCode == "Error") { var err1 = new Error(g.f(transaction_result.messages.message[0].text)); err1.statusCode = 401; var code = transaction_result.messages.message[0].text.toUpperCase(); err1.code = code; fn(err1); } else { var where= { "subscription_id":subscription_id}; credentials.subscription_status = "active"; Users.upsertWithWhere(where, credentials , function(err, user) { if (err) { console.log('errors'+err) } else{ console.log(user) fn(err, user); } }); } } return fn.promise; }) } Users.getSubscription = function(subscription_id, fn) { fn = fn || utils.createPromiseCallback(); getSubscription.getSubscription(subscription_id, function (err, transaction_result) { if (err) { fn(err); } else { if(transaction_result.messages.resultCode == "Error") { var err1 = new Error(g.f(transaction_result.messages.message[0].text)); err1.statusCode = 401; var code = transaction_result.messages.message[0].text.toUpperCase(); err1.code = code; fn(err1); } else { fn(err, transaction_result); } } return fn.promise; }) } Users.cancelSubscription = function(subscription_id, fn) { fn = fn || utils.createPromiseCallback(); cancelSubscription.cancelSubscription(subscription_id, function (err, transaction_result) { if (err) { fn(err); } else { if(transaction_result.messages.resultCode == "Error") { var err1 = new Error(g.f(transaction_result.messages.message[0].text)); err1.statusCode = 401; var code = transaction_result.messages.message[0].text.toUpperCase(); err1.code = code; fn(err1); } else { var where= { "subscription_id":subscription_id}; var data = { "subscription_status":"inactive"}; Users.upsertWithWhere(where, data , function(err, user) { if (err) { console.log('errors'+err) } else{ const msg = { to: user.email, from: 'test.nuevesolutions@gmail.com', subject: 'Subscription successfully cancelled', html: '<strong>Hi </strong>'+user.username+'<p>Your subscription successfully cancelled</p><p>Your subscription ID :<strong>'+user.subscription_id+'</strong></p>', }; sgMail.send(msg); fn(err, user); } }); } } return fn.promise; }) } Users.remoteMethod('signup',{ "accepts": [{"arg":"credentials","type":modelName,"description":"User credentials","required":true,"http":{"source":"body"}}], "returns": [ { "arg": "response", "type": modelName } ], "description":modelName+" signup with payment", "http": [ { "path": "/", "verb": "post" } ] }); Users.remoteMethod('updateSubscription',{ "accepts": [ {arg: 'credentials', type: 'object', model: modelName, http: {source: 'body'}, description: 'An object of update fields and subscription_id'}], "returns": [ { "arg": "response", "type": modelName, "root": true } ], "description": "Update "+ modelName+" payment subscription", "http": [ { "path": "/updateSubscription", "verb": "post" } ] }); Users.remoteMethod('getSubscription',{ "accepts": [ {arg: 'subscription_id', type: 'string', http: {source: 'body'}, description: 'Subscription ID'}, ], "returns": [ { "arg": "response", "type": modelName, "root": true } ], "description": "Get "+modelName+" subscription detais.", "http": [ { "path": "/getSubscription", "verb": "post" } ] }); Users.remoteMethod('cancelSubscription',{ "accepts": [ {arg: 'subscription_id', type: 'string', http: {source: 'body'}, description: 'Subscription ID'}, ], "returns": [ { "arg": "response", "type": modelName } ], "description": "Cancel "+modelName+" user payment subscription", "http": [ { "path": "/cancelSubscription", "verb": "post" } ] }); Users.normalizeCredentials = function(credentials, realmRequired, realmDelimiter) { var query = {}; credentials = credentials || {}; if (!realmRequired) { if (credentials.email) { query.email = credentials.email.toLowerCase(); } else if (credentials.username) { query.username = credentials.username; } } else { if (credentials.realm) { query.realm = credentials.realm; } var parts; if (credentials.email) { parts = splitPrincipal(credentials.email, realmDelimiter); query.email = parts[1]; if (parts[0]) { query.realm = parts[0]; } } else if (credentials.username) { parts = splitPrincipal(credentials.username, realmDelimiter); query.username = parts[1]; if (parts[0]) { query.realm = parts[0]; } } } return query; }; /** * * @param {object} data * @param {Function(Error, object)} callback */ /* User.login = function (credentials, include, callback) { // Invoke the default login function User.find({where: {and: [{email: credentials.email }, {username: 'svl'}]}}, function (err, posts) { console.log(posts) callback(null, posts) }); }; */ Users.login = function(credentials, include, fn) { var self = this; if (typeof include === 'function') { fn = include; include = undefined; } fn = fn || utils.createPromiseCallback(); include = (include || ''); if (Array.isArray(include)) { include = include.map(function(val) { return val.toLowerCase(); }); } else { include = include.toLowerCase(); } var realmDelimiter; // Check if realm is required var realmRequired = !!(self.settings.realmRequired || self.settings.realmDelimiter); if (realmRequired) { realmDelimiter = self.settings.realmDelimiter; } var query = self.normalizeCredentials(credentials, realmRequired, realmDelimiter); if (realmRequired && !query.realm) { var err1 = new Error(g.f('{{realm}} is required')); err1.statusCode = 400; err1.code = 'REALM_REQUIRED'; fn(err1); return fn.promise; } if (!query.email && !query.username) { var err2 = new Error(g.f('{{username}} or {{email}} is required')); err2.statusCode = 400; err2.code = 'USERNAME_EMAIL_REQUIRED'; fn(err2); return fn.promise; } self.findOne({where: query}, function(err, user) { var defaultError = new Error(g.f('login failed')); defaultError.statusCode = 401; defaultError.code = 'LOGIN_FAILED'; function tokenHandler(err, token) { if (err) return fn(err); if (Array.isArray(include) ? include.indexOf('user') !== -1 : include === 'user') { // NOTE(bajtos) We can't set token.user here: // 1. token.user already exists, it's a function injected by // "AccessToken belongsTo User" relation // 2. ModelBaseClass.toJSON() ignores own properties, thus // the value won't be included in the HTTP response // See also loopback#161 and loopback#162 token.__data.user = user; } fn(err, token); } if (err) { debug('An error is reported from User.findOne: %j', err); fn(defaultError); } else if (user) { user.hasPassword(credentials.password, function(err, isMatch) { if (err) { debug('An error is reported from User.hasPassword: %j', err); fn(defaultError); } else if (isMatch) { if (self.settings.emailVerificationRequired && !user.emailVerified) { // Fail to log in if email verification is not done yet debug('User email has not been verified'); err = new Error(g.f('login failed as the email has not been verified')); err.statusCode = 401; err.code = 'LOGIN_FAILED_EMAIL_NOT_VERIFIED'; err.details = { userId: user.id, }; fn(err); } else { if (user.createAccessToken.length === 2) { user.createAccessToken(credentials.ttl, tokenHandler); } else { user.createAccessToken(credentials.ttl, credentials, tokenHandler); } } } else { debug('The password is invalid for user %s', query.email); fn(defaultError); } }); } else { debug('No matching record is found for user %s', query.email ); fn(defaultError); } }); return fn.promise; }; };