M products/PurePhone/services/desktop/endpoints/include/endpoints/messages/MessageHelper.hpp => products/PurePhone/services/desktop/endpoints/include/endpoints/messages/MessageHelper.hpp +1 -0
@@ 36,6 36,7 @@ namespace sdesktop::endpoints
auto requestSMS(Context &context) -> sys::ReturnCodes;
auto createSMS(Context &context) -> sys::ReturnCodes;
+ auto updateSMS(Context &context) -> sys::ReturnCodes;
auto deleteSMS(Context &context) -> sys::ReturnCodes;
auto requestTemplate(Context &context) -> sys::ReturnCodes;
M products/PurePhone/services/desktop/endpoints/messages/MessageHelper.cpp => products/PurePhone/services/desktop/endpoints/messages/MessageHelper.cpp +56 -8
@@ 15,26 15,25 @@
#include <ThreadRecord.hpp>
#include <queries/messages/sms/QuerySMSGet.hpp>
#include <queries/messages/sms/QuerySMSGetByID.hpp>
+#include <queries/messages/sms/QuerySMSGetByText.hpp>
#include <queries/messages/sms/QuerySMSGetByThreadID.hpp>
#include <queries/messages/sms/QuerySMSGetCount.hpp>
#include <queries/messages/sms/QuerySMSRemove.hpp>
+#include <queries/messages/sms/QuerySMSUpdate.hpp>
#include <queries/messages/templates/QuerySMSTemplateAdd.hpp>
#include <queries/messages/templates/QuerySMSTemplateGet.hpp>
#include <queries/messages/templates/QuerySMSTemplateGetByID.hpp>
#include <queries/messages/templates/QuerySMSTemplateGetCount.hpp>
#include <queries/messages/templates/QuerySMSTemplateRemove.hpp>
#include <queries/messages/templates/QuerySMSTemplateUpdate.hpp>
+#include <queries/messages/threads/QueryThreadGetByID.hpp>
#include <queries/messages/threads/QueryThreadsGetForList.hpp>
+#include <queries/messages/threads/QueryThreadRemove.hpp>
#include <queries/messages/threads/QueryThreadMarkAsRead.hpp>
#include <service-cellular/service-cellular/MessageConstants.hpp>
#include <service-db/DBServiceAPI.hpp>
#include <utf8/UTF8.hpp>
-#include <memory>
-#include <utility>
-#include <module-db/queries/messages/sms/QuerySMSGetByText.hpp>
-#include "queries/messages/threads/QueryThreadGetByID.hpp"
-#include "queries/messages/threads/QueryThreadRemove.hpp"
namespace sdesktop::endpoints
{
@@ 128,7 127,10 @@ namespace sdesktop::endpoints
auto MessageHelper::updateDBEntry(Context &context) -> sys::ReturnCodes
{
- if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) {
+ if (context.getBody()[json::messages::category].string_value() == json::messages::categoryMessage) {
+ return updateSMS(context);
+ }
+ else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) {
return updateTemplate(context);
}
else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryThread) {
@@ 181,6 183,7 @@ namespace sdesktop::endpoints
{
const auto smsNumber = context.getBody()[json::messages::number].string_value();
const auto smsBody = context.getBody()[json::messages::messageBody].string_value();
+ const auto smsType = context.getBody()[json::messages::messageType].int_value();
if (smsBody.size() > msgConstants::maxConcatenatedLen) {
context.setResponseStatus(http::Code::BadRequest);
@@ 191,8 194,9 @@ namespace sdesktop::endpoints
SMSRecord smsRecord;
smsRecord.number = utils::PhoneNumber(smsNumber).getView();
smsRecord.body = smsBody;
- smsRecord.type = SMSType::QUEUED;
- smsRecord.date = std::time(nullptr);
+ smsRecord.type =
+ smsType == static_cast<std::underlying_type_t<SMSType>>(SMSType::DRAFT) ? SMSType::DRAFT : SMSType::QUEUED;
+ smsRecord.date = std::time(nullptr);
auto listener = std::make_unique<db::EndpointListener>(
[=](db::QueryResult *result, Context &context) {
@@ 214,6 218,50 @@ namespace sdesktop::endpoints
return sys::ReturnCodes::Success;
}
+ auto MessageHelper::updateSMS(Context &context) -> sys::ReturnCodes
+ {
+ const auto smsBody = context.getBody()[json::messages::messageBody].string_value();
+ const auto smsId = context.getBody()[json::messages::messageID].int_value();
+ const auto smsType = context.getBody()[json::messages::messageType].int_value();
+
+ if (smsBody.size() > msgConstants::maxConcatenatedLen) {
+ context.setResponseStatus(http::Code::BadRequest);
+ putToSendQueue(context.createSimpleResponse());
+ return sys::ReturnCodes::Success;
+ }
+ if (smsId == 0 || smsType != static_cast<std::underlying_type_t<SMSType>>(SMSType::DRAFT)) {
+ context.setResponseStatus(http::Code::BadRequest);
+ putToSendQueue(context.createSimpleResponse());
+ return sys::ReturnCodes::Success;
+ }
+
+ SMSRecord smsRecord;
+ smsRecord.ID = smsId;
+ smsRecord.body = smsBody;
+ smsRecord.type = SMSType::DRAFT;
+ smsRecord.date = std::time(nullptr);
+
+ auto query = std::make_unique<db::query::SMSUpdate>(smsRecord);
+ auto listener = std::make_unique<db::EndpointListener>(
+ [=](db::QueryResult *result, Context &context) {
+ const auto smsUpdateResult = dynamic_cast<db::query::SMSUpdateResult *>(result);
+ if (!smsUpdateResult) {
+ LOG_ERROR("Received invalid SMS update result");
+ return false;
+ }
+
+ context.setResponseStatus(http::Code::OK);
+ putToSendQueue(context.createSimpleResponse());
+ return true;
+ },
+ context);
+
+ query->setQueryListener(std::move(listener));
+ DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));
+
+ return sys::ReturnCodes::Success;
+ }
+
auto MessageHelper::deleteSMS(Context &context) -> sys::ReturnCodes
{
if (!context.getBody()[json::messages::messageID].is_number()) {
M test/harness => test/harness +1 -1
@@ 1,1 1,1 @@
-Subproject commit 9bd08cb65043952885f006d2c2dbcd5be63f50b8
+Subproject commit 755a7f13473cd3094838dffbdccf50f93ea5e986
M test/pytest/service-desktop/test_messages.py => test/pytest/service-desktop/test_messages.py +54 -1
@@ 3,7 3,7 @@
import pytest
from harness.request import TransactionError
from harness.api.messages import GetMessagesCount, GetMessagesWithOffsetAndLimit, GetMessageById, \
- GetMessagesByThreadIdWithOffsetAndLimit, AddMessage, DeleteMessageById
+ GetMessagesByThreadIdWithOffsetAndLimit, AddMessage, AddDraftMessage, UpdateDraftMessage, DeleteMessageById
class MessagesTester:
@@ 50,6 50,22 @@ class MessagesTester:
else:
return True, message
+ def add_draft_message(self, message_number, message_body):
+ try:
+ message = AddDraftMessage(message_number, message_body).run(self.harness).message
+ except TransactionError:
+ return False
+ else:
+ return True, message
+
+ def update_draft_message(self, message_body, message_id, thread_id):
+ try:
+ UpdateDraftMessage(message_body, message_id, thread_id).run(self.harness)
+ except TransactionError:
+ return False
+ else:
+ return True
+
def delete_message_by_id(self, message_record_id):
try:
DeleteMessageById(message_record_id).run(self.harness)
@@ 265,3 281,40 @@ def test_pagination(harness):
result, received_messages_records_count = messages_tester.get_messages_count()
assert result, "Failed to get messages count!"
assert received_messages_records_count == initial_number_of_messages_records, "Wrong number of messages!"
+
+
+@pytest.mark.service_desktop_test
+@pytest.mark.usefixtures("phone_unlocked")
+def test_draft_message(harness):
+ messages_tester = MessagesTester(harness)
+ result, received_messages_records_count = messages_tester.get_messages_count()
+ assert result, "Failed to get messages count!"
+ initial_number_of_messages_records = received_messages_records_count
+
+ message_number = "123456789"
+ draft_message_body = "This is a draft message"
+
+ result, message_record = messages_tester.add_draft_message(message_number, draft_message_body)
+ assert result, "Failed to add a draft message!"
+ assert message_record["messageBody"] == draft_message_body, "Draft message body corrupted!"
+ assert message_record["messageType"] == 1, "Wrong message type!"
+
+ result, received_messages_records_count = messages_tester.get_messages_count()
+ assert result, "Failed to get messages count!"
+ assert received_messages_records_count == initial_number_of_messages_records + 1, "Wrong number of messages!"
+
+ draft_message_new_body = "This is a changed draft message"
+
+ result = messages_tester.update_draft_message(draft_message_new_body, message_record["messageID"], message_record["threadID"])
+ assert result, "Failed to update draft message!"
+
+ result, received_message_record = messages_tester.get_message_by_id(message_record["messageID"])
+ assert result, "Failed to get a message by id!"
+ assert received_message_record["messageID"] == message_record["messageID"], "Wrong message id!"
+ assert received_message_record["messageBody"] == draft_message_new_body, "Wrong draft message body!"
+
+ assert messages_tester.delete_message_by_id(message_record["messageID"]), "Failed to delete a draft message!"
+
+ result, received_messages_records_count = messages_tester.get_messages_count()
+ assert result, "Failed to get messages count!"
+ assert received_messages_records_count == initial_number_of_messages_records, "Wrong number of messages!"