commit cbd2c0bb7cf42e04e1647fd92075b5e6f2190573 Author: CHIEFSOFT\ameye Date: Fri Mar 8 10:12:05 2024 -0500 first commit diff --git a/.env b/.env new file mode 100644 index 0000000..4b80416 --- /dev/null +++ b/.env @@ -0,0 +1,2 @@ +WRENCHJOB_PORT=3000 +WRENCHJOB_POSTGRE_URL='postgresql://wrenchboard:wrenchboard@10.20.30.60:5432/wrenchboard' diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..62a1a1e --- /dev/null +++ b/.gitignore @@ -0,0 +1,6 @@ +node_modules +*.log +config.json +.queues +*.txt +docs \ No newline at end of file diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000..13566b8 --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,8 @@ +# Default ignored files +/shelf/ +/workspace.xml +# Editor-based HTTP Client requests +/httpRequests/ +# Datasource local storage ignored files +/dataSources/ +/dataSources.local.xml diff --git a/.idea/WrenchBoardBanners.iml b/.idea/WrenchBoardBanners.iml new file mode 100644 index 0000000..c956989 --- /dev/null +++ b/.idea/WrenchBoardBanners.iml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..03d9549 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000..6d60b87 --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ + + + + + + + + \ No newline at end of file diff --git a/.idea/php.xml b/.idea/php.xml new file mode 100644 index 0000000..f324872 --- /dev/null +++ b/.idea/php.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000..35eb1dd --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ + + + + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..24c04a6 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,13 @@ +FROM node:erbium + +# Create app directory +RUN mkdir -p /usr/src/app +WORKDIR /usr/src/app + +# Install app dependencies +COPY package.json /usr/src/app/ +RUN npm install + +COPY . /usr/src/app + +CMD [ "npm", "start" ] \ No newline at end of file diff --git a/api/controller.js b/api/controller.js new file mode 100644 index 0000000..b1267b2 --- /dev/null +++ b/api/controller.js @@ -0,0 +1,34 @@ +'use strict'; + +const properties = require('../package.json') +const jobs = require('../service/jobs'); +const banners = require('../service/banners'); +const logger = require('../app/logger'); + +var controllers = { + getFamilyBanners: function(req, res) { + banners.getfamilybanners(req, res, function(err, result) { + // logger.info(result); + /* + "status": "OK", + "total_record": 1, + "internal_return": 0, + "result_list" + */ + res.status(200).json({'status': 'OK', 'internal_return': 0, 'result_list': result.result,'total_record': result.total_record }) + //res.status(200).json({'status': 'OK', 'result_list': result }) + }); + }, + getHomeBanners: function(req, res) { + //homebanners + banners.homebanners(req, res, function(err, dist) { + if (err) { + res.send(err); + } + res.json(dist); + }); + }, +}; + +module.exports = controllers; + diff --git a/api/routes.js b/api/routes.js new file mode 100644 index 0000000..29e21b5 --- /dev/null +++ b/api/routes.js @@ -0,0 +1,12 @@ +'use strict'; + +const controller = require('./controller'); + +module.exports = function(app) { + app.route('/redeemoptions') + .get(controller.getFamilyBanners); + + app.route('/homebanners') + .get(controller.getHomeBanners); + +}; \ 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/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/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..f6cb5ec --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,18 @@ +version: '3' +services: + wrenchboard-wallet-micro: + build: + context: . + dockerfile: Dockerfile + restart: unless-stopped + # image: registry.chiefsoft.net/flutterwave-transfer-micro:latest + volumes: + - ./:/app + - '/app/node_modules' + ports: + - 3037:3000 + environment: + - PORT=${WRENCHJOB_PORT} + - POSTGRE_URL=${WRENCHJOB_POSTGRE_URL} +volumes: + src: \ No newline at end of file diff --git a/package.json b/package.json new file mode 100644 index 0000000..56ed9ca --- /dev/null +++ b/package.json @@ -0,0 +1,35 @@ +{ + "name": "wrenhboard-wallet-micro", + "version": "0.0.1", + "description": "A microservice to handle wrenchboard banners listing", + "main": "server.js", + "scripts": { + "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": "WrenchBoard Support ", + "dependencies": { + "axios": "^0.24.0", + "body-parser": "^1.19.0", + "express": "^4.17.1", + "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" + }, + "devDependencies": { + "eslint": "^1.10.3", + "jsdoc": "^3.4.3", + "nodemon": "^1.11.0" + } + } \ No newline at end of file diff --git a/server.js b/server.js new file mode 100644 index 0000000..33715c0 --- /dev/null +++ b/server.js @@ -0,0 +1,15 @@ +const express = require('express'); +const logger = require('./app/logger'); +const port = process.env.PORT || 3000; + +const app = express(); + +app.use(express.json()); +app.use(express.urlencoded()); + +const routes = require('./api/routes'); +routes(app); + +app.listen(port, "0.0.0.0", function() { + logger.info('***** Server started on port: ' + port + ' *****'); +}); diff --git a/service/banners.js b/service/banners.js new file mode 100644 index 0000000..ccec212 --- /dev/null +++ b/service/banners.js @@ -0,0 +1,288 @@ +'use strict'; + +const request = require('request'); +const db = require('../app/db') +const logger = require('../app/logger'); + +var banners = { + getfamilybanners: function (req, res, next) { + + //console.log("REQ---->",req.body.uid); + var data = { + "uid": req.body.uid, + "member_id": req.body.member_id, + "limit": (req.body.limit != null && req.body.limit !== "") ? req.body.limit : 20, + "sessionid": req.body.sessionid, + "page": req.body.page + }; + let Qstring =""; // "SELECT uid,id,username FROM members LIMIT 10"; + let QextraString =""; + if ( req.body.uid != null && req.body.uid !== ""){ + QextraString= " AND j.country IN (SELECT c.country FROM members_wallet w " + + " LEFT JOIN currency c ON c.code =w.currency " + + " LEFT JOIN members m ON m.id = w.member_id " + + " WHERE m.uid = '"+req.body.uid+"' )"; + } + + Qstring = " SELECT j.title,j.description,m.id AS job_id,m.expire,m.job_description,j.price, " + + " m.offer_code,j.timeline_days, to_char(m.expire, 'Dy Mon dd, yyyy HH:MI AM') AS expire2," + + " m.uid AS offer_uid,j.uid AS job_uid,m.added::date AS offer_added,j.country AS job_country, " + + " c.code AS currency_code, c.description AS currency_description,j.country, j.category " + + " FROM members_jobs_offer m " + + " LEFT JOIN members_jobs j ON j.id=m.job_id " + + " LEFT JOIN currency c ON c.country=j.country " + + " WHERE m.status = 1 AND m.client_id=0 " + + " AND m.expire IS NOT NULL " + + " AND m.public_view = 1 AND m.expire> now() AND j.status = 1 " + QextraString + + " ORDER BY m.expire DESC LIMIT "+ data.limit; + + // // logger.info(Qstring); + // db.query(Qstring, function (err, result) { + // try { + // if (err) throw err; + // let resultItem ={ + // "result": result.rows, + // "total_record": result.rowCount + // } + // // logger.info(result); + // next(null, resultItem); // pass control to the next handler + // // next(null, result.rows); // pass control to the next handler + // } catch (e) { + // next(e.message, null); // pass control to the next handler + // } + + + // }); + var bannerArray = { + "pending": { + "banner": { + "image": "https://www.wrenchboard.com/assets/images/apps/banners/kids/banner-start.jpg", + "icon": "bannerimage.icon", + "style": "style1", + "text": "Ready to Start ?", + "description": "Waiting for you to get started", + "action": "pending" + } + }, + "current": { + "banner": { + "image": "https://www.wrenchboard.com/assets/images/apps/banners/kids/banner-active.jpg", + "icon": "bannerimage.icon", + "style": "style2", + "text": "Current Activities", + "description": "Your currently active task", + "action": "mytask" + } + }, + "suggested": { + "banner": { + "image": "https://www.wrenchboard.com/assets/images/apps/banners/kids/banner-suggested.jpg", + "icon": "bannerimage.icon", + "style": "style2", + "text": "Waiting for Parent", + "description": "Waiting for parent to get started", + "action": "parentwaiting" + } + }, + "recommend": { + "banner": { + "image": "https://www.wrenchboard.com/assets/images/apps/banners/kids/banner-recommend.jpg", + "icon": "bannerimage.icon", + "style": "style3", + "text": "Recommend to Parent", + "description": "Send to parent to approve", + "action": "familymarket" + } + }, + "pastdue": { + "banner": { + "image": "https://www.wrenchboard.com/assets/images/apps/banners/kids/banner-pastdue.jpg", + "icon": "bannerimage.icon", + "style": "style5", + "text": "Past Due", + "description": "Ask for more time if past due", + "action": "pastdue" + } + } + }; + + // "another1task": { + // "banner": { + // "image": "https://www.wrenchboard.com/assets/images/apps/banners/recommend-banner.jpg", + // "icon": "bannerimage.icon", + // "style": "style4", + // "text": "Dummy for now", + // "description": "dummy dummy dummy", + // "action": "thisaction" + // } + // }, + + let resultItem ={ + "result": bannerArray, + "total_record": 4 + } + next(null, resultItem ); // pass control to the next handler + + }, + homebanners: function (req, res, next) { +var result=[]; + + this.RecoCheckOffers(req, res, function(err, result){ + logger.info("************************ aaaa"); + logger.info(result); + logger.info("************************ bbbb"); + }); + + var result_list =[ + { + "title": "Some family accounts are yet to log in.", + "contract": null, + "card_type": "FAMILY_NOLOGIN", + "card_style": null, + "description": "Some family members have not logged in - a little nudge might help.", + "blog_id": "0", + "card_icon": "icon1", + "offer_id": "0", + "banner": "https://www.wrenchboard.com/assets/images/apps/banners/family-login.jpg", + "banner_location": "URL", + "link_path": "acc-family", + "button_text": "Continue", + "short_button_text": "View Now", + "short_title": "Some family accounts are yet to log in", + "short_description": "Help your family member get started.", + "short_style": "short_style" + }, + { + "title": "Yo man , you have Coupons to play with", + "contract": null, + "card_type": "COUPONS", + "card_style": null, + "description": "You have received some cash coupons waiting to be redeemed.", + "blog_id": "0", + "card_icon": "icon1", + "offer_id": "0", + "banner": "https://www.wrenchboard.com/assets/images/apps/banners/banner-coupons.jpg", + "banner_location": "URL", + "link_path": "my-coupon", + "button_text": "Continue", + "short_button_text": "Redeem", + "short_title": "Redeem your Cash Coupons!", + "short_description": "You have received some cash coupons waiting to be redeemed.", + "short_style": "short_style lg" + }, + { + "title": "Some of your task as owner Need Review now ", + "contract": null, + "card_type": "REVIEWJOB", + "card_style": null, + "description": "Some of your task as owner Need Review now,Some of your task as owner Need Review now, S Need Review now", + "blog_id": "0", + "card_icon": "icon1", + "offer_id": "0", + "banner": "banner-job-due.jpg", + "banner_location": "LOCAL", + "link_path": "my-review-jobs", + "button_text": "View Tasks", + "short_button_text": "Start Review", + "short_title": "Review Ready Tasks", + "short_description": "Some of your jobs are waiting for approval ", + "short_style": "short_style lr" + }, + { + "title": "Some of your task as owner of the tasks are due ", + "contract": null, + "card_type": "PASTDUEJOB", + "card_style": null, + "description": "Some of your task as owner of the tasks are due, Some of your task as owner of the tasks are due", + "blog_id": "0", + "card_icon": "icon1", + "offer_id": "0", + "banner": "https://www.wrenchboard.com/assets/images/apps/banners/past-due.jpg", + "banner_location": "URL", + "link_path": "my-pastdue-jobs", + "button_text": "View Tasks", + "short_button_text": "View", + "short_title": "Past Due Tasks", + "short_description": "Some of you task are now past due", + "short_style": "short_style lr" + }, + { + "title": "Share WrenchBoard with a friend.", + "contract": null, + "card_type": "INVITE", + "card_style": null, + "description": "Show WrenchBoard to a friend and earn free coupons. Get started.", + "blog_id": "0", + "card_icon": "icon1", + "offer_id": "0", + "banner": "banner-refer.jpg", + "banner_location": "LOCAL", + "link_path": "referral", + "button_text": "Continue", + "short_button_text": "View now", + "short_title": "Invite a Friend - get Rewards", + "short_description": "Share WrenchBoard with a friend.", + "short_style": "short_style by" + } + ]; + + let resultItem ={ + "result": result_list, + "total_record": 5 + } + next(null, resultItem ); // pass control to the next handler + + }, + RecoCheckOffers : function (req, res, next) { + let Qstring ="SELECT * FROM members_jobs_offer WHERE expire > now() "+ + "AND status = 1 AND client_id > 0 AND client_id =" +req.body.member_id; + logger.info(Qstring); + db.query(Qstring, function (err, result) { + try { + if (err) throw err; + let resultItem ={ + "result": + [ + { + "title": "Share RecoCheckOffers with a friend.", + "contract": null, + "card_type": "INVITE", + "card_style": null, + "description": "Show WrenchBoard to a friend and earn free coupons. Get started.", + "blog_id": "0", + "card_icon": "icon1", + "offer_id": "0", + "banner": "banner-refer.jpg", + "banner_location": "LOCAL", + "link_path": "referral", + "button_text": "Continue", + "short_button_text": "View now", + "short_title": "Invite a Friend - get Rewards", + "short_description": "Share WrenchBoard with a friend.", + "short_style": "short_style by" + } + ] + + , + "total_record": result.rowCount + }; + logger.info(result); + next(null, resultItem); // pass control to the next handler + } catch (e) { + next(e.message, null); // pass control to the next handler + } + }); + + }, + RecoCheckFamilyLogin : function (req, res, next) {}, + RecoCheckFamilyCount : function (req, res, next) {}, + RecoCheckFamilyCount : function (req, res, next) {}, + RecoCheckCoupons : function (req, res, next) {}, + RecoCheckTaskDue : function (req, res, next) {}, + RecoCheckTaskReview : function (req, res, next) {}, + RecoCheckBlog : function (req, res, next) {}, + RecoOffersInterest : function (req, res, next) {}, + RecoReferAFreind : function (req, res, next) {}, + RecoPendingInterestCount : function (req, res, next) {} +}; +module.exports = banners; diff --git a/service/jobs.js b/service/jobs.js new file mode 100644 index 0000000..6e39573 --- /dev/null +++ b/service/jobs.js @@ -0,0 +1,56 @@ +'use strict'; + +const request = require('request'); +const db = require('../app/db') +const logger = require('../app/logger'); + +var jobs = { + getmarketjobs: function (req, res, next) { + + //console.log("REQ---->",req.body.uid); + var data = { + "uid": req.body.uid, + "member_id": req.body.member_id, + "limit": (req.body.limit != null && req.body.limit !== "") ? req.body.limit : 20, + "sessionid": req.body.sessionid, + "page": req.body.page + }; + let Qstring =""; // "SELECT uid,id,username FROM members LIMIT 10"; + let QextraString =""; + if ( req.body.uid != null && req.body.uid !== ""){ + QextraString= " AND j.country IN (SELECT c.country FROM members_wallet w " + + " LEFT JOIN currency c ON c.code =w.currency " + + " LEFT JOIN members m ON m.id = w.member_id " + + " WHERE m.uid = '"+req.body.uid+"' )"; + } + + Qstring = " SELECT j.title,j.description,m.id AS job_id,m.expire,m.job_description,j.price, " + + " m.offer_code,j.timeline_days, to_char(m.expire, 'Dy Mon dd, yyyy HH:MI AM') AS expire2," + + " m.uid AS offer_uid,j.uid AS job_uid,m.added::date AS offer_added,j.country AS job_country, " + + " c.code AS currency_code, c.description AS currency_description,j.country, j.category " + + " FROM members_jobs_offer m " + + " LEFT JOIN members_jobs j ON j.id=m.job_id " + + " LEFT JOIN currency c ON c.country=j.country " + + " WHERE m.status = 1 AND m.client_id=0 " + + " AND m.expire IS NOT NULL " + + " AND m.public_view = 1 AND m.expire> now() AND j.status = 1 " + QextraString + + " ORDER BY m.expire DESC LIMIT "+ data.limit; + + // logger.info(Qstring); + db.query(Qstring, function (err, result) { + try { + if (err) throw err; + let resultItem ={ + "result": result.rows, + "total_record": result.rowCount + } + // logger.info(result); + next(null, resultItem); // pass control to the next handler + // next(null, result.rows); // pass control to the next handler + } catch (e) { + next(e.message, null); // pass control to the next handler + } + }); + } +}; +module.exports = jobs;