diff --git a/.gitignore b/.gitignore index e7b9316..ee1d8c0 100644 --- a/.gitignore +++ b/.gitignore @@ -69,4 +69,4 @@ typings/ .vscode #build -./dist \ No newline at end of file +dist \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 4334100..4bf8c23 100644 --- a/.travis.yml +++ b/.travis.yml @@ -13,4 +13,6 @@ env: before_script: - npm run build script: - - npm test \ No newline at end of file + - npm test +after_success: + - npm run coverage \ No newline at end of file diff --git a/dist/controllers/account.controller.js b/dist/controllers/account.controller.js deleted file mode 100644 index 53f1886..0000000 --- a/dist/controllers/account.controller.js +++ /dev/null @@ -1,164 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _account = _interopRequireDefault(require("../services/account.service")); - -var _ResponseGenerator = _interopRequireDefault(require("../utils/ResponseGenerator")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var response = new _ResponseGenerator["default"](); -/** - * account controller performs account related function - CRUD - */ - -var AccountController = -/*#__PURE__*/ -function () { - function AccountController() { - _classCallCheck(this, AccountController); - } - - _createClass(AccountController, null, [{ - key: "createBankAccount", - - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof AccountController - */ - value: function createBankAccount(req, res) { - var id = req.token.id; - var _req$body = req.body, - type = _req$body.type, - balance = _req$body.balance; - - try { - var account = _account["default"].createAccount(id, type, balance); - - if (account) { - response.setSuccess(201, account); - } - - return response.send(res); - } catch (error) { - response.setError(400, error.message); - return response.send(res); - } - } - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof AccountController - */ - - }, { - key: "fetchAllAccounts", - value: function fetchAllAccounts(req, res) { - var accounts = _account["default"].getAllAccounts(); - - if (accounts.length > 0) { - response.setSuccess(200, { - accounts: accounts - }); - } else { - response.setError(204, 'no account has been created'); - } - - return response.send(res); - } - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof AccountController - */ - - }, { - key: "changeStatus", - value: function changeStatus(req, res) { - var status = req.body.status; - var accountNumber = req.params.accountNumber; - - try { - var data = _account["default"].changeAccountStatus(accountNumber, status); - - if (data) { - response.setSuccess(200, data); - } - - return response.send(res); - } catch (error) { - response.setError(400, error.message); - return response.send(res); - } - } - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof AccountController - */ - - }, { - key: "getAccount", - value: function getAccount(req, res) { - var accountNumber = req.params.accountNumber; - - try { - var data = _account["default"].getAccount(accountNumber); - - if (data) { - response.setSuccess(200, data); - } - - return response.send(res); - } catch (error) { - response.setError(400, error.message); - return response.send(res); - } - } - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof AccountController - */ - - }, { - key: "deleteAccount", - value: function deleteAccount(req, res) { - var accountNumber = req.params.accountNumber; - - try { - var message = _account["default"].deleteAccount(accountNumber); - - if (message) { - response.setSuccess(200, null, message); - } - - return response.send(res); - } catch (error) { - response.setError(400, error.message); - return response.send(res); - } - } - }]); - - return AccountController; -}(); - -var _default = AccountController; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/controllers/transaction.controller.js b/dist/controllers/transaction.controller.js deleted file mode 100644 index d07f6f2..0000000 --- a/dist/controllers/transaction.controller.js +++ /dev/null @@ -1,92 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _transaction = _interopRequireDefault(require("../services/transaction.service")); - -var _ResponseGenerator = _interopRequireDefault(require("../utils/ResponseGenerator")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var response = new _ResponseGenerator["default"](); -/** - * user controller performs user signup and sign in logic - */ - -var TransactionController = -/*#__PURE__*/ -function () { - function TransactionController() { - _classCallCheck(this, TransactionController); - } - - _createClass(TransactionController, null, [{ - key: "debitUserAccount", - - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof TransactionController - */ - value: function debitUserAccount(req, res) { - var amount = req.body.amount; - var id = req.token.id; - var accountNumber = req.params.accountNumber; - - try { - var transaction = _transaction["default"].debitAccount(id, accountNumber, amount); - - if (transaction) { - response.setSuccess(200, transaction); - } - - return response.send(res); - } catch (error) { - response.setError(400, error.message); - return response.send(res); - } - } - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof TransactionController - */ - - }, { - key: "creditUserAccount", - value: function creditUserAccount(req, res) { - var amount = req.body.amount; - var id = req.token.id; - var accountNumber = req.params.accountNumber; - - try { - var transaction = _transaction["default"].creditAccount(id, accountNumber, amount); - - if (transaction) { - response.setSuccess(200, transaction); - } - - return response.send(res); - } catch (error) { - response.setError(400, error.message); - return response.send(res); - } - } - }]); - - return TransactionController; -}(); - -var _default = TransactionController; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/controllers/user.controller.js b/dist/controllers/user.controller.js deleted file mode 100644 index e0fb961..0000000 --- a/dist/controllers/user.controller.js +++ /dev/null @@ -1,88 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _user = _interopRequireDefault(require("../services/user.service")); - -var _ResponseGenerator = _interopRequireDefault(require("../utils/ResponseGenerator")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var response = new _ResponseGenerator["default"](); -/** - * user controller performs user signup and sign in logic - */ - -var UserController = -/*#__PURE__*/ -function () { - function UserController() { - _classCallCheck(this, UserController); - } - - _createClass(UserController, null, [{ - key: "createUser", - - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof UserController - */ - value: function createUser(req, res) { - var user = req.body; - - try { - var createdUser = _user["default"].createUser(user); - - if (createdUser) { - response.setSuccess(201, createdUser); - } - - return response.send(res); - } catch (error) { - response.setError(400, error.message); - return response.send(res); - } - } - /** - * @param{object} request express request object - * @param{object} response express request object - * @returns {json} json - * @memberof UserController - */ - - }, { - key: "loginUser", - value: function loginUser(req, res) { - var login = req.body; - - try { - var user = _user["default"].signUser(login); - - if (user) { - response.setSuccess(200, user); - } - - return response.send(res); - } catch (error) { - response.setError(401, error.message); - return response.send(res); - } - } - }]); - - return UserController; -}(); - -var _default = UserController; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/index.js b/dist/index.js deleted file mode 100644 index 21b83f2..0000000 --- a/dist/index.js +++ /dev/null @@ -1,38 +0,0 @@ -"use strict"; - -var _dotenv = _interopRequireDefault(require("dotenv")); - -var _express = _interopRequireDefault(require("express")); - -var _bodyParser = require("body-parser"); - -var _debug = _interopRequireDefault(require("debug")); - -var _user = _interopRequireDefault(require("./routes/user.route")); - -var _account = _interopRequireDefault(require("./routes/account.route")); - -var _transaction = _interopRequireDefault(require("./routes/transaction.route")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -_dotenv["default"].config(); - -var app = (0, _express["default"])(); -var port = process.env.PORT || 7888; -var API_VERSION = '/api/v1'; -app.use((0, _bodyParser.json)()); -app.use("".concat(API_VERSION, "/auth"), _user["default"]); -app.use("".concat(API_VERSION), _account["default"]); -app.use("".concat(API_VERSION), _transaction["default"]); -app.get('/', function (req, res) { - res.send('This app server is running on it own 😀😎😋'); -}); - -if (!module.parent) { - app.listen(port, function () { - (0, _debug["default"])('development')("Server is running on port ".concat(port)); - }); -} - -module.exports = app; \ No newline at end of file diff --git a/dist/middlewares/AuthMiddleware.js b/dist/middlewares/AuthMiddleware.js deleted file mode 100644 index 60a7a68..0000000 --- a/dist/middlewares/AuthMiddleware.js +++ /dev/null @@ -1,81 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken")); - -var _ResponseGenerator = _interopRequireDefault(require("../utils/ResponseGenerator")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -var response = new _ResponseGenerator["default"](); -/** - * @description - use for decoding token - * - * @param {Object} request - * @param {Object} response - * @param {Function} next - * @param {String} token - * - * @returns {Object} Object - */ - -var decodeToken = function decodeToken(req, res, next, token) { - _jsonwebtoken["default"].verify(token, process.env.JWT_SECRET, function (error, decode) { - if (!error) { - req.token = decode; - return next(); - } - - response.setError(401, 'invalid request token'); - return response.send(res); - }); -}; -/** - * @description - User's Authentication Middleware - * - * @param {Object} request - * @param {Object} response - * @param {Function} next - * - * @returns {Object} Object - */ - - -var authMiddleware = function authMiddleware(req, res, next) { - var token = req.headers['x-access-token'] || req.headers.Authorization || req.headers.token || req.headers.authorization; - - if (token && token.startsWith('Bearer ')) { - token = token.slice(7, token.length); - } - - if (process.env.NODE_ENV === 'test') { - if (!token) { - token = 1; - } - - if (typeof token === 'number') { - req.token = { - userId: token - }; - return next(); - } - - if (typeof token === 'string') { - return decodeToken(req, res, next, token); - } - } - - if (token) { - return decodeToken(req, res, next, token); - } - - response.setError(401, 'please assign a access token as header'); - return response.send(res); -}; - -var _default = authMiddleware; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/middlewares/PermissionMiddleware.js b/dist/middlewares/PermissionMiddleware.js deleted file mode 100644 index 7070c66..0000000 --- a/dist/middlewares/PermissionMiddleware.js +++ /dev/null @@ -1,75 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _ResponseGenerator = _interopRequireDefault(require("../utils/ResponseGenerator")); - -var _account = _interopRequireDefault(require("../services/account.service")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -var response = new _ResponseGenerator["default"](); -/** - * @description - User's Permission Middleware - * - * @param {Object} request - * @param {Object} response - * @param {Function} next - * - * @returns {Object} Object - */ - -var permissionMiddleWare = function permissionMiddleWare(req, res, next) { - if (!req.token) { - response.setError(400, 'How did you get pass the authentication middleware 😩😢😫'); - return response.send(res); - } - - var _req$token = req.token, - id = _req$token.id, - type = _req$token.type, - isAdmin = _req$token.isAdmin; - var route = req.route.path; - var method = req.method.toLowerCase(); - var accountNumber = req.params.accountNumber; - - if (route === '/accounts' && method === 'get' && type !== 'staff') { - response.setError(403, 'only a staff has the permission to get all bank accounts'); - return response.send(res); - } - - if (route === '/accounts/:accountNumber' && method === 'patch' && type !== 'staff') { - response.setError(403, 'only a staff has the permission to change account status'); - return response.send(res); - } - - if (route === '/accounts/:accountNumber' && method === 'delete' && type !== 'staff') { - response.setError(403, 'only a staff has the permission to delete an account'); - return response.send(res); - } - - if (route === '/transactions/:accountNumber/debit' && method === 'post' && (type !== 'staff' || isAdmin)) { - response.setError(403, 'only a cashier has the permission to debit an account'); - return response.send(res); - } - - if (route === '/transactions/:accountNumber/credit' && method === 'post' && (type !== 'staff' || isAdmin)) { - response.setError(403, 'only a cashier has the permission to credit an account'); - return response.send(res); - } - - if (route === '/accounts/:accountNumber' && method === 'get' && type !== 'staff') { - if (!_account["default"].isMyAccount(id, accountNumber)) { - response.setError(403, 'only a staff has the permission to get other user\'s account'); - return response.send(res); - } - } - - next(); -}; - -var _default = permissionMiddleWare; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/middlewares/SchemaValidator.js b/dist/middlewares/SchemaValidator.js deleted file mode 100644 index 077886c..0000000 --- a/dist/middlewares/SchemaValidator.js +++ /dev/null @@ -1,72 +0,0 @@ -"use strict"; - -var _ = require('lodash'); - -var Joi = require('joi'); - -var Schemas = require('./validatorSchema/schemas'); - -module.exports = function () { - var useJoiError = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : false; - // useJoiError determines if we should respond with the base Joi error - // boolean: defaults to false - var useJoiErr = _.isBoolean(useJoiError) && useJoiError; // enabled HTTP methods for request data validation - - var supportedMethods = ['post', 'put', 'patch']; // Joi validation options - - var validationOptions = { - abortEarly: false, - // abort after the last validation error - allowUnknown: true, - // allow unknown keys that will be ignored - stripUnknown: true // remove unknown keys from the validated data - - }; // return the validation middleware - - return function (req, res, next) { - var route = req.route.path; - var method = req.method.toLowerCase(); - - if (_.includes(supportedMethods, method) && _.has(Schemas, route)) { - // get schema for the current route - var schema = _.get(Schemas, route); - - if (schema) { - // Validate req.body using the schema and validation options - return Joi.validate(req.body, schema, validationOptions, function (err, data) { - if (err) { - // Joi Error - var JoiError = { - status: 422, - error: { - original: err._object, - // fetch only message and type from each error - details: _.map(err.details, function (_ref) { - var message = _ref.message, - type = _ref.type; - return { - message: message.replace(/['"]/g, ''), - type: type - }; - }) - } - }; // Custom Error - - var SimplifiedError = { - status: 422, - error: err.details ? err.details[0].message.replace(/['"]/g, '') : err.message - }; // Send back the JSON error response - - res.status(422).json(useJoiErr ? JoiError : SimplifiedError); - } else { - // Replace req.body with the data after Joi validation - req.body = data; - next(); - } - }); - } - } - - next(); - }; -}; \ No newline at end of file diff --git a/dist/middlewares/validatorSchema/schemas.js b/dist/middlewares/validatorSchema/schemas.js deleted file mode 100644 index 4647179..0000000 --- a/dist/middlewares/validatorSchema/schemas.js +++ /dev/null @@ -1,55 +0,0 @@ -"use strict"; - -var _joi = _interopRequireDefault(require("joi")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -/** - * schema.js - */ -var name = _joi["default"].string().regex(/^[A-Z]|[a-z]+$/).required(); - -var email = _joi["default"].string().email().lowercase().required(); - -var password = _joi["default"].string().min(7).required().strict(); - -var createUserSchema = _joi["default"].object({ - firstName: name, - lastName: name, - email: email, - password: password, - confirmPassword: _joi["default"].string().valid(_joi["default"].ref('password')).required().strict().error(new Error('your password and confirm password do not match')), - type: _joi["default"].when('isAdmin', { - is: true, - then: _joi["default"].string().lowercase().valid('staff')["default"]('staff').error(new Error('an admin cannot register as a client')), - otherwise: _joi["default"].string().lowercase().valid('client', 'staff').required() - }), - isAdmin: _joi["default"]["boolean"]()["default"](false) -}); - -var loginUserSchema = _joi["default"].object({ - email: email, - password: password -}); - -var createAccountSchema = _joi["default"].object({ - type: _joi["default"].string().lowercase().valid('savings', 'current').required(), - balance: _joi["default"].number().positive().allow(0).precision(2)["default"](0.00) -}); - -var updateStatusSchema = _joi["default"].object({ - status: _joi["default"].string().lowercase().valid('dormant', 'active').required() -}); - -var transactionSchema = _joi["default"].object({ - amount: _joi["default"].number().positive().precision(2).required() -}); - -module.exports = { - '/signup': createUserSchema, - '/signin': loginUserSchema, - '/accounts': createAccountSchema, - '/accounts/:accountNumber': updateStatusSchema, - '/transactions/:accountNumber/debit': transactionSchema, - '/transactions/:accountNumber/credit': transactionSchema -}; \ No newline at end of file diff --git a/dist/models/account.model.js b/dist/models/account.model.js deleted file mode 100644 index eda2f3e..0000000 --- a/dist/models/account.model.js +++ /dev/null @@ -1,94 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _moment = _interopRequireDefault(require("moment")); - -var _dummyData = _interopRequireDefault(require("./dummyData")); - -var _common = _interopRequireDefault(require("../utils/common")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var Account = -/*#__PURE__*/ -function () { - function Account() { - _classCallCheck(this, Account); - } - - _createClass(Account, null, [{ - key: "create", - value: function create(account) { - var newId = _common["default"].getNextId(_dummyData["default"].accounts); - - var newAccount = account; - newAccount.id = newId; - newAccount.accountNumber = _common["default"].generateAccountNumber(_dummyData["default"].accounts); - newAccount.createdOn = (0, _moment["default"])(); - newAccount.status = 'dormant'; - - _dummyData["default"].accounts.push(newAccount); - - return newAccount; - } - }, { - key: "findAll", - value: function findAll() { - return _dummyData["default"].accounts; - } - }, { - key: "findByAccountNumber", - value: function findByAccountNumber(accountNumber) { - var source = _dummyData["default"].accounts; - var foundAccount = source.find(function (account) { - return account.accountNumber === accountNumber; - }); - return foundAccount; - } - }, { - key: "findAccountByOwner", - value: function findAccountByOwner(id) { - var foundAccount = _dummyData["default"].accounts.find(function (account) { - return account.owner === id; - }); - - return foundAccount; - } - }, { - key: "update", - value: function update(account, status) { - var userAccount = account; - userAccount.status = status; - return userAccount; - } - }, { - key: "delete", - value: function _delete(account) { - var userAccount = account; - - var index = _dummyData["default"].accounts.indexOf(userAccount); - - if (index > -1) { - _dummyData["default"].accounts.splice(index, 1); - - return true; - } - - return false; - } - }]); - - return Account; -}(); - -exports["default"] = Account; \ No newline at end of file diff --git a/dist/models/dummyData.js b/dist/models/dummyData.js deleted file mode 100644 index 254c99e..0000000 --- a/dist/models/dummyData.js +++ /dev/null @@ -1,85 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _moment = _interopRequireDefault(require("moment")); - -var _common = _interopRequireDefault(require("../utils/common")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -var _default = { - accounts: [{ - id: 1, - accountNumber: 222010772, - createdOn: (0, _moment["default"])(), - owner: 1, - type: 'savings', - status: 'active', - balance: 20000.95 - }, { - id: 2, - accountNumber: 222010872, - createdOn: (0, _moment["default"])(), - owner: 3, - type: 'current', - status: 'dormant', - balance: 400000.95 - }], - users: [{ - id: 1, - email: 'tejumoladavid@gmail.com', - firstName: 'David', - lastName: 'Tejumola', - password: _common["default"].hashPassword('password'), - type: 'staff', - isAdmin: true - }, { - id: 2, - email: 'johnoke@gmail.com', - firstName: 'John', - lastName: 'Oke', - password: _common["default"].hashPassword('password'), - type: 'staff', - isAdmin: false - }, { - id: 3, - email: 'boladeojo@gmail.com', - firstName: 'Bolade', - lastName: 'Ojo', - password: _common["default"].hashPassword('password'), - type: 'client', - isAdmin: false - }, { - id: 4, - email: 'sholaadeola@gmail.com', - firstName: 'Shola', - lastName: 'Adeola', - password: _common["default"].hashPassword('password'), - type: 'client', - isAdmin: false - }], - transactions: [{ - transactionId: 1, - accountNumber: 222010772, - cashier: 1, - transactionType: 'debit', - accountBalance: '10000.00' - }, { - transactionId: 2, - accountNumber: 222010772, - cashier: 1, - transactionType: 'debit', - accountBalance: '10000.00' - }, { - transactionId: 3, - accountNumber: 222010772, - cashier: 1, - transactionType: 'debit', - accountBalance: '10000.00' - }] -}; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/models/transaction.model.js b/dist/models/transaction.model.js deleted file mode 100644 index cd34310..0000000 --- a/dist/models/transaction.model.js +++ /dev/null @@ -1,70 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _dummyData = _interopRequireDefault(require("./dummyData")); - -var _common = _interopRequireDefault(require("../utils/common")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var Transaction = -/*#__PURE__*/ -function () { - function Transaction() { - _classCallCheck(this, Transaction); - } - - _createClass(Transaction, null, [{ - key: "credit", - value: function credit(account, amount, cashierId) { - var userAccount = account; - var newBalance = userAccount.balance + amount; - userAccount.balance = newBalance; - var newTransaction = { - transactionId: _common["default"].getNextTransactionId(_dummyData["default"].transactions), - accountNumber: account.accountNumber, - amount: amount, - cashier: cashierId, - transactionType: 'credit', - accountBalance: newBalance.toFixed(2) - }; - - _dummyData["default"].transactions.push(newTransaction); - - return newTransaction; - } - }, { - key: "debit", - value: function debit(account, amount, cashierId) { - var userAccount = account; - var newBalance = userAccount.balance - amount; - userAccount.balance = newBalance; - var newTransaction = { - transactionId: _common["default"].getNextTransactionId(_dummyData["default"].transactions), - accountNumber: account.accountNumber, - amount: amount, - cashier: cashierId, - transactionType: 'debit', - accountBalance: newBalance.toFixed(2) - }; - - _dummyData["default"].transactions.push(newTransaction); - - return newTransaction; - } - }]); - - return Transaction; -}(); - -exports["default"] = Transaction; \ No newline at end of file diff --git a/dist/models/user.model.js b/dist/models/user.model.js deleted file mode 100644 index c3d7165..0000000 --- a/dist/models/user.model.js +++ /dev/null @@ -1,62 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _dummyData = _interopRequireDefault(require("./dummyData")); - -var _common = _interopRequireDefault(require("../utils/common")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -var User = -/*#__PURE__*/ -function () { - function User() { - _classCallCheck(this, User); - } - - _createClass(User, null, [{ - key: "createUser", - value: function createUser(user) { - var newId = _common["default"].getNextId(_dummyData["default"].users); - - var newUser = user; - newUser.id = newId; - - _dummyData["default"].users.push(newUser); - - return newUser; - } - }, { - key: "findUserByEmail", - value: function findUserByEmail(email) { - var foundUser = _dummyData["default"].users.find(function (user) { - return user.email === email; - }); - - return foundUser; - } - }, { - key: "findUserById", - value: function findUserById(id) { - var foundUser = _dummyData["default"].users.find(function (user) { - return user.id === id; - }); - - return foundUser; - } - }]); - - return User; -}(); - -exports["default"] = User; \ No newline at end of file diff --git a/dist/routes/account.route.js b/dist/routes/account.route.js deleted file mode 100644 index ea7297b..0000000 --- a/dist/routes/account.route.js +++ /dev/null @@ -1,28 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _express = require("express"); - -var _account = _interopRequireDefault(require("../controllers/account.controller")); - -var _SchemaValidator = _interopRequireDefault(require("../middlewares/SchemaValidator")); - -var _AuthMiddleware = _interopRequireDefault(require("../middlewares/AuthMiddleware")); - -var _PermissionMiddleware = _interopRequireDefault(require("../middlewares/PermissionMiddleware")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -var router = (0, _express.Router)(); -var validateRequest = (0, _SchemaValidator["default"])(false); -router.post('/accounts', _AuthMiddleware["default"], validateRequest, _account["default"].createBankAccount); -router.get('/accounts', _AuthMiddleware["default"], _PermissionMiddleware["default"], _account["default"].fetchAllAccounts); -router.get('/accounts/:accountNumber', _AuthMiddleware["default"], _PermissionMiddleware["default"], _account["default"].getAccount); -router.patch('/accounts/:accountNumber', _AuthMiddleware["default"], validateRequest, _PermissionMiddleware["default"], _account["default"].changeStatus); -router["delete"]('/accounts/:accountNumber', _AuthMiddleware["default"], _PermissionMiddleware["default"], _account["default"].deleteAccount); -var _default = router; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/routes/transaction.route.js b/dist/routes/transaction.route.js deleted file mode 100644 index 716fe5b..0000000 --- a/dist/routes/transaction.route.js +++ /dev/null @@ -1,25 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _express = require("express"); - -var _transaction = _interopRequireDefault(require("../controllers/transaction.controller")); - -var _SchemaValidator = _interopRequireDefault(require("../middlewares/SchemaValidator")); - -var _AuthMiddleware = _interopRequireDefault(require("../middlewares/AuthMiddleware")); - -var _PermissionMiddleware = _interopRequireDefault(require("../middlewares/PermissionMiddleware")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -var router = (0, _express.Router)(); -var validateRequest = (0, _SchemaValidator["default"])(false); -router.post('/transactions/:accountNumber/debit', _AuthMiddleware["default"], _PermissionMiddleware["default"], validateRequest, _transaction["default"].debitUserAccount); -router.post('/transactions/:accountNumber/credit', _AuthMiddleware["default"], _PermissionMiddleware["default"], validateRequest, _transaction["default"].creditUserAccount); -var _default = router; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/routes/user.route.js b/dist/routes/user.route.js deleted file mode 100644 index e8a3260..0000000 --- a/dist/routes/user.route.js +++ /dev/null @@ -1,21 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _express = require("express"); - -var _user = _interopRequireDefault(require("../controllers/user.controller")); - -var _SchemaValidator = _interopRequireDefault(require("../middlewares/SchemaValidator")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -var router = (0, _express.Router)(); -var validateRequest = (0, _SchemaValidator["default"])(false); -router.post('/signup', validateRequest, _user["default"].createUser); -router.post('/signin', validateRequest, _user["default"].loginUser); -var _default = router; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/services/account.service.js b/dist/services/account.service.js deleted file mode 100644 index 887ce60..0000000 --- a/dist/services/account.service.js +++ /dev/null @@ -1,185 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _account = _interopRequireDefault(require("../models/account.model")); - -var _user = _interopRequireDefault(require("../models/user.model")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } - -function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -/** service that allows user create bank account, delete bank account */ -var AccountService = -/*#__PURE__*/ -function () { - function AccountService() { - _classCallCheck(this, AccountService); - } - - _createClass(AccountService, null, [{ - key: "createAccount", - - /** - * @description Create a new user - * @param {object} a new user object - */ - value: function createAccount(userId, type, balance) { - var user = _user["default"].findUserById(userId); // check if user alredy exist - - - if (user) { - // check if user already has a bank account - var account = _account["default"].findAccountByOwner(userId); - - if (account) { - throw new Error("user already have an account - ".concat(account.accountNumber)); - } // create a new bank account - - - var newAccount = _account["default"].create({ - owner: userId, - type: type, - balance: balance - }); - - return { - accountNumber: newAccount.accountNumber, - firstName: user.firstName, - lastName: user.lastName, - email: user.email, - type: type, - balance: balance - }; - } - - throw new Error('user doesn\'t exist'); - } - /** - * @description it fetches all accounts - * @param {array} of user objects - */ - - }, { - key: "getAllAccounts", - value: function getAllAccounts() { - return _account["default"].findAll().map(function (account) { - var owner = account.owner, - data = _objectWithoutProperties(account, ["owner"]); - - var user = _user["default"].findUserById(owner); - - return _objectSpread({}, data, { - firstName: user.firstName, - lastName: user.lastName, - email: user.email - }); - }); - } - /** - * @description this function fetches a single user account - * @param {object} response - */ - - }, { - key: "getAccount", - value: function getAccount(accountNumber) { - var foundAccount = _account["default"].findByAccountNumber(Number(accountNumber)); - - if (foundAccount) { - var owner = foundAccount.owner, - data = _objectWithoutProperties(foundAccount, ["owner"]); - - var user = _user["default"].findUserById(owner); - - return _objectSpread({}, data, { - firstName: user.firstName, - lastName: user.lastName, - email: user.email - }); - } - - throw new Error('account number doesn\'t exist'); - } - /** - * @description this function change account status - * @param {object} response - */ - - }, { - key: "changeAccountStatus", - value: function changeAccountStatus(accountNumber, status) { - var foundAccount = _account["default"].findByAccountNumber(Number(accountNumber)); - - if (foundAccount) { - var account = _account["default"].update(foundAccount, status); - - return { - accountNumber: account.accountNumber, - status: status - }; - } - - throw new Error('account number doesn\'t exist'); - } - /** - * @description fetches all accounts - * @param {object} response - */ - - }, { - key: "deleteAccount", - value: function deleteAccount(accountNumber) { - var foundAccount = _account["default"].findByAccountNumber(Number(accountNumber)); - - if (foundAccount) { - var isDeleted = _account["default"]["delete"](foundAccount); - - if (isDeleted) { - return 'Account successfully deleted'; - } - } - - throw new Error('account number doesn\'t exist'); - } - /** - * @description this function checks if an account belongs to a user - * @param {object} response - */ - - }, { - key: "isMyAccount", - value: function isMyAccount(id, accountNumber) { - var foundAccount = _account["default"].findByAccountNumber(Number(accountNumber)); - - if (foundAccount) { - if (foundAccount.owner !== Number(id)) { - return false; - } - } - - return true; - } - }]); - - return AccountService; -}(); - -var _default = AccountService; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/services/transaction.service.js b/dist/services/transaction.service.js deleted file mode 100644 index c07cd18..0000000 --- a/dist/services/transaction.service.js +++ /dev/null @@ -1,74 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _transaction = _interopRequireDefault(require("../models/transaction.model")); - -var _account = _interopRequireDefault(require("../models/account.model")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -/** service that allows cashier perform transaction of user's account */ -var TransactionService = -/*#__PURE__*/ -function () { - function TransactionService() { - _classCallCheck(this, TransactionService); - } - - _createClass(TransactionService, null, [{ - key: "debitAccount", - - /** - * @description debit user account - * @param {object} a new transaction object - */ - value: function debitAccount(cashierId, accountNumber, amount) { - var account = _account["default"].findByAccountNumber(Number(accountNumber)); - - if (account) { - if (account.balance > amount) { - var transaction = _transaction["default"].debit(account, amount, cashierId); - - return transaction; - } - - throw new Error('account balance is not sufficient'); - } - - throw new Error('account number doesn\'t exist'); - } - /** - * @description credit user account - * @param {object} a new transaction object - */ - - }, { - key: "creditAccount", - value: function creditAccount(cashierId, accountNumber, amount) { - var account = _account["default"].findByAccountNumber(Number(accountNumber)); - - if (account) { - var transaction = _transaction["default"].credit(account, amount, cashierId); - - return transaction; - } - - throw new Error('account number doesn\'t exist'); - } - }]); - - return TransactionService; -}(); - -var _default = TransactionService; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/services/user.service.js b/dist/services/user.service.js deleted file mode 100644 index ddbb980..0000000 --- a/dist/services/user.service.js +++ /dev/null @@ -1,117 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _common = _interopRequireDefault(require("../utils/common")); - -var _user = _interopRequireDefault(require("../models/user.model")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -function _objectWithoutProperties(source, excluded) { if (source == null) return {}; var target = _objectWithoutPropertiesLoose(source, excluded); var key, i; if (Object.getOwnPropertySymbols) { var sourceSymbolKeys = Object.getOwnPropertySymbols(source); for (i = 0; i < sourceSymbolKeys.length; i++) { key = sourceSymbolKeys[i]; if (excluded.indexOf(key) >= 0) continue; if (!Object.prototype.propertyIsEnumerable.call(source, key)) continue; target[key] = source[key]; } } return target; } - -function _objectWithoutPropertiesLoose(source, excluded) { if (source == null) return {}; var target = {}; var sourceKeys = Object.keys(source); var key, i; for (i = 0; i < sourceKeys.length; i++) { key = sourceKeys[i]; if (excluded.indexOf(key) >= 0) continue; target[key] = source[key]; } return target; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -/** Class that allows user create and login */ -var UserService = -/*#__PURE__*/ -function () { - function UserService() { - _classCallCheck(this, UserService); - } - - _createClass(UserService, null, [{ - key: "createUser", - - /** - * @description Create a new user - * @param {object} a new user object - */ - value: function createUser(user) { - var isUser = _user["default"].findUserByEmail(user.email); - - if (isUser) { - throw new Error('a user with this email address already exist'); - } - - var newUser = user; - newUser.password = _common["default"].hashPassword(user.password); - - var createdUser = _user["default"].createUser(newUser); - - var id = createdUser.id, - type = createdUser.type, - isAdmin = createdUser.isAdmin, - firstName = createdUser.firstName, - lastName = createdUser.lastName, - email = createdUser.email; - var payload = { - id: id, - type: type, - isAdmin: isAdmin - }; - - var token = _common["default"].jwtSigner(payload); - - return { - token: token, - id: id, - firstName: firstName, - lastName: lastName, - email: email, - isAdmin: user.isAdmin, - type: type - }; - } - /** - * @description signs user into their account - * @param {object} a new user object - */ - - }, { - key: "signUser", - value: function signUser(login) { - var user = _user["default"].findUserByEmail(login.email); - - if (user) { - var bycrptResponse = _common["default"].validatePassword(login.password, user.password); - - if (bycrptResponse) { - var id = user.id, - userPassword = user.password, - data = _objectWithoutProperties(user, ["id", "password"]); - - var userProfile = _objectSpread({ - id: id - }, data); - - var token = _common["default"].jwtSigner(userProfile); - - return _objectSpread({ - token: token - }, userProfile); - } - } - - throw new Error('invalid user credentials'); - } - }]); - - return UserService; -}(); - -var _default = UserService; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/test/account.test.js b/dist/test/account.test.js deleted file mode 100644 index c47df95..0000000 --- a/dist/test/account.test.js +++ /dev/null @@ -1,305 +0,0 @@ -"use strict"; - -var _chai = _interopRequireDefault(require("chai")); - -require("chai/register-should"); - -var _chaiHttp = _interopRequireDefault(require("chai-http")); - -var _index = _interopRequireDefault(require("../index")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -_chai["default"].use(_chaiHttp["default"]); - -describe('Test account related endpoints - POST, GET, PATH, DELETE', function () { - var clientToken; - var adminToken; - var sholaAccountNumber; - /** - * Sign in user to generate user token before test - */ - - before('Sign in user to obtain auth token to be used in other account operations', function (done) { - var userCredential = { - email: 'sholaadeola@gmail.com', - password: 'password' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(userCredential).end(function (err, res) { - res.should.have.status(200); - - if (!err) { - clientToken = res.body.data.token; - } - - done(); - }); - }); - /** - * Test the POST /accounts/ endpoint - */ - - describe('POST /accounts', function () { - it('it should check for token in the request header', function (done) { - var details = { - type: 'savings', - balance: 0.00 - }; - - _chai["default"].request(_index["default"]).post('/api/v1/accounts').send(details).end(function (err, res) { - res.should.have.status(401); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('please assign a access token as header'); - done(); - }); - }); - it('it should create a bank account', function (done) { - var details = { - type: 'savings', - balance: 0.00 - }; - - _chai["default"].request(_index["default"]).post('/api/v1/accounts').send(details).set('x-access-token', clientToken).end(function (err, res) { - res.should.have.status(201); - res.body.should.be.a('object'); - res.body.data.should.have.property('accountNumber'); - res.body.data.should.have.property('firstName'); - res.body.data.should.have.property('lastName'); - res.body.data.should.have.property('email'); - res.body.data.should.have.property('type'); - res.body.data.should.have.property('balance'); - - if (!err) { - sholaAccountNumber = Number(res.body.data.accountNumber); - } - - done(); - }); - }); - it('it should throw error when account type is not specified', function (done) { - var details = { - balance: 0.00 - }; - - _chai["default"].request(_index["default"]).post('/api/v1/accounts').send(details).set('x-access-token', clientToken).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('type is required'); - done(); - }); - }); - it('it should throw error when account type is different from savings and account', function (done) { - var details = { - type: 'somethingdifferent' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/accounts').set('x-access-token', clientToken).send(details).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('type must be one of [savings, current]'); - done(); - }); - }); - }); - /** - * Test the GET /accounts/ routes - */ - - describe('GET /accounts', function () { - it('it should throw permission error if user is not an admin', function (done) { - _chai["default"].request(_index["default"]).get('/api/v1/accounts').set('x-access-token', clientToken).end(function (err, res) { - res.should.have.status(403); - res.body.should.have.property('error').eql('only a staff has the permission to get all bank accounts'); - done(); - }); - }); - before('Sign in as an admin/staff because only admin/staff can get list of bank accounts', function (done) { - var userCredential = { - email: 'tejumoladavid@gmail.com', - password: 'password' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(userCredential).end(function (err, res) { - res.should.have.status(200); - - if (!err) { - adminToken = res.body.data.token; - } - - done(); - }); - }); - it('it should get all the bank accounts', function (done) { - _chai["default"].request(_index["default"]).get('/api/v1/accounts').set('x-access-token', adminToken).end(function (err, res) { - res.should.have.status(200); - res.body.data.should.have.property('accounts').be.a('array'); - done(); - }); - }); - }); - /** - * Test the GET /accounts/:accountNumber route - */ - - describe('GET /accounts/:accountNumber', function () { - it('it should throw an error if a client wants to get other user\'s account', function (done) { - var accountNumber = 222010772; - - _chai["default"].request(_index["default"]).get("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', clientToken).end(function (err, res) { - res.should.have.status(403); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('only a staff has the permission to get other user\'s account'); - done(); - }); - }); - it('it should GET a bank account details as a client if i own the account', function (done) { - var accountNumber = sholaAccountNumber; - - _chai["default"].request(_index["default"]).get("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', clientToken).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.data.should.have.property('accountNumber').eql(accountNumber); - res.body.data.should.have.property('firstName'); - res.body.data.should.have.property('lastName'); - res.body.data.should.have.property('email'); - res.body.data.should.have.property('type'); - res.body.data.should.have.property('balance'); - done(); - }); - }); - it('it should GET a bank account details as a staff', function (done) { - var accountNumber = 222010772; - - _chai["default"].request(_index["default"]).get("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.data.should.have.property('accountNumber').eql(accountNumber); - res.body.data.should.have.property('firstName'); - res.body.data.should.have.property('lastName'); - res.body.data.should.have.property('email'); - res.body.data.should.have.property('type'); - res.body.data.should.have.property('balance'); - done(); - }); - }); - it('it should throw an error when account number is not found', function (done) { - var accountNumber = 2220107724455; // octal number format - - _chai["default"].request(_index["default"]).get("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).end(function (err, res) { - res.should.have.status(400); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('account number doesn\'t exist'); - done(); - }); - }); - }); - /** - * Test the PATCH /accounts/:accountNumber route - */ - - describe('PATCH /accounts/:accountNumber', function () { - it('it should throw permission error if user is not an admin', function (done) { - var accountNumber = 222010872; - var body = { - status: 'active' - }; - - _chai["default"].request(_index["default"]).patch("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', clientToken).send(body).end(function (err, res) { - res.should.have.status(403); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('only a staff has the permission to change account status'); - done(); - }); - }); - it('it should activate a user bank account', function (done) { - var accountNumber = 222010872; - var body = { - status: 'active' - }; - - _chai["default"].request(_index["default"]).patch("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).send(body).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.data.should.have.property('accountNumber').eql(accountNumber); - res.body.data.should.have.property('status').eql(body.status); - done(); - }); - }); - it('it should set a bank account as dormant', function (done) { - var accountNumber = 222010872; - var body = { - status: 'dormant' - }; - - _chai["default"].request(_index["default"]).patch("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).send(body).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.data.should.have.property('accountNumber').eql(accountNumber); - res.body.data.should.have.property('status').eql(body.status); - done(); - }); - }); - it('it should throw an error when account number is not found', function (done) { - var accountNumber = 2220108723333; - var body = { - status: 'dormant' - }; - - _chai["default"].request(_index["default"]).patch("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).send(body).end(function (err, res) { - res.should.have.status(400); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('account number doesn\'t exist'); - done(); - }); - }); - it('it should throw error when request body status is different from dormant or active', function (done) { - var accountNumber = 222010872; - var body = { - status: 'validate' - }; - - _chai["default"].request(_index["default"]).patch("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).send(body).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('status must be one of [dormant, active]'); - done(); - }); - }); - }); - /** - * Test DELETE /accounts/:accountNumber route - */ - - describe('DELETE /accounts/:accountNumber', function () { - it('it should throw permission error if user is not an admin', function (done) { - var accountNumber = 222010872; - - _chai["default"].request(_index["default"])["delete"]("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', clientToken).end(function (err, res) { - res.should.have.status(403); - res.body.should.have.property('error').eql('only a staff has the permission to delete an account'); - done(); - }); - }); - it('it should DELETE a bank record ', function (done) { - var accountNumber = 222010872; - - _chai["default"].request(_index["default"])["delete"]("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.should.have.property('message').eql('Account successfully deleted'); - done(); - }); - }); - it('it should throw an error when account number is not found', function (done) { - var accountNumber = 222010872; - - _chai["default"].request(_index["default"])["delete"]("/api/v1/accounts/".concat(accountNumber)).set('x-access-token', adminToken).end(function (err, res) { - res.should.have.status(400); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('account number doesn\'t exist'); - done(); - }); - }); - }); -}); \ No newline at end of file diff --git a/dist/test/transaction.test.js b/dist/test/transaction.test.js deleted file mode 100644 index 93fb116..0000000 --- a/dist/test/transaction.test.js +++ /dev/null @@ -1,215 +0,0 @@ -"use strict"; - -var _chai = _interopRequireDefault(require("chai")); - -require("chai/register-should"); - -var _chaiHttp = _interopRequireDefault(require("chai-http")); - -var _index = _interopRequireDefault(require("../index")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -_chai["default"].use(_chaiHttp["default"]); - -describe('Test transaction related endpoints - Debit and Credit an account', function () { - var cashierToken = null; - var userToken = null; - /** - * Sign in as a cashier to generate user token before test - */ - - before('Sign in cashier to obtain auth token to be used in other account operations', function (done) { - var userCredential = { - email: 'johnoke@gmail.com', - password: 'password' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(userCredential).end(function (err, res) { - res.should.have.status(200); - - if (!err) { - cashierToken = res.body.data.token; - } - - done(); - }); - }); - /** - * Test the POST /transactions/:accountNumber/debit route - */ - - describe('POST /transactions/:accountNumber/debit', function () { - before('Sign in as a user', function (done) { - var userCredential = { - email: 'boladeojo@gmail.com', - password: 'password' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(userCredential).end(function (err, res) { - res.should.have.status(200); - - if (!err) { - userToken = res.body.data.token; - } - - done(); - }); - }); - it('it should throw permission error if user is not a cashier', function (done) { - var accountNumber = 222010872; - var body = { - amount: 50000 - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/debit")).set('x-access-token', userToken).send(body).end(function (err, res) { - res.should.have.status(403); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('only a cashier has the permission to debit an account'); - done(); - }); - }); - it('it should throw an insufficient balance error', function (done) { - var accountNumber = 222010772; - var body = { - amount: 5000000 - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/debit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(400); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('account balance is not sufficient'); - done(); - }); - }); - it('it should throw an error when account number is not found', function (done) { - var accountNumber = 22201084472; - var body = { - amount: 50000 - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/debit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(400); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('account number doesn\'t exist'); - done(); - }); - }); - it('it should throw an error when "amount" in request body is not provided ', function (done) { - var accountNumber = 222010872; - var body = {}; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/debit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('amount is required'); - done(); - }); - }); - it('it should throw an error when "amount" is not a number', function (done) { - var accountNumber = 222010872; - var body = { - amount: '50000hrh' - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/debit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('amount must be a number'); - done(); - }); - }); - it('it should debit a bank account', function (done) { - var accountNumber = 222010772; - var body = { - amount: 500 - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/debit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.data.should.have.property('accountNumber').eql(accountNumber); - res.body.data.should.have.property('transactionId'); - res.body.data.should.have.property('amount'); - res.body.data.should.have.property('cashier'); - res.body.data.should.have.property('transactionType'); - res.body.data.should.have.property('accountBalance'); - done(); - }); - }); - }); - /** - * Test the POST /transactions/:accountNumber/credit route - */ - - describe('POST /transactions/:accountNumber/credit', function () { - it('it should throw permission error if user is not a cashier', function (done) { - var accountNumber = 222010872; - var body = { - amount: 50000 - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/credit")).set('x-access-token', userToken).send(body).end(function (err, res) { - res.should.have.status(403); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('only a cashier has the permission to credit an account'); - done(); - }); - }); - it('it should throw an error when account number is not found', function (done) { - var accountNumber = 22201084472; - var body = { - amount: 50000 - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/credit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(400); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('account number doesn\'t exist'); - done(); - }); - }); - it('it should throw an error when "amount" in request body is not provided ', function (done) { - var accountNumber = 222010772; - var body = {}; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/credit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('amount is required'); - done(); - }); - }); - it('it should throw an error when "amount" is not a number', function (done) { - var accountNumber = 222010872; - var body = { - amount: '50000hrh' - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/credit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('amount must be a number'); - done(); - }); - }); - it('it should credit a bank account', function (done) { - var accountNumber = 222010772; - var body = { - amount: 50000 - }; - - _chai["default"].request(_index["default"]).post("/api/v1/transactions/".concat(accountNumber, "/credit")).set('x-access-token', cashierToken).send(body).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.data.should.have.property('accountNumber').eql(accountNumber); - res.body.data.should.have.property('transactionId'); - res.body.data.should.have.property('amount'); - res.body.data.should.have.property('cashier'); - res.body.data.should.have.property('transactionType'); - res.body.data.should.have.property('accountBalance'); - done(); - }); - }); - }); -}); \ No newline at end of file diff --git a/dist/test/user.test.js b/dist/test/user.test.js deleted file mode 100644 index db8a84f..0000000 --- a/dist/test/user.test.js +++ /dev/null @@ -1,216 +0,0 @@ -"use strict"; - -var _chai = _interopRequireDefault(require("chai")); - -require("chai/register-should"); - -var _chaiHttp = _interopRequireDefault(require("chai-http")); - -var _index = _interopRequireDefault(require("../index")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -_chai["default"].use(_chaiHttp["default"]); - -describe('Test user login and signup', function () { - /** - * Test the POST /auth/signup endpoint - */ - describe('POST /auth/signup', function () { - it('it should create a new user', function (done) { - var newUser = { - email: 'tejumoladavidlo@gmail.com', - firstName: 'timi', - lastName: 'tejumola', - password: 'password', - confirmPassword: 'password', - isAdmin: true - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(newUser).end(function (err, res) { - res.should.have.status(201); - res.body.should.be.a('object'); - res.body.data.should.have.property('token'); - res.body.data.should.have.property('firstName'); - res.body.data.should.have.property('lastName'); - res.body.data.should.have.property('type').eql('staff'); - done(); - }); - }); - it('it should throw an error if the email address is already taken', function (done) { - var newUser = { - email: 'tejumoladavidlo@gmail.com', - firstName: 'timi', - lastName: 'tejumola', - password: 'password', - confirmPassword: 'password', - isAdmin: true - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(newUser).end(function (err, res) { - res.should.have.status(400); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('a user with this email address already exist'); - done(); - }); - }); - it('it should throw an error if firstName is missing in the request body', function (done) { - var invalidPayload = { - lastName: 'timi', - email: 'tejumoladavid@gmail.com', - password: 'password', - confirmPassword: 'password', - isAdmin: true - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(invalidPayload).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('firstName is required'); - done(); - }); - }); - it('it should throw an error if lastName is missing in the request body', function (done) { - var invalidPayload = { - firstName: 'timi', - email: 'tejumoladavid@gmail.com', - password: 'password', - confirmPassword: 'password', - isAdmin: true - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(invalidPayload).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('lastName is required'); - done(); - }); - }); - it('it should throw an error if email is missing in the request body', function (done) { - var invalidPayload = { - firstName: 'timi', - lastName: 'timi', - password: 'password', - confirmPassword: 'password', - isAdmin: true - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(invalidPayload).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('email is required'); - done(); - }); - }); - it('it should throw an error if password is less than 7 characters', function (done) { - var invalidPayload = { - firstName: 'timi', - lastName: 'timi', - email: 'tejumoladavid@gmail.com', - password: 'passw', - confirmPassword: 'passw', - isAdmin: true - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(invalidPayload).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('password length must be at least 7 characters long'); - done(); - }); - }); - it('it should throw an error if password does not match confirm password', function (done) { - var invalidPayload = { - firstName: 'timi', - lastName: 'timi', - email: 'tejumoladavid@gmail.com', - password: 'password', - confirmPassword: 'passw', - isAdmin: true - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(invalidPayload).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('your password and confirm password do not match'); - done(); - }); - }); - it('it should throw an error if type is not specified while isAdmin is false', function (done) { - var invalidPayload = { - firstName: 'timi', - lastName: 'timi', - email: 'tejumoladavid@gmail.com', - password: 'password', - confirmPassword: 'password', - isAdmin: false - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signup').send(invalidPayload).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('type is required'); - done(); - }); - }); - }); - /** - * Test the POST /auth/signin endpoint - */ - - describe('POST /auth/signin', function () { - it('it should sign in a user', function (done) { - var loginCredential = { - email: 'tejumoladavid@gmail.com', - password: 'password' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(loginCredential).end(function (err, res) { - res.should.have.status(200); - res.body.should.be.a('object'); - res.body.data.should.have.property('token'); - res.body.data.should.have.property('firstName'); - res.body.data.should.have.property('lastName'); - res.body.data.should.have.property('email'); - done(); - }); - }); - it('it should throw an error if email is missing in the rquest body', function (done) { - var loginCredential = { - password: 'password' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(loginCredential).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('email is required'); - done(); - }); - }); - it('it should throw an error if password is missing in the rquest body', function (done) { - var loginCredential = { - email: 'tejumoladavid@gmail.com' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(loginCredential).end(function (err, res) { - res.should.have.status(422); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('password is required'); - done(); - }); - }); - it('it should throw an error if user supply a wrong email or password combination ', function (done) { - var loginCredential = { - email: 'tejumoladavid@gmail.com', - password: 'passwordd' - }; - - _chai["default"].request(_index["default"]).post('/api/v1/auth/signin').send(loginCredential).end(function (err, res) { - res.should.have.status(401); - res.body.should.be.a('object'); - res.body.should.have.property('error').eql('invalid user credentials'); - done(); - }); - }); - }); -}); \ No newline at end of file diff --git a/dist/utils/ResponseGenerator.js b/dist/utils/ResponseGenerator.js deleted file mode 100644 index c7ed2cb..0000000 --- a/dist/utils/ResponseGenerator.js +++ /dev/null @@ -1,91 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _common = _interopRequireDefault(require("./common")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } } - -function _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if ("value" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } - -function _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; } - -/** - * a class for api response - */ -var ResponseGenerator = -/*#__PURE__*/ -function () { - function ResponseGenerator() { - _classCallCheck(this, ResponseGenerator); - - this.status = null; - this.type = null; - this.data = null; - this.message = null; - } - /** - * @description set Api response for 200 & 201 - * @param{int} statusCode - * @param {object} data - */ - - - _createClass(ResponseGenerator, [{ - key: "setSuccess", - value: function setSuccess(statusCode, data, message) { - this.status = statusCode; - this.data = data; - this.message = message; - this.type = 'success'; - } - /** - * @description set Api response for 400, 401, 403, 404, 503 - * @param{int} statusCode - * @param {object} data - */ - - }, { - key: "setError", - value: function setError(statusCode, message) { - this.status = statusCode; - this.message = message; - this.type = 'error'; - } - /** - * Sends response - * @param {object} res - * @returns {object} responseObject - */ - - }, { - key: "send", - value: function send(res) { - var filteredResponse = _common["default"].stripNull({ - status: this.status, - message: this.message, - data: this.data - }); - - if (this.type === 'success') { - return res.status(this.status).json(filteredResponse); - } // Here this.type === 'error' - - - return res.status(this.status).json({ - status: this.status, - error: this.message - }); - } - }]); - - return ResponseGenerator; -}(); - -var _default = ResponseGenerator; -exports["default"] = _default; \ No newline at end of file diff --git a/dist/utils/common.js b/dist/utils/common.js deleted file mode 100644 index c24d954..0000000 --- a/dist/utils/common.js +++ /dev/null @@ -1,97 +0,0 @@ -"use strict"; - -Object.defineProperty(exports, "__esModule", { - value: true -}); -exports["default"] = void 0; - -var _bcrypt = _interopRequireDefault(require("bcrypt")); - -var _jsonwebtoken = _interopRequireDefault(require("jsonwebtoken")); - -function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { "default": obj }; } - -function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; var ownKeys = Object.keys(source); if (typeof Object.getOwnPropertySymbols === 'function') { ownKeys = ownKeys.concat(Object.getOwnPropertySymbols(source).filter(function (sym) { return Object.getOwnPropertyDescriptor(source, sym).enumerable; })); } ownKeys.forEach(function (key) { _defineProperty(target, key, source[key]); }); } return target; } - -function _defineProperty(obj, key, value) { if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; } - -var Utils = { - /** - * @description - generates a new id - * @param {object} data - * @returns {int} id - */ - getNextId: function getNextId(data) { - var lastId = data[data.length - 1].id; - return lastId + 1; - }, - - /** - * @description - generates a new id - * @param {object} data - * @returns {int} id - */ - getNextTransactionId: function getNextTransactionId(data) { - var lastId = data[data.length - 1].transactionId; - return lastId + 1; - }, - - /** - * @description - generates a new account number - * @param {object} data - * @returns {int} id - */ - generateAccountNumber: function generateAccountNumber(data) { - var lastAcc = data[data.length - 1].accountNumber; - return lastAcc + 100; - }, - - /** - * @description - validate password by comparing password with hash password - * @param {string} password - * @param {string} hashpassword - * @returns {boolean} boolean to show if password match or not - */ - validatePassword: function validatePassword(password, userPassword) { - return _bcrypt["default"].compareSync(password, userPassword); - }, - - /** - * @description - encypt password - * @param {object} password - * @returns {object} hashpassword - */ - hashPassword: function hashPassword(password) { - var salt = _bcrypt["default"].genSaltSync(15); - - var pwd = _bcrypt["default"].hashSync(password, salt); - - return pwd; - }, - - /** - * @description - signs token - * @param {object} payload - */ - jwtSigner: function jwtSigner(payload) { - return _jsonwebtoken["default"].sign(payload, process.env.JWT_SECRET, { - expiresIn: '24h' - }); - }, - - /** - * @description - remove null key from ab object - * @param {object} - * @returns {object} - */ - stripNull: function stripNull(obj) { - var cleanObj = {}; - Object.keys(obj).forEach(function (val) { - var newVal = obj[val]; - cleanObj = newVal ? _objectSpread({}, cleanObj, _defineProperty({}, val, newVal)) : cleanObj; - }); - return cleanObj; - } -}; -var _default = Utils; -exports["default"] = _default; \ No newline at end of file diff --git a/package.json b/package.json index ab2bc3f..02bffe6 100644 --- a/package.json +++ b/package.json @@ -43,7 +43,9 @@ "clean": "rm -rf dist && mkdir dist", "build": "npm run clean && npm run build-babel", "test-dev": "nyc --require @babel/register ---reporter=html --reporter=text mocha API/test/**.test.js --timeout 20000 --watch --exit", - "test": "nyc --require @babel/register ---reporter=html --reporter=text mocha API/test/**.test.js --timeout 20000 --exit" + "test": "nyc --require @babel/register ---reporter=html --reporter=text mocha API/test/**.test.js --timeout 20000 --exit", + "coveralls": "nyc npm test&& nyc report --reporter=text-lcov | coveralls", + "coverage": "nyc report --reporter=text-lcov | coveralls" }, "repository": { "type": "git",