From d300e49eccb9008af1903d894e9d04e366553ec2 Mon Sep 17 00:00:00 2001 From: jefry Date: Tue, 13 Apr 2021 16:52:33 +0700 Subject: [PATCH] fetch chat and messages --- api/chats/config/routes.json | 52 +++++++++++++++++ api/chats/controllers/chats.js | 8 +++ api/chats/models/chats.js | 8 +++ api/chats/models/chats.settings.json | 33 +++++++++++ api/chats/services/chats.js | 8 +++ api/message/controllers/message.js | 1 + api/message/models/message.settings.json | 26 ++++++--- api/session-data/services/session-data.js | 8 +++ config/functions/cron.js | 96 +++++++++++++++---------------- model/messageModel.js | 17 +++--- package.json | 1 + util/util.js | 89 ++++++++++++++++++++++++++++ 12 files changed, 283 insertions(+), 64 deletions(-) create mode 100644 api/chats/config/routes.json create mode 100644 api/chats/controllers/chats.js create mode 100644 api/chats/models/chats.js create mode 100644 api/chats/models/chats.settings.json create mode 100644 api/chats/services/chats.js create mode 100644 util/util.js diff --git a/api/chats/config/routes.json b/api/chats/config/routes.json new file mode 100644 index 0000000..adca344 --- /dev/null +++ b/api/chats/config/routes.json @@ -0,0 +1,52 @@ +{ + "routes": [ + { + "method": "GET", + "path": "/chats", + "handler": "chats.find", + "config": { + "policies": [] + } + }, + { + "method": "GET", + "path": "/chats/count", + "handler": "chats.count", + "config": { + "policies": [] + } + }, + { + "method": "GET", + "path": "/chats/:id", + "handler": "chats.findOne", + "config": { + "policies": [] + } + }, + { + "method": "POST", + "path": "/chats", + "handler": "chats.create", + "config": { + "policies": [] + } + }, + { + "method": "PUT", + "path": "/chats/:id", + "handler": "chats.update", + "config": { + "policies": [] + } + }, + { + "method": "DELETE", + "path": "/chats/:id", + "handler": "chats.delete", + "config": { + "policies": [] + } + } + ] +} diff --git a/api/chats/controllers/chats.js b/api/chats/controllers/chats.js new file mode 100644 index 0000000..556f4fc --- /dev/null +++ b/api/chats/controllers/chats.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/controllers.html#core-controllers) + * to customize this controller + */ + +module.exports = {}; diff --git a/api/chats/models/chats.js b/api/chats/models/chats.js new file mode 100644 index 0000000..dd847ef --- /dev/null +++ b/api/chats/models/chats.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/models.html#lifecycle-hooks) + * to customize this model + */ + +module.exports = {}; diff --git a/api/chats/models/chats.settings.json b/api/chats/models/chats.settings.json new file mode 100644 index 0000000..b33ea01 --- /dev/null +++ b/api/chats/models/chats.settings.json @@ -0,0 +1,33 @@ +{ + "kind": "collectionType", + "collectionName": "chats", + "info": { + "name": "Chats", + "description": "" + }, + "options": { + "increments": true, + "timestamps": true, + "draftAndPublish": true + }, + "attributes": { + "session_key": { + "model": "session-data" + }, + "name": { + "type": "string" + }, + "unreadCount": { + "type": "integer" + }, + "chatId": { + "type": "json" + }, + "phoneNumber": { + "type": "string" + }, + "timestamp": { + "type": "datetime" + } + } +} diff --git a/api/chats/services/chats.js b/api/chats/services/chats.js new file mode 100644 index 0000000..6bc4168 --- /dev/null +++ b/api/chats/services/chats.js @@ -0,0 +1,8 @@ +'use strict'; + +/** + * Read the documentation (https://strapi.io/documentation/developer-docs/latest/concepts/services.html#core-services) + * to customize this service + */ + +module.exports = {}; diff --git a/api/message/controllers/message.js b/api/message/controllers/message.js index ba2cbd9..23148ad 100644 --- a/api/message/controllers/message.js +++ b/api/message/controllers/message.js @@ -28,6 +28,7 @@ module.exports = { }); if (data["TYPE"] == "READY") { result = await messageModel.getAllChats(); + console.log(JSON.stringify(result["DATA"])); } ctx.body = result; } catch (e) { diff --git a/api/message/models/message.settings.json b/api/message/models/message.settings.json index 4a98ee0..f061b7c 100644 --- a/api/message/models/message.settings.json +++ b/api/message/models/message.settings.json @@ -11,7 +11,7 @@ "draftAndPublish": true }, "attributes": { - "send_to": { + "to": { "type": "string", "regex": "\\+?([ -]?\\d+)+|\\(\\d+\\)([ -]\\d+)", "required": true @@ -27,21 +27,31 @@ "plugin": "upload", "required": false }, - "template_key": { - "model": "message-template" - }, "state": { "type": "string", "private": false }, - "raw_text": { + "body": { "type": "string" }, - "session_datum_key": { - "model": "session-data" - }, "keterangan": { "type": "string" + }, + "isForwarded": { + "type": "boolean", + "default": false + }, + "chat_key": { + "model": "chats" + }, + "from": { + "type": "string" + }, + "messageId": { + "type": "string" + }, + "timestamp": { + "type": "datetime" } } } diff --git a/api/session-data/services/session-data.js b/api/session-data/services/session-data.js index fea7208..5a82a30 100644 --- a/api/session-data/services/session-data.js +++ b/api/session-data/services/session-data.js @@ -14,4 +14,12 @@ module.exports = { }); return arrKeys; }, + sessionCheck: async (sessionId) => { + const sessions = await strapi.api["session-data"].services[ + "session-data" + ].getId({ + _sort: "phonenumber:desc", + }); + return sessions.includes(sessionId); + }, }; diff --git a/config/functions/cron.js b/config/functions/cron.js index 17a36ae..e20fc54 100644 --- a/config/functions/cron.js +++ b/config/functions/cron.js @@ -1,5 +1,6 @@ "use strict"; const messageModel = require("../../model/messageModel"); +const utils = require("../../util/util"); const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); /** * Cron config that gives you an opportunity @@ -71,57 +72,56 @@ module.exports = { if (Object.keys(clients).length == 0) taskSendingMessage = false; else { for (const i of Object.keys(clients)) { - const sessions = await strapi.api["session-data"].services[ + var sessionsValid = await strapi.api[ "session-data" - ].getId({ - _sort: "phonenumber:desc", - }); - if (!sessions.includes(parseInt(i))) { + ].services["session-data"].sessionCheck(parseInt(i)); + if (!sessionsValid) { delete clients[parseInt(i)]; } else { - const messages = await strapi.api.message.services.message.find( - { - _sort: "session_datum_key:desc", - state: "QUEUE", - session_datum_key: i, - } - ); - for (const message of messages) { - // console.log(clients[i] != null, i, clients); - try { - if (clients[i] != null) { - await strapi.api.message.services.message.update( - { id: message.id }, - { state: "SENDING" } - ); - let send = await messageModel.sendMessage( - clients[i], - message["send_to"], - message["raw_text"] - ); - // console.log(send); - if (send["STATUS"] == 1) { - await strapi.api.message.services.message.update( - { id: message.id }, - { state: "SENT" } - ); - } else { - await strapi.api.message.services.message.update( - { id: message.id }, - { - state: "ERROR", - keterangan: send["DATA"], - } - ); - } - } - } catch (e) { - await strapi.api.message.services.message.update( - { id: message.id }, - { state: "ERROR", keterangan: e.message } - ); - } - } + // const messages = await strapi.api.message.services.message.find( + // { + // _sort: "session_datum_key:desc", + // state: "QUEUE", + // session_datum_key: i, + // } + // ); + // for (const message of messages) { + // // console.log(clients[i] != null, i, clients); + // try { + // if (clients[i] != null) { + // await strapi.api.message.services.message.update( + // { id: message.id }, + // { state: "SENDING" } + // ); + // let send = await messageModel.sendMessage( + // clients[i], + // message["send_to"], + // message["raw_text"] + // ); + // // console.log(send); + // if (send["STATUS"] == 1) { + // await strapi.api.message.services.message.update( + // { id: message.id }, + // { state: "SENT" } + // ); + // } else { + // await strapi.api.message.services.message.update( + // { id: message.id }, + // { + // state: "ERROR", + // keterangan: send["DATA"], + // } + // ); + // } + // } + // } catch (e) { + // await strapi.api.message.services.message.update( + // { id: message.id }, + // { state: "ERROR", keterangan: e.message } + // ); + // } + // } + await utils.refreshChat(clients[i], parseInt(i)); } } taskSendingMessage = false; diff --git a/model/messageModel.js b/model/messageModel.js index 8b92f78..74d2ce0 100644 --- a/model/messageModel.js +++ b/model/messageModel.js @@ -159,23 +159,24 @@ var sendMessage = async function (client, phone_number, textMessage) { } }; -var getChatbyPhoneNumber = async function (phone_number) { +var getMessagebyId = async function (client, chatId, param = {}) { try { if (!client.info) { throw { message: "Client Is Not Ready !" }; } - let phoneNumber = reformatMobilePhone(phone_number); - let chats = await client.getChatById(phoneNumber); - let messageList = await chats.fetchMessages(); + var chat = await client.getChatById(chatId._serialized); + var messageList = await chat.fetchMessages(param); + // console.log(messageList); return { STATUS: 1, DATA: messageList }; } catch (e) { + // console.log(e); return { STATUS: 0, DATA: e.message }; } }; -var getAllChats = async function () { +var getAllChats = async function (client) { try { - if (!client.info) { + if (!client || !client.info) { throw { message: "Client Is Not Ready !" }; } let chatList = await client.getChats(); @@ -255,7 +256,7 @@ module.exports = { destroySession: destroySession, getClientState: getClientState, getClientState: getClientState, - getChatbyPhoneNumber: getChatbyPhoneNumber, - asyncLoadClient: asyncLoadClient, + getMessagebyId: getMessagebyId, getAllChats: getAllChats, + asyncLoadClient: asyncLoadClient, }; diff --git a/package.json b/package.json index c30a502..658431f 100644 --- a/package.json +++ b/package.json @@ -12,6 +12,7 @@ "devDependencies": {}, "dependencies": { "knex": "<0.20.0", + "moment": "^2.29.1", "mysql": "latest", "qrcode-terminal": "^0.12.0", "strapi": "3.4.1", diff --git a/util/util.js b/util/util.js new file mode 100644 index 0000000..826e235 --- /dev/null +++ b/util/util.js @@ -0,0 +1,89 @@ +"use strict"; +const messageModel = require("../model/messageModel"); +const { parseMultipartData, sanitizeEntity } = require("strapi-utils"); +const moment = require("moment"); + +const refreshChat = async function (client, sessionsId) { + try { + if (client && sessionsId) { + var chatId; + var result = await messageModel.getAllChats(client); + if (result["STATUS"] == 1) { + for (var i = 0; i < result["DATA"].length; i++) { + var chatsExist = await strapi.api["chats"].services[ + "chats" + ].findOne({ + session_key: sessionsId, + phoneNumber: result["DATA"][i]["id"].user, + }); + if (!chatsExist) { + await strapi.query("chats").create({ + session_key: sessionsId, + name: result["DATA"][i]["name"], + unreadCount: result["DATA"][i]["unreadCount"], + timestamp: moment + .unix(result["DATA"][i]["timestamp"]) + .toDate(), + chatId: result["DATA"][i]["id"], + phoneNumber: result["DATA"][i]["id"].user, + }); + chatsExist = await strapi.api["chats"].services[ + "chats" + ].findOne({ + session_key: sessionsId, + phoneNumber: result["DATA"][i]["id"].user, + }); + } + chatId = chatsExist.id; + var messages = await messageModel.getMessagebyId( + client, + result["DATA"][i]["id"] + ); + if (messages["STATUS"] == 1) { + for (var j = 0; j < messages["DATA"].length; j++) { + var Exist = await strapi.api["message"].services[ + "message" + ].findOne({ + messageId: messages["DATA"][j]["id"].id, + }); + if (!Exist) { + // console.log(chatId); + await strapi.query("message").create({ + messageId: messages["DATA"][j]["id"].id, + to: messages["DATA"][j]["to"], + from: messages["DATA"][j]["from"], + body: messages["DATA"][j]["body"], + state: messages["DATA"][j]["fromMe"] + ? "SENT" + : "RECIEVED", + isForwarded: + messages["DATA"][j]["isForwarded"] == + undefined + ? false + : messages["DATA"][j][ + "isForwarded" + ], + chat_key: chatId, + timestamp: moment + .unix(messages["DATA"][j]["timestamp"]) + .toDate(), + }); + } + } + } + } + } else { + throw { message: result["DATA"] }; + } + } + + // console.log("done populating chats"); + } catch (e) { + console.log("error", e.message || e); + // return { STATUS: 0, DATA: e.message || e }; + } +}; + +module.exports = { + refreshChat: refreshChat, +};