@@ -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": [] | |||
} | |||
} | |||
] | |||
} |
@@ -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 = {}; |
@@ -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 = {}; |
@@ -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" | |||
} | |||
} | |||
} |
@@ -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 = {}; |
@@ -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) { | |||
@@ -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" | |||
} | |||
} | |||
} |
@@ -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); | |||
}, | |||
}; |
@@ -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; | |||
@@ -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, | |||
}; |
@@ -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", | |||
@@ -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, | |||
}; |