master #6
@ -159,6 +159,7 @@ struct CAWebChat {
|
|||||||
"backend_logic/when_api_getchatmemberlist.cpp",
|
"backend_logic/when_api_getchatmemberlist.cpp",
|
||||||
"backend_logic/when_api_getuserinfo.cpp",
|
"backend_logic/when_api_getuserinfo.cpp",
|
||||||
"backend_logic/when_api_getmessageinfo.cpp",
|
"backend_logic/when_api_getmessageinfo.cpp",
|
||||||
|
"backend_logic/when_api_getmessageneighbours.cpp",
|
||||||
};
|
};
|
||||||
for (std::string& u: T.units)
|
for (std::string& u: T.units)
|
||||||
u = "web_chat/iu9_ca_web_chat_lib/" + u;
|
u = "web_chat/iu9_ca_web_chat_lib/" + u;
|
||||||
|
@ -111,7 +111,7 @@ namespace een9 {
|
|||||||
status = -1;
|
status = -1;
|
||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
res.body.reserve(body_size);
|
res.body.reserve(std::min(100000ul, body_size));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!res.has_body) {
|
if (!res.has_body) {
|
||||||
|
@ -43,7 +43,7 @@ namespace een9 {
|
|||||||
pos++;
|
pos++;
|
||||||
return hv.substr(S, pos - S);
|
return hv.substr(S, pos - S);
|
||||||
};
|
};
|
||||||
auto read_to_space_or_dq_or_semc = [&]() -> std::string {
|
auto read_to_space_or_semc = [&]() -> std::string {
|
||||||
size_t S = pos;
|
size_t S = pos;
|
||||||
while (hv.size() > pos && !isSPACE(hv[pos]) && hv[pos] != '"' && hv[pos] != ';')
|
while (hv.size() > pos && !isSPACE(hv[pos]) && hv[pos] != '"' && hv[pos] != ';')
|
||||||
pos++;
|
pos++;
|
||||||
@ -68,16 +68,7 @@ namespace een9 {
|
|||||||
THROW("Incorrect Cookie header line, missing =");
|
THROW("Incorrect Cookie header line, missing =");
|
||||||
pos++;
|
pos++;
|
||||||
skip_ows();
|
skip_ows();
|
||||||
std::string value_of_pechenye;
|
std::string value_of_pechenye = read_to_space_or_semc();
|
||||||
if (isThis('"')) {
|
|
||||||
pos++;
|
|
||||||
value_of_pechenye = read_to_space_or_dq_or_semc();
|
|
||||||
if (!isThis('"'))
|
|
||||||
THROW("Incorrect Cookie header line, missing \"");
|
|
||||||
pos++;
|
|
||||||
} else {
|
|
||||||
value_of_pechenye = read_to_space_or_dq_or_semc();
|
|
||||||
}
|
|
||||||
// ASSERT(isCookieValue(value_of_pechenye), "Incorrect Cookie value");
|
// ASSERT(isCookieValue(value_of_pechenye), "Incorrect Cookie value");
|
||||||
result.emplace_back(name_of_pechenye, value_of_pechenye);
|
result.emplace_back(name_of_pechenye, value_of_pechenye);
|
||||||
skip_ows();
|
skip_ows();
|
||||||
|
@ -80,12 +80,32 @@ namespace iu9cawebchat {
|
|||||||
int status = sqlite_stmt_step(req, {{0, &previousId}, {1, &senderUserId}, {2, &exists}, {3, &isSystem}},
|
int status = sqlite_stmt_step(req, {{0, &previousId}, {1, &senderUserId}, {2, &exists}, {3, &isSystem}},
|
||||||
{{4, &msg_text}});
|
{{4, &msg_text}});
|
||||||
if (status == SQLITE_ROW) {
|
if (status == SQLITE_ROW) {
|
||||||
|
if (!(bool)exists.value)
|
||||||
|
een9_THROW("Message existed, but now it isn't");
|
||||||
return {(bool)isSystem.value, msg_text.value, senderUserId.exist ? senderUserId.value : -1,
|
return {(bool)isSystem.value, msg_text.value, senderUserId.exist ? senderUserId.value : -1,
|
||||||
previousId.exist ? previousId.value : -1};
|
previousId.exist ? previousId.value : -1};
|
||||||
}
|
}
|
||||||
een9_THROW("No such message");
|
een9_THROW("No such message");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::pair<int64_t, RowMessage_Content> lookup_message_content_rev_side(SqliteConnection& conn, int64_t chatId, int64_t prevMsgId) {
|
||||||
|
een9_ASSERT(prevMsgId >= 0, "V durku dobro pozhalovat");
|
||||||
|
SqliteStatement req(conn,
|
||||||
|
"SELECT `id`, `senderUserId`, `exists`, `isSystem`, `text` FROM `message` WHERE "
|
||||||
|
"`chatId` = ?1 AND `previous` = ?2", {{1, chatId}, {2, prevMsgId}}, {});
|
||||||
|
fsql_integer_or_null id, senderUserId, exists, isSystem;
|
||||||
|
fsql_text8_or_null msg_text;
|
||||||
|
int status = sqlite_stmt_step(req, {{0, &id}, {1, &senderUserId}, {2, &exists}, {3, &isSystem}},
|
||||||
|
{{4, &msg_text}});
|
||||||
|
if (status == SQLITE_ROW) {
|
||||||
|
een9_ASSERT_pl(exists.value == 1);
|
||||||
|
return {id.value,
|
||||||
|
{(bool)isSystem.value, msg_text.value, senderUserId.exist ? senderUserId.value : -1, prevMsgId}};
|
||||||
|
}
|
||||||
|
return {-1, {}};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int64_t get_role_of_user_in_chat(SqliteConnection& conn, int64_t userId, int64_t chatId) {
|
int64_t get_role_of_user_in_chat(SqliteConnection& conn, int64_t userId, int64_t chatId) {
|
||||||
SqliteStatement req(conn,
|
SqliteStatement req(conn,
|
||||||
"SELECT `role` FROM `user_chat_membership` WHERE `userId` = ?1 AND `chatId` = ?2",
|
"SELECT `role` FROM `user_chat_membership` WHERE `userId` = ?1 AND `chatId` = ?2",
|
||||||
|
@ -41,6 +41,9 @@ namespace iu9cawebchat {
|
|||||||
|
|
||||||
RowMessage_Content lookup_message_content(SqliteConnection& conn, int64_t chatId, int64_t msgId);
|
RowMessage_Content lookup_message_content(SqliteConnection& conn, int64_t chatId, int64_t msgId);
|
||||||
|
|
||||||
|
/* If prevMsgId is id of the last message in chat, and there is no message ahead of it, .first = -1 */
|
||||||
|
std::pair<int64_t, RowMessage_Content> lookup_message_content_rev_side(SqliteConnection& conn, int64_t chatId, int64_t prevMsgId);
|
||||||
|
|
||||||
int64_t get_role_of_user_in_chat(SqliteConnection& conn, int64_t userId, int64_t chatId);
|
int64_t get_role_of_user_in_chat(SqliteConnection& conn, int64_t userId, int64_t chatId);
|
||||||
|
|
||||||
/* ============================= API ====================================*/
|
/* ============================= API ====================================*/
|
||||||
@ -50,6 +53,7 @@ namespace iu9cawebchat {
|
|||||||
json::JSON internalapi_getChatMemberList(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);
|
json::JSON internalapi_getChatMemberList(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);
|
||||||
json::JSON internalapi_getUserInfo(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);
|
json::JSON internalapi_getUserInfo(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);
|
||||||
json::JSON internalapi_getMessageInfo(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);
|
json::JSON internalapi_getMessageInfo(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);
|
||||||
|
json::JSON internalapi_getMessageNeighbours(SqliteConnection& conn, int64_t uid, const json::JSON& Sent);
|
||||||
// todo: complete the list
|
// todo: complete the list
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,7 +2,6 @@
|
|||||||
#include <engine_engine_number_9/baza_throw.h>
|
#include <engine_engine_number_9/baza_throw.h>
|
||||||
|
|
||||||
namespace iu9cawebchat {
|
namespace iu9cawebchat {
|
||||||
/* This is literally the most dumb and useless query */
|
|
||||||
json::JSON internalapi_getMessageInfo(SqliteConnection& conn, int64_t uid, const json::JSON& Sent) {
|
json::JSON internalapi_getMessageInfo(SqliteConnection& conn, int64_t uid, const json::JSON& Sent) {
|
||||||
int64_t chatId = Sent["chatId"].g().asInteger().get_int();
|
int64_t chatId = Sent["chatId"].g().asInteger().get_int();
|
||||||
int64_t msgId = Sent["id"].g().asInteger().get_int();
|
int64_t msgId = Sent["id"].g().asInteger().get_int();
|
||||||
|
@ -0,0 +1,52 @@
|
|||||||
|
#include "server_data_interact.h"
|
||||||
|
#include <engine_engine_number_9/baza_throw.h>
|
||||||
|
|
||||||
|
namespace iu9cawebchat {
|
||||||
|
/* This is literally the most dumb and useless query */
|
||||||
|
json::JSON internalapi_getMessageNeighbours(SqliteConnection& conn, int64_t uid, const json::JSON& Sent) {
|
||||||
|
int64_t chatId = Sent["chatId"].g().asInteger().get_int();
|
||||||
|
if (get_role_of_user_in_chat(conn, uid, chatId) == user_chat_role_deleted)
|
||||||
|
een9_THROW("Authentication failure");
|
||||||
|
bool dir_forward = Sent["direction"].g().asString() == "forward";
|
||||||
|
int64_t amount = Sent["amount"].g().asInteger().get_int();
|
||||||
|
if (amount < 0)
|
||||||
|
een9_THROW("Incorrect amount");
|
||||||
|
json::JSON Recv;
|
||||||
|
Recv["status"] = json::JSON(0l);
|
||||||
|
Recv["messages"] = json::JSON(json::array);
|
||||||
|
std::vector<json::JSON>& messages = Recv["messages"].g().asArray();
|
||||||
|
if (dir_forward) {
|
||||||
|
int64_t curMsg = Sent["id"].g().asInteger().get_int();
|
||||||
|
if (curMsg < 0)
|
||||||
|
een9_THROW("forward message lookup from the beginning of chat is not supported yet");
|
||||||
|
while (true) {
|
||||||
|
/* At this point, curMsg is non-negative */
|
||||||
|
std::pair<int64_t, RowMessage_Content> nxt = lookup_message_content_rev_side(conn, chatId, curMsg);
|
||||||
|
if (nxt.first < 0)
|
||||||
|
break;
|
||||||
|
messages.emplace_back();
|
||||||
|
json::JSON& message = messages.back();
|
||||||
|
message["id"] = json::JSON(nxt.first);
|
||||||
|
message["previous"] = json::JSON(curMsg);
|
||||||
|
message["content"]["text"] = json::JSON(nxt.second.text);
|
||||||
|
message["content"]["isSystem"] = json::JSON(nxt.second.isSystem);
|
||||||
|
message["content"]["sender"] = json::JSON(nxt.second.senderUserId);
|
||||||
|
curMsg = nxt.first;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
int64_t curMsg = Sent["previousMsgId"].g().asInteger().get_int();
|
||||||
|
while (curMsg >= 0) {
|
||||||
|
RowMessage_Content curRow = lookup_message_content(conn, chatId, curMsg);
|
||||||
|
messages.emplace_back();
|
||||||
|
json::JSON& message = messages.back();
|
||||||
|
message["id"] = json::JSON(curMsg);
|
||||||
|
message["previous"] = json::JSON(curRow.previous);
|
||||||
|
message["content"]["text"] = json::JSON(curRow.text);
|
||||||
|
message["content"]["isSystem"] = json::JSON(curRow.isSystem);
|
||||||
|
message["content"]["sender"] = json::JSON(curRow.senderUserId);
|
||||||
|
curMsg = curRow.previous;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return Recv;
|
||||||
|
}
|
||||||
|
}
|
@ -96,6 +96,9 @@ namespace iu9cawebchat {
|
|||||||
if (req.uri_path == "/internalapi/getMessageInfo") {
|
if (req.uri_path == "/internalapi/getMessageInfo") {
|
||||||
return when_internalapi_getmessageinfo(wgd, req, logged_in_user);
|
return when_internalapi_getmessageinfo(wgd, req, logged_in_user);
|
||||||
}
|
}
|
||||||
|
// if (req.uri_path == "/internalapi/getMessageNeighbours") {
|
||||||
|
// return when
|
||||||
|
// }
|
||||||
// todo: write all the other interfaces
|
// todo: write all the other interfaces
|
||||||
} catch (const std::exception& e) {
|
} catch (const std::exception& e) {
|
||||||
guard_.rollback = true;
|
guard_.rollback = true;
|
||||||
|
Loading…
Reference in New Issue
Block a user