From 5e3dc0c7554d10db3c5f68d917b2858b42a01ae5 Mon Sep 17 00:00:00 2001 From: Le Viet Date: Mon, 20 Jun 2022 15:02:52 +0700 Subject: [PATCH] update api cards and backoffice --- package-lock.json | 27 + package.json | 1 + src/server/controllers/bkouser.js | 27 + src/server/controllers/index.js | 4 +- src/server/controllers/member.js | 33 + src/server/routes/admin.js | 52 + src/server/routes/index.js | 4 +- src/server/routes/member.js | 57 +- src/server/services/admin/bkouser.js | 93 ++ src/server/services/admin/index.js | 5 + src/server/services/card/memberCard.js | 176 +++- src/server/services/index.js | 4 +- src/server/services/member/member.js | 1248 +++++++++++++----------- 13 files changed, 1140 insertions(+), 591 deletions(-) create mode 100755 src/server/controllers/bkouser.js create mode 100644 src/server/routes/admin.js create mode 100755 src/server/services/admin/bkouser.js create mode 100644 src/server/services/admin/index.js diff --git a/package-lock.json b/package-lock.json index 091a9c8..f99cf67 100644 --- a/package-lock.json +++ b/package-lock.json @@ -747,6 +747,11 @@ "supports-color": "^7.1.0" } }, + "charenc": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", + "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==" + }, "check-error": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", @@ -1041,6 +1046,11 @@ "which": "^2.0.1" } }, + "crypt": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", + "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==" + }, "crypto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/crypto/-/crypto-1.0.1.tgz", @@ -2981,6 +2991,23 @@ "ssri": "^8.0.1" } }, + "md5": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", + "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", + "requires": { + "charenc": "0.0.2", + "crypt": "0.0.2", + "is-buffer": "~1.1.6" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + } + } + }, "media-typer": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", diff --git a/package.json b/package.json index 1ae8ba8..9e5666b 100755 --- a/package.json +++ b/package.json @@ -23,6 +23,7 @@ "handlebars": "^4.7.7", "jsonwebtoken": "^8.5.1", "lodash": "^4.17.21", + "md5": "^2.3.0", "morgan": "1.9.1", "node-gyp": "^9.0.0", "nodemailer": "^6.7.2", diff --git a/src/server/controllers/bkouser.js b/src/server/controllers/bkouser.js new file mode 100755 index 0000000..fd60d74 --- /dev/null +++ b/src/server/controllers/bkouser.js @@ -0,0 +1,27 @@ +const memberServices = require("../services").adminService.bkouser; + +console.log(memberServices) +module.exports = { + register(req, res) { + const errors = validationResult(req); + if (!errors.isEmpty()) { + console.log(errors) + return res.status(400).json({ errors: errors.array() }); + } + return memberServices.create(req) + .then(member => { + res.status(200).send({ + message: "Register succesfully" + }) + }) + .catch(error => { + res.status(400).send(error.errors) + }); + }, + + login(req, res) { + memberServices.login(req) + .then(accessToken => res.status(200).send(accessToken)) + .catch(error => res.status(400).send(error.errors)); + }, +}; \ No newline at end of file diff --git a/src/server/controllers/index.js b/src/server/controllers/index.js index dee322e..820fd17 100755 --- a/src/server/controllers/index.js +++ b/src/server/controllers/index.js @@ -1,5 +1,7 @@ const member = require("./member"); +const bkoUser = require("./bkouser"); module.exports = { - member + member, + bkoUser }; diff --git a/src/server/controllers/member.js b/src/server/controllers/member.js index cae8d0f..256912d 100755 --- a/src/server/controllers/member.js +++ b/src/server/controllers/member.js @@ -142,4 +142,37 @@ module.exports = { res.status(400).send(error.errors) }); }, + + saveDashCard(req, res) { + console.log('saveDashCard') + memberServices.saveDashCard(req) + .then(data => { + return res.status(200).send(data) + }) + .catch(error => { + res.status(400).send(error.errors) + }); + }, + + getDashCards(req, res) { + console.log('getDashCard'); + memberServices.getDashCards(req) + .then(data => { + return res.status(200).send(data) + }) + .catch(error => { + res.status(400).send(error.errors) + }); + }, + + subscribeCard(req, res) { + console.log('subscribeCard') + memberServices.subscribeCard(req) + .then(data => { + return res.status(200).send(data) + }) + .catch(error => { + res.status(400).send(error.errors) + }); + }, }; \ No newline at end of file diff --git a/src/server/routes/admin.js b/src/server/routes/admin.js new file mode 100644 index 0000000..07861a7 --- /dev/null +++ b/src/server/routes/admin.js @@ -0,0 +1,52 @@ +const BkoUserController = require("../controllers").bkoUser; + +module.exports = (app, url) => { + /** + * @swagger + * /v1/user/login: + * post: + * tags: + * - Users + * summary: Create a JSONPlaceholder user. + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * username: + * type: string + * description: The user's username. + * example: test + * password: + * type: string + * description: The user's password. + * example: password + * responses: + * 200: + * description: Login success + * content: + * application/json: + * schema: + * type: object + * properties: + * accessToken: + * type: string + * description: Message + * example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3RAZmxvYXQuc2ciLCJpYXQiOjE2NDcwODIxNDIsImV4cCI6MTY0NzA4Mzk0Mn0.fMQYB4ielKPh21QcZFwOJSjlGNCAg8rkvEcKWctxdX8 + * 400: + * description: Invalid + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * description: Message + * example: Wrong username or password + */ + app.post(url + "admin/login", BkoUserController.login); + +}; diff --git a/src/server/routes/index.js b/src/server/routes/index.js index 5794f2a..28e7680 100755 --- a/src/server/routes/index.js +++ b/src/server/routes/index.js @@ -1,6 +1,8 @@ const member = require("./member"); +const admin = require("./admin"); const url = '/api/v1/'; module.exports = (app) => { - member(app, url) + member(app, url); + admin(app, url); }; diff --git a/src/server/routes/member.js b/src/server/routes/member.js index 7a43f83..f19be6c 100644 --- a/src/server/routes/member.js +++ b/src/server/routes/member.js @@ -292,8 +292,10 @@ module.exports = (app, url) => { * app.post("refreshlinkemail"); * app.post("usertransportlist"); * app.post("usertransportprofile"); - * app.post("getdashcarddata"); - */ + * + * */ + app.get(url + "user/getdashcarddata", auth, memberController.getDashCards); + /** * @swagger * /v1/user/loadsavedcards: @@ -314,8 +316,55 @@ module.exports = (app, url) => { * $ref: '#/components/schemas/Member' */ app.get(url + "user/loadsavedcards", auth, memberController.loadSavedCards); + /** + * @swagger + * /v1/user/savedashcard: + * post: + * tags: + * - Users + * summary: Create a JSONPlaceholder user. + * requestBody: + * required: true + * content: + * application/json: + * schema: + * type: object + * properties: + * email: + * type: string + * description: The user's username. + * example: test@float.sg + * mode: + * type: integer + * description: The reset mode + * example: 100 + * responses: + * 200: + * description: Login success + * content: + * application/json: + * schema: + * type: object + * properties: + * accessToken: + * type: string + * description: Message + * example: eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InRlc3RAZmxvYXQuc2ciLCJpYXQiOjE2NDcwODIxNDIsImV4cCI6MTY0NzA4Mzk0Mn0.fMQYB4ielKPh21QcZFwOJSjlGNCAg8rkvEcKWctxdX8 + * 400: + * description: Invalid + * content: + * application/json: + * schema: + * type: object + * properties: + * message: + * type: string + * description: Message + * example: Wrong username or password + */ + app.post(url + "user/savedashcard", auth, memberController.saveDashCard); /* - * app.post("savedashcard"); + * * app.post("saveuserbudget"); * app.post("resetpass"); * app.post("settingsarray"); @@ -346,9 +395,9 @@ module.exports = (app, url) => { */ app.get(url + "user/getslidecarddata", auth, memberController.getSlideCardData); + app.post(url + "user/subscribecard", auth, memberController.subscribeCard); /** * app.post("subscribedcarddata"); - * app.post("subscribecard"); * app.post("savesurvey"); * app.post("pointsdetail"); * app.post("loadredeemabale"); diff --git a/src/server/services/admin/bkouser.js b/src/server/services/admin/bkouser.js new file mode 100755 index 0000000..76fd662 --- /dev/null +++ b/src/server/services/admin/bkouser.js @@ -0,0 +1,93 @@ +const jwt = require('jsonwebtoken'); +const bcrypt = require('bcrypt'); +const crypto = require('crypto'); +const {pick, merge } = require('lodash'); +const BkoUser = require("../../models").BkoUsers; +var md5 = require('md5'); + +module.exports = { + RESET_START: 100, + RESET_CONFIRM: 200, + RESET_COMPLETE: 300, + async create(req) { + const { username, password, firstname, lastname, phone, email, signUpSurveyData } = req.body; + const salt = bcrypt.genSaltSync(10); + const hashpassword = bcrypt.hashSync(password, salt); + const user = { + username: username, + password: hashpassword, + firstname: firstname, + lastname: lastname, + phone: phone, + email: email + } + + const member = await BkoUser.create(user); + if (member.id > 0) { + var arrayData = []; + forEach(signUpSurveyData, async function (survey) { + var answers = survey.answers; + forEach(answers, function (answer, answerKey) { + if (answer === true) { + var surveyData = { + member_id: member.id, + answers_key: answerKey, + answers: answer, + status: 1 + } + arrayData.push(surveyData) + } + }) + }); + MemberOnboardingSurvey.bulkCreate(arrayData); + } + return member; + }, + + async login(req) { + console.log('sss'); + try { + const user = await BkoUser.findOne({ + where: { + username: req.body.username, + status: 1 + } + }); + console.log(md5(req.body.password)); + if (user) { + if (md5(req.body.password) == user.password) { + user.last_login = Date.now() + user.save() + rs = [ + 'firstname', + 'lastname', + 'username', + 'email', + 'pid', + 'loc' + ]; + b = pick(user, rs) + var a ={ + session_id: md5(Math.random(99)*10000), + retval: 0 + } + return merge(a,b) + } else { + return { + message: "Wrong username or password." + }; + } + } else { + return { + message: "Wrong email." + }; + } + } catch (error) { + console.debug(error) + return { + message: "Internal Server error Occured" + }; + } + }, + +} \ No newline at end of file diff --git a/src/server/services/admin/index.js b/src/server/services/admin/index.js new file mode 100644 index 0000000..8fa1270 --- /dev/null +++ b/src/server/services/admin/index.js @@ -0,0 +1,5 @@ +const bkouser = require("./bkouser"); + +module.exports = { + bkouser +}; diff --git a/src/server/services/card/memberCard.js b/src/server/services/card/memberCard.js index aa570a9..8c9eb7f 100644 --- a/src/server/services/card/memberCard.js +++ b/src/server/services/card/memberCard.js @@ -1,7 +1,9 @@ const sequelize = require("../../models").sequelize; const { Op } = require("sequelize"); -const { forEach, invoke } = require('lodash'); +const { forEach, invoke, omit, merge } = require('lodash'); const MembersCardAssign = require("../../models").MembersCardAssign; +const MainCards = require("../../models").MainCards; +const MemberSavedCards = require("../../models").MemberSavedCards; module.exports = (memberService) => { const cardService = { @@ -73,14 +75,18 @@ module.exports = (memberService) => { status: 1, updated: Date.now() }; + const condition = { + member_id: memberId, + card_id: cardId, + } console.log('cardClick', cardClick) if (cardClick) { if (cardClick.expiration == 0) { - this.updateMemberCardAssign(memberId, cardId, data); + this.updateMemberCardAssign(condition, data); } } else { //update card status - this.updateMemberCardAssign(memberId, cardId, data); + this.updateMemberCardAssign(condition, data); } } else { //status already added @@ -93,7 +99,7 @@ module.exports = (memberService) => { status: 1 } //console.log(data); - //this.memberCardAssignInsert(data); + this.memberCardAssignInsert(data); } }, @@ -133,16 +139,13 @@ module.exports = (memberService) => { }, - async updateMemberCardAssign(memberId, cardId, data) { + async updateMemberCardAssign(condition, data) { console.log('updateMemberCardAssign') return MembersCardAssign .update(data, { returning: true, - where: { - member_id: memberId, - card_id: cardId, - } + where: condition } ) .then(([rowsUpdate, [updatedRow]]) => { @@ -206,7 +209,7 @@ module.exports = (memberService) => { queryMain = `FROM main_cards a LEFT JOIN card_actions b ON (b.id=a.card_action_id) WHERE a.status = 1 AND a.deleted IS NULL`; sqlCount += queryMain; - sqlSelect += queryMain + ` ORDER BY RANDOM()`; + sqlSelect += queryMain + ` ORDER BY RANDOM()`; break; default: sql = `select 1 from 1`; @@ -349,9 +352,9 @@ module.exports = (memberService) => { async getSavedCards(memberId) { console.log(memberId) var result = { - total_record : 0, - session_valid : '', - internal_return : 0, + total_record: 0, + session_valid: '', + internal_return: 0, status: 'OK' } var saveCardsSql = `SELECT m.id AS saved_card_id, mc.*,mc.id AS card_id @@ -362,7 +365,7 @@ module.exports = (memberService) => { const resultRaw = await sequelize.query(saveCardsSql, { replacements: { member_id: memberId } }); - + if (resultRaw[0]) { result.total_record = resultRaw[0].length; let ic = 0; @@ -389,6 +392,151 @@ module.exports = (memberService) => { } return { result: result } + }, + + async getDashCards(cardCount) { + var result = { + name: "Save Money", + short_title: "Save Money", + title: "Let start saving money...", + description: "I'm Float. Together we are going to make your travel, commute, and life a whole lot better. Did you bring a life jacket?", + background_picture: "https://adminsavvy.sworks.float.sg/SAVVY/img/feed1.jpg", + button1: "", + button1_text: "Let Start", + button1_action: "GOOFFERS", + can_save: 0, + card_id: 0 + }; + + if (cardCount > 0) { + var card = await MainCards.findOne({ + where: { + id: cardCount + } + }); + if (card) { + result = card.dataValues; + result.card_id = result.id + return omit(result, 'id'); + } + } + return result; + }, + + async saveDashCard(memberId, cardId) { + result = { + saved_card_id: 0 + }; + var data = { + member_id: memberId, + card_id: cardId + }; + var saveCard = await MemberSavedCards.findOne({ + where: data + }); + console.log(saveCard) + if (!saveCard) { + return await MemberSavedCards.create(data); + } + return saveCard; + }, + + + async subscribeCard(memberId, cardId, dir) { + memberService.refreshMembersPersonalty(memberId); + return + var result = { + saved_card_id: 0 + } + var condition = { + member_id: memberId, + card_id: cardId + }; + var cardAssign = await MembersCardAssign.findOne({ + where: merge(condition, { + status: 1 + }) + }); + + console.log(cardAssign) + if (cardAssign) { + switch (dir) { + case 1: + var data = { + subscribe: Date.now() + }; + this.updateMemberCardAssign( + merge(condition, {subscribe: null}), + data + ); + result.sub_status = "SUBSCRIB"; + break; + case 2: + var data = { + subscribe: null + }; + this.updateMemberCardAssign( + merge(condition, {subscribe: { + [Op.ne]: null + }}), + data + ); + result.sub_status = "UNSUB"; + break; + + } + } else { + var cardAssign = await MembersCardAssign.findOne({ + where: merge(condition, { + status: 0 + }) + }); + if (!cardAssign) { + var dataCard = { + member_id: memberId, + card_id: cardId, + how: "DEALS" + } + card = await this.memberCardAssignInsert(dataCard); + if (card.id) { + var data = { + subscribe: Date.now(), + status: 3 + }; + var condition = { + member_id: memberId, + card_id: card.id, + subscribe: null + }; + this.updateMemberCardAssign(condition, data); + result.sub_status = "SUBSCRIB"; + memberService.refreshMembersPersonalty(memberId) + } + } else { + var data = { + subscribe: Date.now(), + status: 3, + how: "DEALS" + }; + var condition = { + member_id: memberId, + card_id: card.id, + id: cardAssign.id + }; + this.updateMemberCardAssign(condition, data); + } + } + + cardAssign = await MembersCardAssign.findOne({ + where: { + member_id: memberId, + card_id: cardId, + status: 1 + } + }); + memberService.refreshMembersPersonalty(memberId) + console.log(cardAssign) + return cardAssign; } } diff --git a/src/server/services/index.js b/src/server/services/index.js index aefb60c..ae7fb4c 100755 --- a/src/server/services/index.js +++ b/src/server/services/index.js @@ -1,6 +1,7 @@ const cardService = require("./card"); const mailService = require("./mail"); const memberService = require("./member"); +const adminService = require("./admin"); /*console.log({ cardService, @@ -10,5 +11,6 @@ const memberService = require("./member"); module.exports = { cardService, mailService, - memberService + memberService, + adminService }; diff --git a/src/server/services/member/member.js b/src/server/services/member/member.js index 619ec47..a4acf46 100755 --- a/src/server/services/member/member.js +++ b/src/server/services/member/member.js @@ -1,629 +1,737 @@ const jwt = require('jsonwebtoken'); -const { pick, forEach } = require('lodash'); +const { pick, forEach, result } = require('lodash'); const bcrypt = require('bcrypt'); const crypto = require('crypto'); const Member = require("../../models").Members; const sequelize = require("../../models").sequelize; const MemberOnboardingSurvey = require("../../models").MembersOnboardingSurvey; -const MembersTracking = require("../../models").MembersTracking; +const MembersPersonaltyLog = require("../../models").MembersPersonaltyLog; const MembersBankAccount = require("../../models").MembersBankAccounts; const resetPasswordService = require("./resetPassword"); const memberCardService = require("../card").memberCard.bind(this); const mailServiceMember = require("../mail").member; -const { memberCard } = require('../card'); -console.log('card in member', memberCardService) +//console.log('card in member', memberCardService) module.exports = { - RESET_START: 100, - RESET_CONFIRM: 200, - RESET_COMPLETE: 300, - async create(req) { - const { username, password, firstname, lastname, phone, email, signUpSurveyData } = req.body; - const salt = bcrypt.genSaltSync(10); - const hashpassword = bcrypt.hashSync(password, salt); - const user = { - username: username, - password: hashpassword, - firstname: firstname, - lastname: lastname, - phone: phone, - email: email - } + RESET_START: 100, + RESET_CONFIRM: 200, + RESET_COMPLETE: 300, + async create(req) { + const { username, password, firstname, lastname, phone, email, signUpSurveyData } = req.body; + const salt = bcrypt.genSaltSync(10); + const hashpassword = bcrypt.hashSync(password, salt); + const user = { + username: username, + password: hashpassword, + firstname: firstname, + lastname: lastname, + phone: phone, + email: email + } - const member = await Member.create(user); - if (member.id > 0) { - var arrayData = []; - forEach(signUpSurveyData, async function (survey) { - var answers = survey.answers; - forEach(answers, function (answer, answerKey) { - if (answer === true) { - var surveyData = { - member_id: member.id, - answers_key: answerKey, - answers: answer, - status: 1 - } - arrayData.push(surveyData) - } - }) - }); - MemberOnboardingSurvey.bulkCreate(arrayData); - } - return member; - }, + const member = await Member.create(user); + if (member.id > 0) { + var arrayData = []; + forEach(signUpSurveyData, async function (survey) { + var answers = survey.answers; + forEach(answers, function (answer, answerKey) { + if (answer === true) { + var surveyData = { + member_id: member.id, + answers_key: answerKey, + answers: answer, + status: 1 + } + arrayData.push(surveyData) + } + }) + }); + MemberOnboardingSurvey.bulkCreate(arrayData); + } + return member; + }, - async login(req) { - try { - const user = await Member.findOne({ - where: { - username: req.body.username, - status: 1 - } - }); - if (user) { - const cmp = await bcrypt.compare(req.body.password, user.password); + async login(req) { + try { + const user = await Member.findOne({ + where: { + username: req.body.username, + status: 1 + } + }); + if (user) { + const cmp = await bcrypt.compare(req.body.password, user.password); - if (cmp) { - user.last_login = Date.now() - user.save() - const token = jwt.sign({ - username: user.username, - id: user.id - }, - process.env.TOKEN_SECRET, { expiresIn: process.env.TOKEN_EXPIRES } - ); + if (cmp) { + user.last_login = Date.now() + user.save() + const token = jwt.sign({ + username: user.username, + id: user.id + }, + process.env.TOKEN_SECRET, { expiresIn: process.env.TOKEN_EXPIRES } + ); - return { - accessToken: token - }; - } else { - return { - message: "Wrong username or password." - }; - } - } else { - return { - message: "Wrong email." - }; - } - } catch (error) { - console.debug(error) - return { - message: "Internal Server error Occured" - }; - } - }, + return { + accessToken: token + }; + } else { + return { + message: "Wrong username or password." + }; + } + } else { + return { + message: "Wrong email." + }; + } + } catch (error) { + console.debug(error) + return { + message: "Internal Server error Occured" + }; + } + }, - async forgotPassword(req) { - try { - const user = await Member.findOne({ - where: { username: req.body.username } - }); - if (user) { - const cmp = await bcrypt.compare(req.body.password, user.password); + async forgotPassword(req) { + try { + const user = await Member.findOne({ + where: { username: req.body.username } + }); + if (user) { + const cmp = await bcrypt.compare(req.body.password, user.password); - if (cmp) { - user.last_login = Date.now() - user.save() - const token = jwt.sign({ - username: user.username - }, - process.env.TOKEN_SECRET, { expiresIn: process.env.TOKEN_EXPIRES } - ); + if (cmp) { + user.last_login = Date.now() + user.save() + const token = jwt.sign({ + username: user.username + }, + process.env.TOKEN_SECRET, { expiresIn: process.env.TOKEN_EXPIRES } + ); - return { - accessToken: token - }; - } else { - return { - message: "Wrong username or password." - }; - } - } else { - return { - message: "Wrong username or password." - }; - } - } catch (error) { - console.debug(error) - return { - message: "Internal Server error Occured" - }; - } - }, + return { + accessToken: token + }; + } else { + return { + message: "Wrong username or password." + }; + } + } else { + return { + message: "Wrong username or password." + }; + } + } catch (error) { + console.debug(error) + return { + message: "Internal Server error Occured" + }; + } + }, - async resetPassword(req) { - try { - const user = await Member.findOne({ - where: { - username: req.body.email, - status: 1 - } - }); - var date = new Date(); - let reset_key = crypto.createHash('md5').update(date.toString()).digest("hex"); - let reset_pin = Math.floor(100000 + Math.random() * 900000) + async resetPassword(req) { + try { + const user = await Member.findOne({ + where: { + username: req.body.email, + status: 1 + } + }); + var date = new Date(); + let reset_key = crypto.createHash('md5').update(date.toString()).digest("hex"); + let reset_pin = Math.floor(100000 + Math.random() * 900000) - let expired = date.setDate(date.getDate() + 7); - var status = 3; + let expired = date.setDate(date.getDate() + 7); + var status = 3; - if (user == null) { - console.log('user null') - return false; - } + if (user == null) { + console.log('user null') + return false; + } - resetPasswordService.updateStatusExpired(user.id, 7); - status = 0 - const resetPasswordData = { - username: user.username, - member_id: user.id, - reset_pin: reset_pin, - reset_key: reset_key, - expired: expired, - status: status - } + resetPasswordService.updateStatusExpired(user.id, 7); + status = 0 + const resetPasswordData = { + username: user.username, + member_id: user.id, + reset_pin: reset_pin, + reset_key: reset_key, + expired: expired, + status: status + } - var sendmail = mailServiceMember.emailResetPassword(user, reset_pin) - console.log("send email ", sendmail); - if (sendmail != false) { - resetPasswordService.create(resetPasswordData) - .then(result => { - return true; - }) - .catch(error => { - console.log(error.errors) - return false; - }); - } else { - return 'Cannot send email' - } + var sendmail = mailServiceMember.emailResetPassword(user, reset_pin) + console.log("send email ", sendmail); + if (sendmail != false) { + resetPasswordService.create(resetPasswordData) + .then(result => { + return true; + }) + .catch(error => { + console.log(error.errors) + return false; + }); + } else { + return 'Cannot send email' + } - } catch (error) { - console.debug(error) - return "Invalid email"; - } - }, + } catch (error) { + console.debug(error) + return "Invalid email"; + } + }, - async confirmResetPassword(req) { - try { - const user = await Member.findOne({ - where: { - username: req.body.email, - status: 1 - } - }); - if (user) { - const exist = await resetPasswordService.getByCondition({ - member_id: user.id, - status: 0, - reset_pin: req.body.resetPin.toString() - }); - if (exist) { - resetPasswordService.updateStatusById(exist.id, 1); - return { - resetKey: exist.reset_key - } - } - return "invalid PIN"; - } else { - return "email is not existed"; - } - } catch (error) { - console.debug(error) - return "Invalid email"; - } - }, + async confirmResetPassword(req) { + try { + const user = await Member.findOne({ + where: { + username: req.body.email, + status: 1 + } + }); + if (user) { + const exist = await resetPasswordService.getByCondition({ + member_id: user.id, + status: 0, + reset_pin: req.body.resetPin.toString() + }); + if (exist) { + resetPasswordService.updateStatusById(exist.id, 1); + return { + resetKey: exist.reset_key + } + } + return "invalid PIN"; + } else { + return "email is not existed"; + } + } catch (error) { + console.debug(error) + return "Invalid email"; + } + }, - async completeResetPassword(req) { - try { - const user = await Member.findOne({ - where: { - username: req.body.email, - status: 1 - } - }); - if (user) { - const exist = await resetPasswordService.getByCondition({ - member_id: user.id, - status: 1, - reset_pin: req.body.resetPin.toString(), - reset_key: req.body.resetKey.toString() - }); - if (exist) { - console.log(req.body.newPassword) - const salt = bcrypt.genSaltSync(10); - const hashpassword = bcrypt.hashSync(req.body.newPassword, salt); - Member - .update( - { - password: hashpassword - }, - { - returning: true, - where: { - id: user.id - } - } - ) - .then(([rowsUpdate, [updatedRow]]) => { - console.log(updatedRow) - console.log(rowsUpdate) - }) - .catch(error => { - console.log(error) - }); + async completeResetPassword(req) { + try { + const user = await Member.findOne({ + where: { + username: req.body.email, + status: 1 + } + }); + if (user) { + const exist = await resetPasswordService.getByCondition({ + member_id: user.id, + status: 1, + reset_pin: req.body.resetPin.toString(), + reset_key: req.body.resetKey.toString() + }); + if (exist) { + console.log(req.body.newPassword) + const salt = bcrypt.genSaltSync(10); + const hashpassword = bcrypt.hashSync(req.body.newPassword, salt); + Member + .update( + { + password: hashpassword + }, + { + returning: true, + where: { + id: user.id + } + } + ) + .then(([rowsUpdate, [updatedRow]]) => { + console.log(updatedRow) + console.log(rowsUpdate) + }) + .catch(error => { + console.log(error) + }); - resetPasswordService.updateStatusById(exist.id, 5); - return { - message: "Password has been update. Please try login!" - } - } - return "invalid Pin or Key"; - } else { - return "email is not existed"; - } - } catch (error) { - console.debug(error) - return "Invalid email"; - } - }, + resetPasswordService.updateStatusById(exist.id, 5); + return { + message: "Password has been update. Please try login!" + } + } + return "invalid Pin or Key"; + } else { + return "email is not existed"; + } + } catch (error) { + console.debug(error) + return "Invalid email"; + } + }, - async getProfile(req) { - //console.log(req.user) - const member_id = req.user.id; - var result = {}; - let sql = `SELECT dg.personality AS personality_name,m.id AS member_id,m.*,m.id as id - FROM members m LEFT JOIN members_profile p ON p.member_id=m.id LEFT JOIN decision_group dg ON dg.dkey = m.decision_group - WHERE m.id=:member_id LIMIT 1`; - const results = await sequelize.query(sql, - { - replacements: { member_id: member_id } - }); - if (results[0][0]) { - result = results[0][0]; + async getProfile(req) { + //console.log(req.user) + const member_id = req.user.id; + var result = {}; + let sql = `SELECT dg.personality AS personality_name,m.id AS member_id,m.*,m.id as id + FROM members m LEFT JOIN members_profile p ON p.member_id=m.id LEFT JOIN decision_group dg ON dg.dkey = m.decision_group + WHERE m.id=:member_id LIMIT 1`; + const results = await sequelize.query(sql, + { + replacements: { member_id: member_id } + }); + if (results[0][0]) { + result = results[0][0]; - result['internal_return'] = 100; - result['session'] = req.user.accessToken; - result['session_contructed'] = req.user.accessToken; - rs = [ - 'internal_return', - 'firstname', - 'lastname', - 'session', - 'session_contructed', - 'username', - 'last_login', - 'member_id', - 'balance', - 'added', - 'account_added', - 'city', - 'country', - 'account_added', - 'email', - 'fb_id', - 'id', - 'loc', - 'news', - 'phone', - 'post_jobs', - 'profile_pic', - 'refer', - 'state', - 'status', - 'street1', - 'zipcode', - 'test', - 'points', - 'min_budget', - 'max_budget', - 'prompt_background_gps', - ]; - return pick(result, rs) - } - return result; - }, + result['internal_return'] = 100; + result['session'] = req.user.accessToken; + result['session_contructed'] = req.user.accessToken; + rs = [ + 'internal_return', + 'firstname', + 'lastname', + 'session', + 'session_contructed', + 'username', + 'last_login', + 'member_id', + 'balance', + 'added', + 'account_added', + 'city', + 'country', + 'account_added', + 'email', + 'fb_id', + 'id', + 'loc', + 'news', + 'phone', + 'post_jobs', + 'profile_pic', + 'refer', + 'state', + 'status', + 'street1', + 'zipcode', + 'test', + 'points', + 'min_budget', + 'max_budget', + 'prompt_background_gps', + ]; + return pick(result, rs) + } + return result; + }, - updateProfile(username, data) { - return Member - .update(data, - { - returning: true, - where: { - username: username - } - } - ) - .then(([rowsUpdate, [updatedRow]]) => { - return updatedRow - }) - .catch(error => { - console.log(error) - }); - }, + updateProfile(username, data) { + return Member + .update(data, + { + returning: true, + where: { + username: username + } + } + ) + .then(([rowsUpdate, [updatedRow]]) => { + return updatedRow + }) + .catch(error => { + console.log(error) + }); + }, - async updatePassword(req) { - const username = req.user.username; - const user = await Member.findOne({ - where: { username: username }, - attributes: ['password', 'username'] - }); - const cmp = await bcrypt.compare(req.body.oldPassword, user.password); + async updatePassword(req) { + const username = req.user.username; + const user = await Member.findOne({ + where: { username: username }, + attributes: ['password', 'username'] + }); + const cmp = await bcrypt.compare(req.body.oldPassword, user.password); - console.log(cmp); - if (cmp) { - const salt = bcrypt.genSaltSync(10); - const hashpassword = bcrypt.hashSync(req.body.newPassword, salt); - return Member - .update( - { - password: hashpassword - }, - { - returning: true, - where: { - username: username - } - } - ); - } - return "Wrong password" - }, + console.log(cmp); + if (cmp) { + const salt = bcrypt.genSaltSync(10); + const hashpassword = bcrypt.hashSync(req.body.newPassword, salt); + return Member + .update( + { + password: hashpassword + }, + { + returning: true, + where: { + username: username + } + } + ); + } + return "Wrong password" + }, - async deactivateAccount(req) { - return Member - .destroy({ - where: { - id: req.params.id - } - }) - .then(rowDeleted => { - if (rowDeleted !== 1) { - throw ({ - "name": "ValidationError", - "errors": [{ - message: 'Item not found' - }] - }); - } - return res.status(200).json({ message: "Deleted successfully" }); - }) - .catch(error => res.status(400).send(error)); - }, + async deactivateAccount(req) { + return Member + .destroy({ + where: { + id: req.params.id + } + }) + .then(rowDeleted => { + if (rowDeleted !== 1) { + throw ({ + "name": "ValidationError", + "errors": [{ + message: 'Item not found' + }] + }); + } + return res.status(200).json({ message: "Deleted successfully" }); + }) + .catch(error => res.status(400).send(error)); + }, - detectMemberLocation(memberId) { - /* - clog::fileName = "savvy_location"; - logfmt(FLOG_MAX, "detectMemberLocation()"); - const PGresult *res; - const PGresult *res1; - bool country_set = false; - load_db_record(out, "SELECT trim(country) AS country FROM members WHERE id = %lu", member_id); // this should also get the city outright - out["country_found"] = "0"; - if (out["country"] == "") { // country is blank - out["country_found"] = "0"; - // now let us see if we can change this with GPS - if (gpsMemberGPSLocations(member_id, out) == PHP_API_OK) { - logfmt(FLOG_MAX, "detectMemberLocation() DETECT LOCATION == %s country", out["country"].c_str()); - logfmt(FLOG_MAX, "detectMemberLocation() DETECT LOCATION == %s state", out["state"].c_str()); - logfmt(FLOG_MAX, "detectMemberLocation() DETECT LOCATION == %s city", out["city"].c_str()); - pgsql_query("UPDATE members SET country = '%s', state='%s', city='%s',updated=now() WHERE id = %lu", out["country"].c_str(), out["state"].c_str(), out["city"].c_str(), member_id); - country_set = true; - out["country_found"] = "1"; - } - - //OR WITH BANK Imports - if (false == country_set) { - bool cf = false; - res = pgsql_query("SELECT count(id) AS cur_count,currency FROM members_bankimport WHERE member_id =%lu GROUP BY currency ORDER BY cur_count DESC LIMIT 1", member_id); - if (res != NULL && pgsql_num_rows(res) > 0) { - map f = pgsql_fetch_assoc(res, 0); - CVars rec; - map_to_cvars(f, rec); - logfmt(FLOG_MAX, "detectMemberLocation() BANK DETECT LOCATION == %s currency", rec["currency"].c_str()); - - if (rec["currency"] == "USD") { - out["country"] = "US"; - cf = true; - } else { - res1 = pgsql_query("SELECT code FROM country WHERE currency_code ='%s'", rec["currency"].c_str()); - if (res1 != NULL && pgsql_num_rows(res1) > 0) { - map f = pgsql_fetch_assoc(res1, 0); - CVars rec1; - map_to_cvars(f, rec1); - out["country"] = rec1["code"]; - cf = true; - } - } - - if (cf == true) // actual update if found - { - pgsql_query("UPDATE members SET country = '%s',updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); - out["country_found"] = "1"; - } - } else { - //out["session_valid"] = "INVALID_SESSION_CALL"; - } - - } // do only if country not set yet - - //OR WITH SURVEY ******************************************************************************************************* - - if (false == country_set) { - - res = pgsql_query("SELECT * FROM members_survey WHERE member_id =%lu AND LOWER(answer)='yes' AND card_id IN ( SELECT card_id FROM survey_card_country WHERE country ='SG' )", member_id); - if (res != NULL && pgsql_num_rows(res) > 0) { - out["country"] = "SG"; - out["country"].set_valid(true); - pgsql_query("UPDATE members SET country = '%s',updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); - out["country_found"] = "1"; - country_set = true; - } - } - if (false == country_set) { - - res = pgsql_query("SELECT * FROM members_survey WHERE member_id =%lu AND LOWER(trim(answer))='singapore'", member_id); - if (res != NULL && pgsql_num_rows(res) > 0) { - out["country"] = "SG"; - out["country"].set_valid(true); - pgsql_query("UPDATE members SET country = '%s',updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); - out["country_found"] = "1"; - country_set = true; - } - } - - if (false == country_set) { - - res = pgsql_query("SELECT * FROM members_survey WHERE member_id =%lu AND LOWER(trim(answer))='san francisco'", member_id); - if (res != NULL && pgsql_num_rows(res) > 0) { - out["country"] = "US"; - out["country"].set_valid(true); - pgsql_query("UPDATE members SET country = '%s', city='San Francisco' ,updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); - out["country_found"] = "1"; - country_set = true; - } - } - - } else { - out["country_found"] = "1"; - } - - return 0;*/ - }, + detectMemberLocation(memberId) { + /* + clog::fileName = "savvy_location"; + logfmt(FLOG_MAX, "detectMemberLocation()"); + const PGresult *res; + const PGresult *res1; + bool country_set = false; + load_db_record(out, "SELECT trim(country) AS country FROM members WHERE id = %lu", member_id); // this should also get the city outright + out["country_found"] = "0"; + if (out["country"] == "") { // country is blank + out["country_found"] = "0"; + // now let us see if we can change this with GPS + if (gpsMemberGPSLocations(member_id, out) == PHP_API_OK) { + logfmt(FLOG_MAX, "detectMemberLocation() DETECT LOCATION == %s country", out["country"].c_str()); + logfmt(FLOG_MAX, "detectMemberLocation() DETECT LOCATION == %s state", out["state"].c_str()); + logfmt(FLOG_MAX, "detectMemberLocation() DETECT LOCATION == %s city", out["city"].c_str()); + pgsql_query("UPDATE members SET country = '%s', state='%s', city='%s',updated=now() WHERE id = %lu", out["country"].c_str(), out["state"].c_str(), out["city"].c_str(), member_id); + country_set = true; + out["country_found"] = "1"; + } + + //OR WITH BANK Imports + if (false == country_set) { + bool cf = false; + res = pgsql_query("SELECT count(id) AS cur_count,currency FROM members_bankimport WHERE member_id =%lu GROUP BY currency ORDER BY cur_count DESC LIMIT 1", member_id); + if (res != NULL && pgsql_num_rows(res) > 0) { + map f = pgsql_fetch_assoc(res, 0); + CVars rec; + map_to_cvars(f, rec); + logfmt(FLOG_MAX, "detectMemberLocation() BANK DETECT LOCATION == %s currency", rec["currency"].c_str()); + + if (rec["currency"] == "USD") { + out["country"] = "US"; + cf = true; + } else { + res1 = pgsql_query("SELECT code FROM country WHERE currency_code ='%s'", rec["currency"].c_str()); + if (res1 != NULL && pgsql_num_rows(res1) > 0) { + map f = pgsql_fetch_assoc(res1, 0); + CVars rec1; + map_to_cvars(f, rec1); + out["country"] = rec1["code"]; + cf = true; + } + } + + if (cf == true) // actual update if found + { + pgsql_query("UPDATE members SET country = '%s',updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); + out["country_found"] = "1"; + } + } else { + //out["session_valid"] = "INVALID_SESSION_CALL"; + } + + } // do only if country not set yet + + //OR WITH SURVEY ******************************************************************************************************* + + if (false == country_set) { + + res = pgsql_query("SELECT * FROM members_survey WHERE member_id =%lu AND LOWER(answer)='yes' AND card_id IN ( SELECT card_id FROM survey_card_country WHERE country ='SG' )", member_id); + if (res != NULL && pgsql_num_rows(res) > 0) { + out["country"] = "SG"; + out["country"].set_valid(true); + pgsql_query("UPDATE members SET country = '%s',updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); + out["country_found"] = "1"; + country_set = true; + } + } + if (false == country_set) { + + res = pgsql_query("SELECT * FROM members_survey WHERE member_id =%lu AND LOWER(trim(answer))='singapore'", member_id); + if (res != NULL && pgsql_num_rows(res) > 0) { + out["country"] = "SG"; + out["country"].set_valid(true); + pgsql_query("UPDATE members SET country = '%s',updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); + out["country_found"] = "1"; + country_set = true; + } + } + + if (false == country_set) { + + res = pgsql_query("SELECT * FROM members_survey WHERE member_id =%lu AND LOWER(trim(answer))='san francisco'", member_id); + if (res != NULL && pgsql_num_rows(res) > 0) { + out["country"] = "US"; + out["country"].set_valid(true); + pgsql_query("UPDATE members SET country = '%s', city='San Francisco' ,updated=now() WHERE id = %lu ", out["country"].c_str(), member_id); + out["country_found"] = "1"; + country_set = true; + } + } + + } else { + out["country_found"] = "1"; + } + + return 0;*/ + }, - async weeklyMemberSpending(member) { - var overSpending = 0; - var underSpending = 0; - var weeklyTotal = 0; - var populationAverage = 0; - var memberAverage = 0; - var userBudgetPercentBelow = 0; - var userBudgetPercentAbove = 0; - var userMoreLocalAveragePerm = 0; - var userLessLocalAveragePerm = 0; - var totalBank = 0; - var totalEmail = 0; - var totalWeeklySpend = 0; + async weeklyMemberSpending(member) { + var overSpending = 0; + var underSpending = 0; + var weeklyTotal = 0; + var populationAverage = 0; + var memberAverage = 0; + var userBudgetPercentBelow = 0; + var userBudgetPercentAbove = 0; + var userMoreLocalAveragePerm = 0; + var userLessLocalAveragePerm = 0; + var totalBank = 0; + var totalEmail = 0; + var totalWeeklySpend = 0; - //local average - var queryPopulation = `SELECT avg(amount) *0.01 AS population_average - FROM members_bankimport - WHERE category IN (SELECT category FROM activity_listcategory) AND currency='USD'`; - const avgPop = await sequelize.query(queryPopulation); - if (avgPop[0][0]) { - populationAverage = parseFloat(avgPop[0][0].population_average); - } + //local average + var queryPopulation = `SELECT avg(amount) *0.01 AS population_average + FROM members_bankimport + WHERE category IN (SELECT category FROM activity_listcategory) AND currency='USD'`; + const avgPop = await sequelize.query(queryPopulation); + if (avgPop[0][0]) { + populationAverage = parseFloat(avgPop[0][0].population_average); + } - var queryMemberAverage = `SELECT avg(amount) *0.01 AS member_average - FROM members_bankimport - WHERE category IN (SELECT category FROM activity_listcategory) AND member_id = :member_id AND currency='USD'`; - const memberAvg = await sequelize.query(queryMemberAverage, { - replacements: { member_id: member.id } - }); + var queryMemberAverage = `SELECT avg(amount) *0.01 AS member_average + FROM members_bankimport + WHERE category IN (SELECT category FROM activity_listcategory) AND member_id = :member_id AND currency='USD'`; + const memberAvg = await sequelize.query(queryMemberAverage, { + replacements: { member_id: member.id } + }); - if (memberAvg[0][0]) { - memberAverage = parseFloat(memberAvg[0][0].member_average); - } + if (memberAvg[0][0]) { + memberAverage = parseFloat(memberAvg[0][0].member_average); + } - if (memberAverage > 0 && memberAverage > populationAverage) { - userMoreLocalAveragePerm = memberAverage - populationAverage; - } + if (memberAverage > 0 && memberAverage > populationAverage) { + userMoreLocalAveragePerm = memberAverage - populationAverage; + } - if (memberAverage > 0 && memberAverage < populationAverage) { - userLessLocalAveragePerm = populationAverage - memberAverage; - } - //end local average - var totalWeeklyBudget = (member.min_budget + member.max_budget) / 200; + if (memberAverage > 0 && memberAverage < populationAverage) { + userLessLocalAveragePerm = populationAverage - memberAverage; + } + //end local average + var totalWeeklyBudget = (member.min_budget + member.max_budget) / 200; - var queryBankImport = `SELECT * FROM (SELECT round(0.01*sum(amount),2) AS total FROM members_bankimport - WHERE member_id= :member_id AND LOWER(category) IN (SELECT LOWER(category) FROM activity_listcategory) - AND date_trunc('day', time) > (current_date - 8) - AND date_trunc('day', time) < current_date) AS c WHERE c.total IS NOT NULL`; + var queryBankImport = `SELECT * FROM (SELECT round(0.01*sum(amount),2) AS total FROM members_bankimport + WHERE member_id= :member_id AND LOWER(category) IN (SELECT LOWER(category) FROM activity_listcategory) + AND date_trunc('day', time) > (current_date - 8) + AND date_trunc('day', time) < current_date) AS c WHERE c.total IS NOT NULL`; - const totalBankImport = await sequelize.query(queryBankImport, { - replacements: { member_id: member.id } - }); - if (totalBankImport[0][0]) { - totalBank = parseInt(totalBankImport[0][0].total); - } + const totalBankImport = await sequelize.query(queryBankImport, { + replacements: { member_id: member.id } + }); + if (totalBankImport[0][0]) { + totalBank = parseInt(totalBankImport[0][0].total); + } - var queryTotalEmail = `SELECT * FROM (SELECT round(sum(a.cost),2) AS total - FROM parsedemail_item a, trackedemail_item b WHERE b.id=a.trackedemail_item_id - AND b.member_id= :member_id AND a.dup_id IS NULL AND date_trunc('day', a.travel_date_end) > (current_date - 8) - AND date_trunc('day', a.travel_date_end) < current_date) AS c WHERE c.total IS NOT NULL`; + var queryTotalEmail = `SELECT * FROM (SELECT round(sum(a.cost),2) AS total + FROM parsedemail_item a, trackedemail_item b WHERE b.id=a.trackedemail_item_id + AND b.member_id= :member_id AND a.dup_id IS NULL AND date_trunc('day', a.travel_date_end) > (current_date - 8) + AND date_trunc('day', a.travel_date_end) < current_date) AS c WHERE c.total IS NOT NULL`; - const totalEmailCost = await sequelize.query(queryTotalEmail, { - replacements: { member_id: member.id } - }); - if (totalEmailCost[0][0]) { - totalEmail = parseInt(totalEmailCost[0][0].total); - } + const totalEmailCost = await sequelize.query(queryTotalEmail, { + replacements: { member_id: member.id } + }); + if (totalEmailCost[0][0]) { + totalEmail = parseInt(totalEmailCost[0][0].total); + } - totalWeeklySpend = totalBank + totalEmail; + totalWeeklySpend = totalBank + totalEmail; - if (totalWeeklySpend > totalWeeklyBudget && totalWeeklyBudget > 0) { - overSpending = totalWeeklySpend - totalWeeklyBudget; - userBudgetPercentAbove = overSpending / totalWeeklyBudget; - } + if (totalWeeklySpend > totalWeeklyBudget && totalWeeklyBudget > 0) { + overSpending = totalWeeklySpend - totalWeeklyBudget; + userBudgetPercentAbove = overSpending / totalWeeklyBudget; + } - if (totalWeeklyBudget > totalWeeklySpend && totalWeeklyBudget > 0) { - underSpending = totalWeeklyBudget - totalWeeklySpend; - userBudgetPercentBelow = underSpending / totalWeeklyBudget; - } + if (totalWeeklyBudget > totalWeeklySpend && totalWeeklyBudget > 0) { + underSpending = totalWeeklyBudget - totalWeeklySpend; + userBudgetPercentBelow = underSpending / totalWeeklyBudget; + } - weeklyTotal = totalWeeklySpend; + weeklyTotal = totalWeeklySpend; - return { - over_spending: overSpending, - under_spending: underSpending, - weekly_total: weeklyTotal, - user_budget_percentbelow: userBudgetPercentBelow, - user_budget_percentabove: userBudgetPercentAbove, - user_less_localavergperm: userLessLocalAveragePerm, - user_more_localavergperm: userMoreLocalAveragePerm, - population_average: populationAverage, - member_average: memberAverage - }; + return { + over_spending: overSpending, + under_spending: underSpending, + weekly_total: weeklyTotal, + user_budget_percentbelow: userBudgetPercentBelow, + user_budget_percentabove: userBudgetPercentAbove, + user_less_localavergperm: userLessLocalAveragePerm, + user_more_localavergperm: userMoreLocalAveragePerm, + population_average: populationAverage, + member_average: memberAverage + }; - }, + }, - async enableGPS(member) { - const totalTracking = await MembersBankAccount.count({ - where: { - member_id: member.id - } - }); - if (totalTracking > 0) { - return true; - } - return false; - }, + async enableGPS(member) { + const totalTracking = await MembersBankAccount.count({ + where: { + member_id: member.id + } + }); + if (totalTracking > 0) { + return true; + } + return false; + }, - async getSlideCard(req) { - const member = await this.getProfile(req); + async refreshMembersPersonalty(memberId) { + var result = { + status:"Error No Status Updated" + } - if (member.country == "") { - this.detectMemberLocation(member.id, outm); - if (outm.country_found == 1) { - member.country = outm.country; - } - } - const card_type = (req.query.card_type) ? req.query.card_type : memberCardService.DEFAULT_CARD_TYPE; - const card_count = (req.query.card_count) ? req.query.card_count : memberCardService.DEFAULT_CARD_COUNT; - const surveyCards = await memberCardService(this).getMemberSurveyCards(member.id); - //console.log(surveyCards); - //console.log("card_type:", card_type); - const cards = await memberCardService(this).getMemberCardsByType(member, parseInt(card_type), card_count); - return cards; - }, + const user = await Member.findOne({ + where: { id: memberId }, + attributes: [ + ['(count_acct + count_email)', 'data_count'], + ['id', 'member_id'], + ["DATE_PART('day', now()-added )", 'day_age'], + ["country", 'start_country'], + sequelize.col('*') + ] + }); + console.log(user.id); + return + if (user) { + var personality = await this.membersPersonalty(user) + if (personality.new_decision_group != user.decision_group) { + user.decision_group = personality.new_decision_group; + this.setMemberPersonaltyGroup(user); + result.status = "New Status Updated"; + } else { + Member + .update( + { + decision_updated: Date.now() + }, + { + returning: true, + where: { + id: memberId + } + } + ); + result.status = "Current Status Kept"; + } + } - async loadSavedCards(req) { - var memberId = req.user.id; - const cards = await memberCardService(this).getSavedCards(memberId); + return result; + }, - console.log('cards', cards) - return cards; - } + async membersPersonalty(user) { + var result = { + new_decision_group: user.decision_group + } + + return result + }, + + async setMemberPersonaltyGroup(user) { + /* long member_id = REQ_LONG(in, "member_id", 0, -1); + REQ_STRING(in, "decision_group", 4, 15, "(.*)"); + + // snprintf(query, sizeof (query), "UPDATE members SET decision_group = '%s',decision_updated = now() WHERE id = %lu AND decision_group <> '%s' ", in["decision_group"].c_str(), in["member_id"].Long(), in["decision_group"].c_str()); + + pgsql_query("UPDATE members SET decision_group = '%s',decision_updated = now() WHERE id = %lu ", in["decision_group"].c_str(), in["member_id"].Long()); + // logfmt(logINFO, "ENTER long setMemberPersonaltyGroup(CVars in, CVars &out)=%s", query); + + CVars x; + x["member_id"] = in["member_id"]; + x["member_id"].set_valid(true); + x["decision_group"] = in["decision_group"]; + x["decision_group"].set_valid(true); + out["decision_log_id"] = insert_db_record(DBS_VALID, "members_personalty_log", "members_personalty_log_id_seq", x); + + this.getMemberCardDescision(in, out); */ + + Member.update( + { + decision_group: user.decision_group, + decision_updated: Date.now() + }, + { + returning: true, + where: { + id: user.id + } + } + ); + MembersPersonaltyLog.create({ + member_id: user.id, + decision_group: user.decision_group + }) + }, + + async getMemberCardDescision(){ + + }, + + async getSlideCard(req) { + const member = await this.getProfile(req); + + if (member.country == "") { + this.detectMemberLocation(member.id, outm); + if (outm.country_found == 1) { + member.country = outm.country; + } + } + const card_type = (req.query.card_type) ? req.query.card_type : memberCardService.DEFAULT_CARD_TYPE; + const card_count = (req.query.card_count) ? req.query.card_count : memberCardService.DEFAULT_CARD_COUNT; + const surveyCards = await memberCardService(this).getMemberSurveyCards(member.id); + const cards = await memberCardService(this).getMemberCardsByType(member, parseInt(card_type), card_count); + return cards; + }, + + async loadSavedCards(req) { + var memberId = req.user.id; + const cards = await memberCardService(this).getSavedCards(memberId); + + console.log('cards', cards) + return cards; + }, + + async saveDashCard(req) { + var memberId = req.user.id; + var cardId = req.body.card_id; + return await memberCardService(this).saveDashCard(memberId, cardId); + }, + + async getDashCards(req) { + const card_count = (req.query.card_count) ? req.query.card_count : memberCardService.DEFAULT_CARD_COUNT; + const cards = await memberCardService(this).getDashCards(card_count); + return cards; + }, + + async subscribeCard(req) { + var memberId = req.user.id; + var cardId = req.body.card_id; + var dir = req.body.dir; + const cards = await memberCardService(this).subscribeCard(memberId, cardId, dir); + return cards; + } } \ No newline at end of file