From fe27875a58d4326eb7e3d3356c519b2239c3713b Mon Sep 17 00:00:00 2001 From: "CHIEFSOFT\\ameye" Date: Sun, 13 Oct 2024 23:49:37 -0400 Subject: [PATCH] New Stripe Mico --- .env | 6 +- Dockerfile | 120 ++---------------------------- api/controller/cardsController.js | 39 ++++++++++ api/routes/cardRoute.js | 22 ++++++ api/routes/route.js | 14 ++++ app/db.js | 57 ++++++++++++++ app/index.js | 10 +++ app/kconfig.js | 55 ++++++++++++++ app/logger.js | 61 +++++++++++++++ {model => app/model}/cardModel.js | 0 controller/cardsController.js | 51 ------------- docker-compose.yml | 12 +-- index.js | 43 ----------- package.json | 38 +++++++--- routes/cardRoute.js | 8 -- server.js | 42 +++++++++++ service/cards.js | 66 ++++++++++++++++ 17 files changed, 409 insertions(+), 235 deletions(-) create mode 100644 api/controller/cardsController.js create mode 100644 api/routes/cardRoute.js create mode 100644 api/routes/route.js create mode 100644 app/db.js create mode 100644 app/index.js create mode 100644 app/kconfig.js create mode 100644 app/logger.js rename {model => app/model}/cardModel.js (100%) delete mode 100644 controller/cardsController.js delete mode 100644 index.js delete mode 100644 routes/cardRoute.js create mode 100644 server.js create mode 100644 service/cards.js diff --git a/.env b/.env index b49a04d..2cf846e 100644 --- a/.env +++ b/.env @@ -1 +1,5 @@ -PORT = 9088 +WRENCHJOB_PORT=3000 +WRENCHJOB_POSTGRE_URL='postgresql://wrenchboard:wrenchboard@10.20.30.60:5432/wrenchboard' +WRENCHJOB_KAFKA_BROKER01='10.10.10.120:9092' +STRIPE_PUBLISHED_KEY='pk_test_51JwvOXCMmfol61TL2IlTEWytKObMLrZTAxJRHdepqWggXm4ENMyrrnR5dxfd5cPeflvCUG1HsErQI43BjOAmUEh500N0FWOZoE' +STRIPE_SECRET_KEY='sk_test_51JwvOXCMmfol61TLadZlDf2rxq6Q1IC50JITRixcbyig8T2zdqpO8HY2NEcwNHacRQKQpTf6JGh7haqUVEH0rccA00eFht1ewi' \ No newline at end of file diff --git a/Dockerfile b/Dockerfile index 81f1454..24c04a6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,123 +1,13 @@ -#FROM node:erbium - -FROM alpine:3.18 - -ENV NODE_VERSION 22.1.0 - -RUN addgroup -g 1000 node \ - && adduser -u 1000 -G node -s /bin/sh -D node \ - && apk add --no-cache \ - libstdc++ \ - && apk add --no-cache --virtual .build-deps \ - curl \ - && ARCH= OPENSSL_ARCH='linux*' && alpineArch="$(apk --print-arch)" \ - && case "${alpineArch##*-}" in \ - x86_64) ARCH='x64' CHECKSUM="087edf483f8bf94acfd41bdada76a296d0673f7739ebfe1179971c90f34d3a95" OPENSSL_ARCH=linux-x86_64;; \ - x86) OPENSSL_ARCH=linux-elf;; \ - aarch64) OPENSSL_ARCH=linux-aarch64;; \ - arm*) OPENSSL_ARCH=linux-armv4;; \ - ppc64le) OPENSSL_ARCH=linux-ppc64le;; \ - s390x) OPENSSL_ARCH=linux-s390x;; \ - *) ;; \ - esac \ - && if [ -n "${CHECKSUM}" ]; then \ - set -eu; \ - curl -fsSLO --compressed "https://unofficial-builds.nodejs.org/download/release/v$NODE_VERSION/node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz"; \ - echo "$CHECKSUM node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" | sha256sum -c - \ - && tar -xJf "node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" -C /usr/local --strip-components=1 --no-same-owner \ - && ln -s /usr/local/bin/node /usr/local/bin/nodejs; \ - else \ - echo "Building from source" \ - # backup build - && apk add --no-cache --virtual .build-deps-full \ - binutils-gold \ - g++ \ - gcc \ - gnupg \ - libgcc \ - linux-headers \ - make \ - python3 \ - # use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150 - && export GNUPGHOME="$(mktemp -d)" \ - # gpg keys listed at https://github.com/nodejs/node#release-keys - && for key in \ - 4ED778F539E3634C779C87C6D7062848A1AB005C \ - 141F07595B7B3FFE74309A937405533BE57C7D57 \ - 74F12602B6F1C4E913FAA37AD3A89613643B6201 \ - DD792F5973C6DE52C432CBDAC77ABFA00DDBF2B7 \ - 61FC681DFB92A079F1685E77973F295594EC4689 \ - 8FCCA13FEF1D0C2E91008E09770F7A9A5AE15600 \ - C4F0DFFF4E8C1A8236409D08E73BC641CC11F4C8 \ - 890C08DB8579162FEE0DF9DB8BEAB4DFCF555EF4 \ - C82FA3AE1CBEDC6BE46B9360C43CEC45C17AB93C \ - 108F52B48DB57BB0CC439B2997B01419BD92F80A \ - A363A499291CBBC940DD62E41F10027AF002F8B0 \ - CC68F5A3106FF448322E48ED27F5E38D5B0A215F \ - ; do \ - gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" || \ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \ - done \ - && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/node-v$NODE_VERSION.tar.xz" \ - && curl -fsSLO --compressed "https://nodejs.org/dist/v$NODE_VERSION/SHASUMS256.txt.asc" \ - && gpg --batch --decrypt --output SHASUMS256.txt SHASUMS256.txt.asc \ - && gpgconf --kill all \ - && rm -rf "$GNUPGHOME" \ - && grep " node-v$NODE_VERSION.tar.xz\$" SHASUMS256.txt | sha256sum -c - \ - && tar -xf "node-v$NODE_VERSION.tar.xz" \ - && cd "node-v$NODE_VERSION" \ - && ./configure \ - && make -j$(getconf _NPROCESSORS_ONLN) V= \ - && make install \ - && apk del .build-deps-full \ - && cd .. \ - && rm -Rf "node-v$NODE_VERSION" \ - && rm "node-v$NODE_VERSION.tar.xz" SHASUMS256.txt.asc SHASUMS256.txt; \ - fi \ - && rm -f "node-v$NODE_VERSION-linux-$ARCH-musl.tar.xz" \ - # Remove unused OpenSSL headers to save ~34MB. See this NodeJS issue: https://github.com/nodejs/node/issues/46451 - && find /usr/local/include/node/openssl/archs -mindepth 1 -maxdepth 1 ! -name "$OPENSSL_ARCH" -exec rm -rf {} \; \ - && apk del .build-deps \ - # smoke tests - && node --version \ - && npm --version - -ENV YARN_VERSION 1.22.19 - -RUN apk add --no-cache --virtual .build-deps-yarn curl gnupg tar \ - # use pre-existing gpg directory, see https://github.com/nodejs/docker-node/pull/1895#issuecomment-1550389150 - && export GNUPGHOME="$(mktemp -d)" \ - && for key in \ - 6A010C5166006599AA17F08146C2130DFD2497F5 \ - ; do \ - gpg --batch --keyserver hkps://keys.openpgp.org --recv-keys "$key" || \ - gpg --batch --keyserver keyserver.ubuntu.com --recv-keys "$key" ; \ - done \ - && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz" \ - && curl -fsSLO --compressed "https://yarnpkg.com/downloads/$YARN_VERSION/yarn-v$YARN_VERSION.tar.gz.asc" \ - && gpg --batch --verify yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ - && gpgconf --kill all \ - && rm -rf "$GNUPGHOME" \ - && mkdir -p /opt \ - && tar -xzf yarn-v$YARN_VERSION.tar.gz -C /opt/ \ - && ln -s /opt/yarn-v$YARN_VERSION/bin/yarn /usr/local/bin/yarn \ - && ln -s /opt/yarn-v$YARN_VERSION/bin/yarnpkg /usr/local/bin/yarnpkg \ - && rm yarn-v$YARN_VERSION.tar.gz.asc yarn-v$YARN_VERSION.tar.gz \ - && apk del .build-deps-yarn \ - # smoke test - && yarn --version \ - && rm -rf /tmp/* - - +FROM node:erbium # Create app directory -RUN mkdir -p /usr/src -WORKDIR /usr/src +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app # Install app dependencies -COPY package.json /usr/src/ +COPY package.json /usr/src/app/ RUN npm install -COPY . /usr/src +COPY . /usr/src/app CMD [ "npm", "start" ] \ No newline at end of file diff --git a/api/controller/cardsController.js b/api/controller/cardsController.js new file mode 100644 index 0000000..da62d95 --- /dev/null +++ b/api/controller/cardsController.js @@ -0,0 +1,39 @@ +'use strict'; +//equire('../../package.json') +const cards = require('../../service/cards.js'); + + +//const logger = require('../../app/logger'); + +const cardsControllers = { + createCard: function (req, res) { + cards.createCard(req, res, function (err, result) { + res.status(200).json({ + 'status': 'OK', + 'internal_return': 0, + 'result_list': result.result, + 'total_record': result.total_record + }) + }).then(r =>{ + console.log(r); + }); + }, + + activateCard: function (req, res) { + cards.activateCard(req, res, function (err, dist) { + if (err) { + res.send(err); + } + // res.json(dist); + res.status(200).json({ + 'status': 'OK', + 'internal_return': 0, + 'result_list': dist.result, + 'total_record': dist.total_record + }) + }); + } +}; + +module.exports = cardsControllers; + diff --git a/api/routes/cardRoute.js b/api/routes/cardRoute.js new file mode 100644 index 0000000..99087b3 --- /dev/null +++ b/api/routes/cardRoute.js @@ -0,0 +1,22 @@ +// import express from "express" +// import { activateCard,createCard } from "../controller/cardsController.js" +// +// const card_route = express.Router(); +// +// +// export default card_route; + + +'use strict'; + +const controller = require('../controller/cardsController.js'); + +module.exports = function(app) { + app.route('/create') + .get(controller.createCard); + app.route('/activate') + .get(controller.activateCard); + app.route('/eventSendMoney') + .post(controller.activateCard); + +}; \ No newline at end of file diff --git a/api/routes/route.js b/api/routes/route.js new file mode 100644 index 0000000..d6f8f15 --- /dev/null +++ b/api/routes/route.js @@ -0,0 +1,14 @@ + +'use strict'; + +const cardsControllers = require('../controller/cardsController.js'); + +module.exports = function(app) { + app.route('/create') + .get(cardsControllers.createCard); + app.route('/activate') + .get(cardsControllers.activateCard); + // app.route('/eventSendMoney') + // .post(controller.activateCard); + +}; \ No newline at end of file diff --git a/app/db.js b/app/db.js new file mode 100644 index 0000000..d08ddec --- /dev/null +++ b/app/db.js @@ -0,0 +1,57 @@ +/** + * @file + * Configures the database connection + */ + +const { Pool, Client } = require('pg'); +const url = require('url'); +const logger = require('./logger'); +//const connectionString = 'postgresql://wrenchboard:wrenchboard@10.10.10.23:5432/wrenchboard'; +const connectionString = process.env.POSTGRE_URL.replace(/'/g, ''); +const params = url.parse(connectionString); +const auth = params.auth.split(':'); +const config = { + user: auth[0], + password: auth[1], + host: params.hostname, + port: params.port, + database: params.pathname.split('/')[1], + ssl: false +}; + +const postgres = new Pool(config); + +postgres.on('connect', client => { + logger.info('Connected to Database'); +}); + +postgres.on('acquire', client => { + logger.info('Client is checked out from the DB connection pool'); +}); + +postgres.on('remove', client => { + logger.info('Client is closed & removed from the DB connection pool'); +}); + +postgres.on('error', (err, client) => { + logger.error(err); +}); + +// Connect to PostgreSQL +postgres.connect((err, client, release) => { + logger.info(connectionString); + if (err) { + logger.error('Error acquiring client', err.stack); + return null; + } + client.query('SELECT NOW()', (err, result) => { + release(); + if (err) { + logger.error('Error executing query', err.stack); + return nul; + } + logger.info(result.rows); + }); +}); + +module.exports = postgres; \ No newline at end of file diff --git a/app/index.js b/app/index.js new file mode 100644 index 0000000..b659952 --- /dev/null +++ b/app/index.js @@ -0,0 +1,10 @@ +/** + * @file + * Set up the app + */ +var _ = require('underscore'); +var db = require('./db'); + +module.exports = function () { + db(); +}; \ No newline at end of file diff --git a/app/kconfig.js b/app/kconfig.js new file mode 100644 index 0000000..7d92f2e --- /dev/null +++ b/app/kconfig.js @@ -0,0 +1,55 @@ +// import { Kafka } from "kafkajs"; +const dotenv = require('dotenv'); +const env = dotenv.config(); +//console.log("ENVVVVV ", env); + +const {Kafka} = require('kafkajs'); +const kafkaBroker1 = process.env.WRENCHJOB_KAFKA_BROKER01; + +console.log("kafkaBroker1", kafkaBroker1); + +const kafka = new Kafka({ + clientId: "wallet-kafka", + brokers: [kafkaBroker1], +}); +class KafkaConfig { + + constructor() { + console.log("kafkaBroker1 ******** ", kafkaBroker1); + this.producer = kafka.producer(); + this.consumer = kafka.consumer({ groupId: "test-group" }); + } + + async produce(topic, messages) { + try { + console.log("kafkaBroker1 ######### ", kafkaBroker1); + await this.producer.connect(); + await this.producer.send({ + topic: topic, + messages: messages, + }); + } catch (error) { + console.error(error); + } finally { + await this.producer.disconnect(); + } + } + + async consume(topic, callback) { + try { + await this.consumer.connect(); + await this.consumer.subscribe({ topic: topic, fromBeginning: true }); + await this.consumer.run({ + eachMessage: async ({ topic, partition, message }) => { + const value = message.value.toString(); + callback(value); + }, + }); + } catch (error) { + console.error(error); + } + } +} + +module.exports = KafkaConfig; +//export default KafkaConfig; \ No newline at end of file diff --git a/app/logger.js b/app/logger.js new file mode 100644 index 0000000..5b052f6 --- /dev/null +++ b/app/logger.js @@ -0,0 +1,61 @@ +/** + * @file + * Defines logger for the microservice + */ + +var winston = require('winston'); +var Papertrail = require('winston-papertrail').Papertrail; +var serviceIdentifier = require('../package.json').name; + +var host = process.env.LOG_SERVICE_HOST; +var port = process.env.LOG_SERVICE_PORT; + +/** + * Class to provide logging facilities for the microservice + * @constructor + */ + +var Logger = function () { + + // Try to route logs to third party service + if (host && port) { + // Define our transport + var transport = new Papertrail({ + levels: { + debug: 0, + info: 1, + error: 3 + }, + colors: { + debug: 'blue', + info: 'green', + error: 'red' + }, + host, + port, + json: true, + colorize: true, + logFormat: (level, message) => { + return `[${serviceIdentifier}] ${level} : ${message}`; + } + }); + + // Handle exceptions + transport.exceptionsLevel = 'error'; + winston.handleExceptions(transport); + } + + this.info = winston.info; + this.error = winston.error; + this.debug = winston.debug; +}; + +module.exports = new Logger(); + + +/** + * @typedef {Object} Logger + * @property {function} info - Log in level `info` + * @property {function} error - Log in level `error` + * @property {function} debug - Log in level `debug` + */ \ No newline at end of file diff --git a/model/cardModel.js b/app/model/cardModel.js similarity index 100% rename from model/cardModel.js rename to app/model/cardModel.js diff --git a/controller/cardsController.js b/controller/cardsController.js deleted file mode 100644 index 8907e58..0000000 --- a/controller/cardsController.js +++ /dev/null @@ -1,51 +0,0 @@ -import User from "../model/cardModel.js"; -// Set your secret key. Remember to switch to your live secret key in production. -// See your keys here: https://dashboard.stripe.com/apikeys -const stripe = require('stripe')('sk_test_4eC39HqLyjWDarjtT1zdp7dc'); - - -export const createCard = async (req,res)=>{ - try { - const userData = new User(req.body); - const { email } = userData; - - - const cardholder = await stripe.issuing.cardholders.create({ - name: 'Jenny Rosen', - email: 'jenny.rosen@example.com', - phone_number: '+18008675309', - status: 'active', - type: 'individual', - individual: { - first_name: 'Jenny', - last_name: 'Rosen', - dob: {day: 1, month: 11, year: 1981}, - }, - billing: { - address: { - line1: '123 Main Street', - city: 'San Francisco', - state: 'CA', - postal_code: '94111', - country: 'US', - }, - }, - }); - - - res.status(200).json(saveUser); - - } catch (error) { - res.status(500).json({error: `Internal Server error 002 ${error} ` }); - } -} - -export const activateCard = async (req, res)=>{ - try{ - - return res.json("Hello Worlds"); - }catch(error){ - res.status(500).json({error: "Internal Server error"}); - } -} -//C:\WORKS\PROJECTS\WRB\WrenchCore\WrenchStripeNode\controller\cardsController.js \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 71cccda..a12ed5c 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -6,12 +6,12 @@ services: dockerfile: Dockerfile restart: unless-stopped volumes: - - ./:/usr/src - - '/usr/src/node_modules' + - ./:/app + - '/app/node_modules' ports: - - 6332:6320 - # environment: - # - PORT=${WRENCHJOB_PORT} - # - POSTGRE_URL=${WRENCHJOB_POSTGRE_URL} + - 3038:3000 + environment: + - PORT=${WRENCHJOB_PORT} + - POSTGRE_URL=${WRENCHJOB_POSTGRE_URL} volumes: src: \ No newline at end of file diff --git a/index.js b/index.js deleted file mode 100644 index 7f7597c..0000000 --- a/index.js +++ /dev/null @@ -1,43 +0,0 @@ -import express from "express" -import mongoose from "mongoose" -import bodyParser from "body-parser" -import dotenv from "dotenv" -import card_route from "./routes/cardRoute.js" -import nodemailer from "nodemailer"; - -const app = express(); - -// Enable parsing of URL-encoded data on all routes: -app.use(express.urlencoded({ - extended: false, // Whether to use algorithm that can handle non-flat data strutures - limit: 10000, // Limit payload size in bytes - parameterLimit: 2, // Limit number of form items on payload -})); - -//app.use(bodyParser.json()); -dotenv.config(); -const PORT = process.env.PORT || 5000; -const MONGOURL = process.env.MONGO_URL; - - - -mongoose.connect(MONGOURL).then(()=>{ - console.log("Data connected"); - app.listen(PORT,()=>{ - console.log(`Server on ${PORT}`); - }) -}).catch((error)=>{ -console.log(error); -}); -app.use("/api/cards", card_route); - - - - - - - - - - - diff --git a/package.json b/package.json index 157590b..4cf59d4 100644 --- a/package.json +++ b/package.json @@ -2,24 +2,40 @@ "name": "Wrench-Stripe", "version": "1.0.0", "description": "WrenchBoard Stripe", - "main": "index.js", - "type": "module", + "main": "server.js", "scripts": { - "start": "node index.js", - "start:dev": "nodemon index.js" + "generate-docs": "jsdoc ./api/*.js ./api/**/*.js ./app/*.js ./app/**/*.js ./service/*.js ./service/**/*.js -d docs", + "lint": "eslint ./ --ext .js", + "start": "node server.js", + "start:dev": "nodemon server.js", + "test": "npm run lint" }, "author": "ChiefSoft Works", "license": "ISC", "dependencies": { - "@stripe/stripe-js": "^4.0.0", - "axios": "^1.6.8", - "body-parser": "^1.20.2", + "axios": "^0.24.0", + "body-parser": "^1.19.0", + "cors": "^2.8.5", "dotenv": "^16.4.5", - "express": "^4.19.2", - "mongoose": "^8.3.3", - "nodemailer": "^6.9.13" + "cookie-parser": "^1.4.6", + "express": "^4.17.1", + "kafkajs": "^2.2.4", + "openapi-types": "^10.0.0", + "pg": "8.7.1", + "pg-pool": "^3.5.1", + "request": "^2.88.2", + "swagger-autogen": "^2.17.2", + "swagger-jsdoc": "^6.1.0", + "swagger-ui-express": "^4.3.0", + "underscore": "^1.8.3", + "url": "^0.11.0", + "winston": "^2.3.1", + "winston-papertrail": "^1.0.4", + "stripe": "^17.2.0" }, "devDependencies": { - "nodemon": "^3.1.0" + "eslint": "^1.10.3", + "jsdoc": "^3.4.3", + "nodemon": "^1.11.0" } } diff --git a/routes/cardRoute.js b/routes/cardRoute.js deleted file mode 100644 index 73462d4..0000000 --- a/routes/cardRoute.js +++ /dev/null @@ -1,8 +0,0 @@ -import express from "express" -import { activateCard,createCard } from "../controller/cardsController.js" - -const card_route = express.Router(); -route.post("/create",createCard); -route.get("/activate", activateCard) - -export default card_route; \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..c1c5af9 --- /dev/null +++ b/server.js @@ -0,0 +1,42 @@ +const express = require('express'); +const cors = require('cors'); +const cookieParser = require('cookie-parser'); +const bodyParser = require('body-parser'); +const logger = require('./app/logger'); +const port = process.env.PORT || 3000; +const KafkaConfig = require("./app/kconfig"); + +const app = express(); + +// create application/json parser +var jsonParser = bodyParser.json(); // express.json(); + +// create application/x-www-form-urlencoded parser +var urlencodedParser = bodyParser.urlencoded({ extended: false }); // express.bodyParser({extended: true}); + +app.use(urlencodedParser); +app.use(jsonParser); +app.use(cors()); +app.use(cookieParser()); + +// parse application/vnd.api+json as json +app.use(bodyParser.json({ type: 'application/vnd.api+json' })) + +const routes = require('./api/routes/route'); +routes(app); + +app.listen(port, "0.0.0.0", function() { + logger.info('***** Server started on port: ' + port + ' *****'); +}); + + + + + + + + + + + + diff --git a/service/cards.js b/service/cards.js new file mode 100644 index 0000000..c030e04 --- /dev/null +++ b/service/cards.js @@ -0,0 +1,66 @@ +'use strict'; + +const request = require('request'); +const db = require('../app/db') +const logger = require('../app/logger'); +//const User = require("../app/model/cardModel.js"); + +const stripe = require('stripe')('sk_test_51JwvOXCMmfol61TLadZlDf2rxq6Q1IC50JITRixcbyig8T2zdqpO8HY2NEcwNHacRQKQpTf6JGh7haqUVEH0rccA00eFht1ewi'); + +var cards = { + createCard: async function (req, res, next) { + + try { + const userData = new User(req.body); + const {email} = userData; + + + const cardholder = await stripe.issuing.cardholders.create({ + name: 'Jenny Rosen', + email: 'jenny.rosen@example.com', + phone_number: '+18008675309', + status: 'active', + type: 'individual', + individual: { + first_name: 'Jenny', + last_name: 'Rosen', + dob: {day: 1, month: 11, year: 1981}, + }, + billing: { + address: { + line1: '123 Main Street', + city: 'San Francisco', + state: 'CA', + postal_code: '94111', + country: 'US', + }, + }, + }); + + + // res.status(200).json(saveUser); + + } catch (error) { + await res.status(500).json({error: `Internal Server error 002 ${error} `}); + } + + + // let resultItem ={ + // "result": bannerArray, + // "total_record": 4 + // } + // next(null, resultItem ); // pass control to the next handler + + }, + activateCard: function (req, res, next) { + + + let resultItem ={ + "result": [], + "total_record": 5 + } + next(null, resultItem ); // pass control to the next handler + + }, +}; +module.exports = cards;