~aleteoryx/muditaos

e72ca95535e4e15930f6872c37501f201dfff7dc — Pawel Olejniczak 3 years ago 9aa17a2
[CP-1116] Add API to create and update draft message

This change allows to create and update draft SMS
with use of service-desktop API.
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!"