~aleteoryx/muditaos

91e29f1cacf03a1448efbc72145a396c16df873d — Bartek Cichocki 5 years ago 767c1f2
[EGD-3486] Implementation of SMS handling in service-desktop

added message removal method

added message marking as read/unread

added message thread to_json() method, fixed unit test

added template processing except search

added SMS gathering by contactID

added getByText sms query

added template search query
M .vscode/settings.json => .vscode/settings.json +21 -1
@@ 55,6 55,26 @@
        "sstream": "cpp",
        "stdexcept": "cpp",
        "streambuf": "cpp",
        "typeinfo": "cpp"
        "typeinfo": "cpp",
        "bitset": "cpp",
        "chrono": "cpp",
        "cinttypes": "cpp",
        "codecvt": "cpp",
        "compare": "cpp",
        "concepts": "cpp",
        "condition_variable": "cpp",
        "forward_list": "cpp",
        "unordered_set": "cpp",
        "ratio": "cpp",
        "regex": "cpp",
        "future": "cpp",
        "mutex": "cpp",
        "ranges": "cpp",
        "shared_mutex": "cpp",
        "stop_token": "cpp",
        "thread": "cpp",
        "typeindex": "cpp",
        "valarray": "cpp",
        "variant": "cpp"
    },
}
\ No newline at end of file

M module-apps/application-calendar/models/NewEditEventModel.cpp => module-apps/application-calendar/models/NewEditEventModel.cpp +1 -1
@@ 105,7 105,7 @@ void NewEditEventModel::loadDataWithoutTimeItem()

void NewEditEventModel::reloadDataWithTimeItem()
{
    auto app = application;
    [[maybe_unused]] auto app = application;
    assert(app != nullptr);

    internalData.clear();

M module-apps/application-calendar/windows/CalendarMainWindow.cpp => module-apps/application-calendar/windows/CalendarMainWindow.cpp +1 -1
@@ 217,7 217,7 @@ namespace gui
        AppWindow::buildInterface();

        LOG_DEBUG("Start build interface for calendar main window");
        auto app = dynamic_cast<app::ApplicationCalendar *>(application);
        [[maybe_unused]] auto app = dynamic_cast<app::ApplicationCalendar *>(application);
        assert(app != nullptr);

        setTitle(utils::localize.get("app_calendar_title_main"));

M module-db/CMakeLists.txt => module-db/CMakeLists.txt +4 -0
@@ 61,6 61,10 @@ set(SOURCES
        queries/sms/QuerySMSThreadsGet.cpp
        queries/sms/QuerySMSSearchByType.cpp
        queries/sms/QuerySmsThreadMarkAsRead.cpp
        queries/sms/QuerySMSGetByID.cpp
        queries/sms/QuerySMSGetByContactID.cpp
        queries/sms/QuerySMSGetByText.cpp
        queries/sms/QuerySMSTemplateGetByID.cpp
        queries/calllog/QueryCalllogSetAllRead.cpp
        queries/notifications/QueryNotificationsGet.cpp
        queries/notifications/QueryNotificationsIncrement.cpp

M module-db/Interface/SMSRecord.cpp => module-db/Interface/SMSRecord.cpp +59 -2
@@ 1,6 1,11 @@
#include "SMSRecord.hpp"
#include "Common/Query.hpp"
#include "ContactRecord.hpp"
#include "ThreadRecord.hpp"
#include "queries/sms/QuerySMSGetByContactID.hpp"
#include "queries/sms/QuerySMSGetByID.hpp"
#include "queries/sms/QuerySMSGetByText.hpp"
#include "queries/sms/QuerySMSSearch.hpp"
#include "queries/sms/QuerySMSSearchByType.hpp"
#include <log/log.hpp>



@@ 288,9 293,61 @@ SMSRecord SMSRecordInterface::GetByID(uint32_t id)

std::unique_ptr<db::QueryResult> SMSRecordInterface::runQuery(std::shared_ptr<db::Query> query)
{
    if (const auto local_query = dynamic_cast<const db::query::SMSSearchByType *>(query.get())) {
        return runQueryImpl(local_query);
    if (const auto localQuery = dynamic_cast<const db::query::SMSSearchByType *>(query.get())) {
        return runQueryImpl(localQuery);
    }
    else if (const auto localQuery = dynamic_cast<const db::query::SMSGetByID *>(query.get())) {
        auto sms = smsDB->sms.getById(localQuery->id);
        SMSRecord record;

        record.body      = sms.body;
        record.contactID = sms.contactID;
        record.date      = sms.date;
        record.dateSent  = sms.dateSent;
        record.errorCode = sms.errorCode;
        record.threadID  = sms.threadID;
        record.type      = sms.type;
        record.ID        = sms.ID;

        return std::make_unique<db::query::SMSGetByIDResult>(record);
    }
    else if (const auto localQuery = dynamic_cast<const db::query::SMSGetByContactID *>(query.get())) {
        auto smsVector = smsDB->sms.getByContactId(localQuery->contactId);
        std::vector<SMSRecord> recordVector;
        for (auto sms : smsVector) {
            SMSRecord record;
            record.body      = sms.body;
            record.contactID = sms.contactID;
            record.date      = sms.date;
            record.dateSent  = sms.dateSent;
            record.errorCode = sms.errorCode;
            record.threadID  = sms.threadID;
            record.type      = sms.type;
            record.ID        = sms.ID;
            recordVector.emplace_back(record);
        }

        return std::make_unique<db::query::SMSGetByContactIDResult>(recordVector);
    }
    else if (const auto localQuery = dynamic_cast<const db::query::SMSGetByText *>(query.get())) {
        auto smsVector = smsDB->sms.getByText(localQuery->text);
        std::vector<SMSRecord> recordVector;
        for (auto sms : smsVector) {
            SMSRecord record;
            record.body      = sms.body;
            record.contactID = sms.contactID;
            record.date      = sms.date;
            record.dateSent  = sms.dateSent;
            record.errorCode = sms.errorCode;
            record.threadID  = sms.threadID;
            record.type      = sms.type;
            record.ID        = sms.ID;
            recordVector.emplace_back(record);
        }

        return std::make_unique<db::query::SMSGetByContactIDResult>(recordVector);
    }

    return nullptr;
}


M module-db/Interface/SMSTemplateRecord.cpp => module-db/Interface/SMSTemplateRecord.cpp +13 -0
@@ 1,4 1,5 @@
#include "SMSTemplateRecord.hpp"
#include "queries/sms/QuerySMSTemplateGetByID.hpp"

#include <log/log.hpp>



@@ 73,3 74,15 @@ SMSTemplateRecord SMSTemplateRecordInterface::GetByID(uint32_t id)

    return SMSTemplateRecord{templ};
}

std::unique_ptr<db::QueryResult> SMSTemplateRecordInterface::runQuery(std::shared_ptr<db::Query> query)
{
    if (const auto local_query = dynamic_cast<const db::query::SMSTemplateGetByID *>(query.get())) {

        auto smsTemplate = smsDB->templates.getById(local_query->id);
        return std::make_unique<db::query::SMSTemplateGetByIDResult>(std::move(smsTemplate));
    }
    else {
        return std::make_unique<db::query::SMSTemplateGetByIDResult>(SMSTemplateRecord());
    }
}

M module-db/Interface/SMSTemplateRecord.hpp => module-db/Interface/SMSTemplateRecord.hpp +2 -0
@@ 42,6 42,8 @@ class SMSTemplateRecordInterface : public RecordInterface<SMSTemplateRecord, SMS
                                                                          SMSTemplateRecordField field,
                                                                          const char *str) override final;

    std::unique_ptr<db::QueryResult> runQuery(std::shared_ptr<db::Query> query) override;

  private:
    SmsDB *smsDB = nullptr;
};

M module-db/Tables/SMSTable.cpp => module-db/Tables/SMSTable.cpp +53 -0
@@ 82,6 82,59 @@ SMSTableRow SMSTable::getById(uint32_t id)
    };
}

std::vector<SMSTableRow> SMSTable::getByContactId(uint32_t contactId)
{
    auto retQuery = db->query("SELECT * FROM sms WHERE contact_id= %u;", contactId);

    if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {
        return std::vector<SMSTableRow>();
    }

    std::vector<SMSTableRow> ret;

    do {
        ret.push_back(SMSTableRow{
            (*retQuery)[0].getUInt32(),                       // ID
            (*retQuery)[1].getUInt32(),                       // threadID
            (*retQuery)[2].getUInt32(),                       // contactID
            (*retQuery)[3].getUInt32(),                       // date
            (*retQuery)[4].getUInt32(),                       // dateSent
            (*retQuery)[5].getUInt32(),                       // errorCode
            (*retQuery)[6].getString(),                       // body
            static_cast<SMSType>((*retQuery)[7].getUInt32()), // type
        });
    } while (retQuery->nextRow());

    return ret;
}

std::vector<SMSTableRow> SMSTable::getByText(std::string text)
{

    auto retQuery = db->query("SELECT *, INSTR(body,'%s') pos FROM sms WHERE pos > 0;", text.c_str());

    if ((retQuery == nullptr) || (retQuery->getRowCount() == 0)) {
        return std::vector<SMSTableRow>();
    }

    std::vector<SMSTableRow> ret;

    do {
        ret.push_back(SMSTableRow{
            (*retQuery)[0].getUInt32(),                       // ID
            (*retQuery)[1].getUInt32(),                       // threadID
            (*retQuery)[2].getUInt32(),                       // contactID
            (*retQuery)[3].getUInt32(),                       // date
            (*retQuery)[4].getUInt32(),                       // dateSent
            (*retQuery)[5].getUInt32(),                       // errorCode
            (*retQuery)[6].getString(),                       // body
            static_cast<SMSType>((*retQuery)[7].getUInt32()), // type
        });
    } while (retQuery->nextRow());

    return ret;
}

std::vector<SMSTableRow> SMSTable::getLimitOffset(uint32_t offset, uint32_t limit)
{
    auto retQuery = db->query("SELECT * from sms ORDER BY date DESC LIMIT %lu OFFSET %lu;", limit, offset);

M module-db/Tables/SMSTable.hpp => module-db/Tables/SMSTable.hpp +2 -0
@@ 44,6 44,8 @@ class SMSTable : public Table<SMSTableRow, SMSTableFields>

    uint32_t count() override final;
    uint32_t countByFieldId(const char *field, uint32_t id) override final;
    std::vector<SMSTableRow> getByContactId(uint32_t contactId);
    std::vector<SMSTableRow> getByText(std::string text);

    std::pair<uint32_t, std::vector<SMSTableRow>> getManyByType(SMSType type, uint32_t offset, uint32_t limit);


A module-db/queries/sms/QuerySMSGetByContactID.cpp => module-db/queries/sms/QuerySMSGetByContactID.cpp +24 -0
@@ 0,0 1,24 @@
#include "QuerySMSGetByContactID.hpp"

namespace db::query
{
    SMSGetByContactID::SMSGetByContactID(unsigned int contactId) : Query(Query::Type::Read), contactId(contactId)
    {}

    auto SMSGetByContactID::debugInfo() const -> std::string
    {
        return "SMSGetByContactID";
    }

    SMSGetByContactIDResult::SMSGetByContactIDResult(std::vector<SMSRecord> result) : result(std::move(result))
    {}
    auto SMSGetByContactIDResult::getResults() const -> std::vector<SMSRecord>
    {
        return result;
    }
    auto SMSGetByContactIDResult::debugInfo() const -> std::string
    {
        return "SMSGetByContactIDResult";
    }

} // namespace db::query

A module-db/queries/sms/QuerySMSGetByContactID.hpp => module-db/queries/sms/QuerySMSGetByContactID.hpp +29 -0
@@ 0,0 1,29 @@
#pragma once

#include <Tables/ThreadsTable.hpp>
#include <Common/Query.hpp>
#include <string>
#include "Interface/SMSRecord.hpp"

namespace db::query
{
    /// implements search for SMS by type
    class SMSGetByContactID : public Query
    {
      public:
        SMSGetByContactID(unsigned int id);
        unsigned int contactId;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

    class SMSGetByContactIDResult : public QueryResult
    {
        std::vector<SMSRecord> result;

      public:
        SMSGetByContactIDResult(std::vector<SMSRecord> result);
        [[nodiscard]] auto getResults() const -> std::vector<SMSRecord>;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

} // namespace db::query

A module-db/queries/sms/QuerySMSGetByID.cpp => module-db/queries/sms/QuerySMSGetByID.cpp +24 -0
@@ 0,0 1,24 @@
#include "QuerySMSGetByID.hpp"

namespace db::query
{
    SMSGetByID::SMSGetByID(unsigned int id) : Query(Query::Type::Read), id(id)
    {}

    auto SMSGetByID::debugInfo() const -> std::string
    {
        return "SMSGetByID";
    }

    SMSGetByIDResult::SMSGetByIDResult(SMSRecord result) : result(std::move(result))
    {}
    auto SMSGetByIDResult::getResults() const -> SMSRecord
    {
        return result;
    }
    auto SMSGetByIDResult::debugInfo() const -> std::string
    {
        return "SMSGetByIDResult";
    }

} // namespace db::query

A module-db/queries/sms/QuerySMSGetByID.hpp => module-db/queries/sms/QuerySMSGetByID.hpp +29 -0
@@ 0,0 1,29 @@
#pragma once

#include <Tables/ThreadsTable.hpp>
#include <Common/Query.hpp>
#include <string>
#include "Interface/SMSRecord.hpp"

namespace db::query
{
    /// implements search for SMS by type
    class SMSGetByID : public Query
    {
      public:
        SMSGetByID(unsigned int id);
        unsigned int id;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

    class SMSGetByIDResult : public QueryResult
    {
        SMSRecord result;

      public:
        SMSGetByIDResult(SMSRecord result);
        [[nodiscard]] auto getResults() const -> SMSRecord;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

} // namespace db::query

A module-db/queries/sms/QuerySMSGetByText.cpp => module-db/queries/sms/QuerySMSGetByText.cpp +24 -0
@@ 0,0 1,24 @@
#include "QuerySMSGetByText.hpp"

namespace db::query
{
    SMSGetByText::SMSGetByText(std::string text) : Query(Query::Type::Read), text(std::move(text))
    {}

    auto SMSGetByText::debugInfo() const -> std::string
    {
        return "SMSGetByText";
    }

    SMSGetByTextResult::SMSGetByTextResult(std::vector<SMSRecord> result) : result(std::move(result))
    {}
    auto SMSGetByTextResult::getResults() const -> std::vector<SMSRecord>
    {
        return result;
    }
    auto SMSGetByTextResult::debugInfo() const -> std::string
    {
        return "SMSGetByTextResult";
    }

} // namespace db::query

A module-db/queries/sms/QuerySMSGetByText.hpp => module-db/queries/sms/QuerySMSGetByText.hpp +29 -0
@@ 0,0 1,29 @@
#pragma once

#include <Tables/ThreadsTable.hpp>
#include <Common/Query.hpp>
#include <string>
#include "Interface/SMSRecord.hpp"

namespace db::query
{
    /// implements search for SMS by type
    class SMSGetByText : public Query
    {
      public:
        SMSGetByText(std::string text);
        std::string text;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

    class SMSGetByTextResult : public QueryResult
    {
        std::vector<SMSRecord> result;

      public:
        SMSGetByTextResult(std::vector<SMSRecord> result);
        [[nodiscard]] auto getResults() const -> std::vector<SMSRecord>;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

} // namespace db::query

A module-db/queries/sms/QuerySMSTemplateGetByID.cpp => module-db/queries/sms/QuerySMSTemplateGetByID.cpp +24 -0
@@ 0,0 1,24 @@
#include "QuerySMSTemplateGetByID.hpp"

namespace db::query
{
    SMSTemplateGetByID::SMSTemplateGetByID(unsigned int id) : Query(Query::Type::Read), id(id)
    {}

    auto SMSTemplateGetByID::debugInfo() const -> std::string
    {
        return "SMSTemplateGetByID";
    }

    SMSTemplateGetByIDResult::SMSTemplateGetByIDResult(SMSTemplateRecord result) : result(std::move(result))
    {}
    auto SMSTemplateGetByIDResult::getResults() const -> SMSTemplateRecord
    {
        return result;
    }
    auto SMSTemplateGetByIDResult::debugInfo() const -> std::string
    {
        return "SMSTemplateGetByIDResult";
    }

} // namespace db::query

A module-db/queries/sms/QuerySMSTemplateGetByID.hpp => module-db/queries/sms/QuerySMSTemplateGetByID.hpp +29 -0
@@ 0,0 1,29 @@
#pragma once

#include <Tables/ThreadsTable.hpp>
#include <Common/Query.hpp>
#include <string>
#include "Interface/SMSTemplateRecord.hpp"

namespace db::query
{
    /// implements search for SMS by type
    class SMSTemplateGetByID : public Query
    {
      public:
        SMSTemplateGetByID(unsigned int id);
        unsigned int id;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

    class SMSTemplateGetByIDResult : public QueryResult
    {
        SMSTemplateRecord result;

      public:
        SMSTemplateGetByIDResult(SMSTemplateRecord result);
        [[nodiscard]] auto getResults() const -> SMSTemplateRecord;
        [[nodiscard]] auto debugInfo() const -> std::string override;
    };

} // namespace db::query

M module-services/service-db/api/DBServiceAPI.cpp => module-services/service-db/api/DBServiceAPI.cpp +4 -2
@@ 363,13 363,15 @@ std::unique_ptr<std::vector<ContactRecord>> DBServiceAPI::ContactGetBySpeeddial(
std::unique_ptr<std::vector<ContactRecord>> DBServiceAPI::ContactGetByPhoneNumber(sys::Service *serv, UTF8 phoneNumber)
{
    ContactRecord rec;
    rec.numbers.push_back(ContactRecord::Number(phoneNumber, phoneNumber));
    utils::PhoneNumber contactNumber(phoneNumber);
    auto number = ContactRecord::Number(contactNumber.get(), contactNumber.toE164(), ContactNumberType ::PAGER);
    rec.numbers.push_back(number);

    std::shared_ptr<DBContactMessage> msg = std::make_shared<DBContactMessage>(MessageType::DBContactGetByNumber, rec);

    auto ret              = sys::Bus::SendUnicast(msg, service::name::db, serv, 5000);
    auto *contactResponse = dynamic_cast<DBContactResponseMessage *>(ret.second.get());
    assert(contactResponse);

    if ((ret.first == sys::ReturnCodes::Success) && (contactResponse->retCode == true)) {
        return std::move(contactResponse->records);
    }

M module-services/service-desktop/ServiceDesktop.cpp => module-services/service-desktop/ServiceDesktop.cpp +10 -0
@@ 3,6 3,8 @@
#include "DesktopMessages.hpp"
#include "EndpointHandler.hpp"
#include "FactoryReset.hpp"
#include "messages/DBSMSMessage.hpp"
#include "messages/DBSMSTemplateMessage.hpp"

ServiceDesktop::ServiceDesktop() : sys::Service(service::name::service_desktop, "", sdesktop::service_stack)
{


@@ 91,6 93,14 @@ sys::Message_t ServiceDesktop::DataReceivedHandler(sys::DataMessage *msg, sys::R
        else if (resp->responseTo >= MessageType::DBContactVerify && resp->responseTo <= MessageType::DBContactBlock) {
            EndpointHandler::handleContactsMessage(msg, resp);
        }
        else if (resp->responseTo >= MessageType::DBSMSAdd && resp->responseTo <= MessageType::DBSMSTemplateGetCount) {
            if (dynamic_cast<DBSMSResponseMessage *>(resp) != nullptr) {
                EndpointHandler::handleMessagesMessage(msg, resp);
            }
            else if (dynamic_cast<DBSMSTemplateResponseMessage *>(resp) != nullptr) {
                EndpointHandler::handleMessageTemplatesMessage(msg, resp);
            }
        }
        else {
            LOG_DEBUG("resp->ResponseTo: %d", static_cast<short>(resp->responseTo));
        }

M module-services/service-desktop/endpoints/CMakeLists.txt => module-services/service-desktop/endpoints/CMakeLists.txt +1 -0
@@ 17,4 17,5 @@ target_sources(${PROJECT_NAME}
		"Restore.cpp"
		"Factory.cpp"
		"Contacts.cpp"
		"Messages.cpp"
)

M module-services/service-desktop/endpoints/Contacts.cpp => module-services/service-desktop/endpoints/Contacts.cpp +1 -0
@@ 85,6 85,7 @@ auto ContactHelper::createDBEntry(json11::Json createJSON, uint32_t uuid) -> sys
        LOG_ERROR("Empty number, not added!");
        return sys::ReturnCodes::Failure;
    }

    DBServiceAPI::ContactAdd(ownerServicePtr, *newRecord);

    return sys::ReturnCodes::Success;

A module-services/service-desktop/endpoints/Messages.cpp => module-services/service-desktop/endpoints/Messages.cpp +274 -0
@@ 0,0 1,274 @@
#include "Messages.hpp"
#include "BaseInterface.hpp"
#include "Common/Query.hpp"
#include "ParserUtils.hpp"
#include "PhoneNumber.hpp"
#include "SMSRecord.hpp"
#include "SMSTemplateRecord.hpp"
#include "Service/Common.hpp"
#include "ThreadRecord.hpp"
#include "api/DBServiceAPI.hpp"
#include "log/log.hpp"
#include "phonenumbers/logger.h"
#include "queries/sms/QuerySMSGetByContactID.hpp"
#include "queries/sms/QuerySMSGetByID.hpp"
#include "queries/sms/QuerySMSGetByText.hpp"
#include "queries/sms/QuerySMSSearch.hpp"
#include "queries/sms/QuerySMSTemplateGetByID.hpp"
#include "queries/sms/QuerySmsThreadMarkAsRead.hpp"
#include "utf8/UTF8.hpp"
#include "json/json11.hpp"
#include <memory>

using namespace ParserStateMachine;

auto MessageHelper::getLastUUID() -> uint32_t
{
    auto uuid = uuidQueue.front();
    uuidQueue.pop();
    return uuid;
}

auto MessageHelper::to_json(SMSRecord record) -> json11::Json
{

    auto recordEntry = json11::Json::object{{json::messages::contactID, static_cast<int>(record.contactID)},
                                            {json::messages::date, static_cast<int>(record.date)},
                                            {json::messages::dateSent, static_cast<int>(record.dateSent)},
                                            {json::messages::id, static_cast<int>(record.ID)},
                                            {json::messages::messageBody, record.body.c_str()},
                                            {json::messages::phoneNumber, record.number.getEntered()},
                                            {json::messages::type, static_cast<int>(record.type)},
                                            {json::messages::threadID, static_cast<int>(record.threadID)}};
    return recordEntry;
}

auto MessageHelper::to_json(SMSTemplateRecord record) -> json11::Json
{

    auto recordEntry = json11::Json::object{{json::messages::id, static_cast<int>(record.ID)},
                                            {json::messages::templateText, record.text.c_str()}};
    return recordEntry;
}

auto MessageHelper::to_json(ThreadRecord record) -> json11::Json
{

    auto recordEntry =
        json11::Json::object{{json::messages::contactID, static_cast<int>(record.contactID)},
                             {json::messages::date, static_cast<int>(record.date)},
                             {json::messages::thread::msgCount, static_cast<int>(record.msgCount)},
                             {json::messages::id, static_cast<int>(record.ID)},
                             {json::messages::thread::snippet, record.snippet.c_str()},
                             {json::messages::isUnread, record.isUnread()},
                             {json::messages::type, static_cast<int>(record.type)},
                             {json::messages::thread::unreadMsgCount, static_cast<int>(record.unreadMsgCount)}};
    return recordEntry;
}

auto MessageHelper::from_json(json11::Json msgJson) -> SMSTemplateRecord
{
    SMSTemplateRecord record;

    record.text = UTF8(msgJson[json::messages::templateText].string_value());

    return record;
}

auto MessageHelper::requestDataFromDB(json11::Json getJSON, uint32_t uuid) -> sys::ReturnCodes
{
    uuidQueue.push(uuid);

    if (getJSON[json::messages::msgTemplate].bool_value() == true) {
        return requestTemplate(getJSON, uuid);
    }
    else {
        return requestSMS(getJSON, uuid);
    }
}

auto MessageHelper::requestSMS(json11::Json getJSON, uint32_t uuid) -> sys::ReturnCodes
{
    if (getJSON[json::messages::count].bool_value() == true) // get messages count
    {
        DBServiceAPI::SMSGetCount(ownerServicePtr);
    }
    else if (getJSON[json::messages::id].int_value() != 0) { // messages search

        auto query = std::make_unique<db::query::SMSGetByID>(getJSON[json::messages::id].int_value());
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));
    }
    else if (getJSON[json::messages::contactID].int_value() != 0) {

        auto query = std::make_unique<db::query::SMSGetByContactID>(getJSON[json::messages::contactID].int_value());
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));
    }
    else if (getJSON[json::messages::messageBody].string_value().empty() == false) {
        auto query = std::make_unique<db::query::SMSGetByText>(getJSON[json::messages::messageBody].string_value());
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query));
    }
    else // get messages
    {
        DBServiceAPI::SMSGetLimitOffset(ownerServicePtr, 0, getJSON[json::messages::count].int_value());
    }

    return sys::ReturnCodes::Success;
}

auto MessageHelper::requestTemplate(json11::Json getJSON, uint32_t uuid) -> sys::ReturnCodes
{
    if (getJSON[json::messages::count].bool_value() == true) // get templates count
    {
        DBServiceAPI::SMSTemplateGetCount(ownerServicePtr);
    }
    else if (getJSON[json::messages::id].int_value() != 0) { // templates search
        auto query = std::make_unique<db::query::SMSTemplateGetByID>(getJSON[json::messages::id].int_value());
        DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query));
    }
    else // get messages
    {
        DBServiceAPI::SMSTemplateGetLimitOffset(ownerServicePtr, 0, getJSON[json::messages::count].int_value());
    }

    return sys::ReturnCodes::Success;
}

auto MessageHelper::createDBEntry(json11::Json createJSON, uint32_t uuid) -> sys::ReturnCodes
{
    uuidQueue.push(uuid);

    if (createJSON[json::messages::msgTemplate].bool_value() == true) {
        return createTemplate(createJSON, uuid);
    }
    else {
        return createSMS(createJSON, uuid);
    }
}

auto MessageHelper::createTemplate(json11::Json createJSON, uint32_t uuid) -> sys::ReturnCodes
{
    SMSTemplateRecord record = from_json(createJSON);

    DBServiceAPI::SMSTemplateAdd(ownerServicePtr, record);

    return sys::ReturnCodes::Success;
}

auto MessageHelper::createSMS(json11::Json createJSON, uint32_t uuid) -> sys::ReturnCodes
{
    return sys::ReturnCodes::Success;
}

auto MessageHelper::deleteDBEntry(json11::Json deleteJSON, uint32_t uuid) -> sys::ReturnCodes
{
    uuidQueue.push(uuid);

    if (deleteJSON[json::messages::msgTemplate].bool_value() == true) {
        return deleteTemplate(deleteJSON, uuid);
    }
    else {
        return deleteSMS(deleteJSON, uuid);
    }
}

auto MessageHelper::deleteSMS(json11::Json deleteJSON, uint32_t uuid) -> sys::ReturnCodes
{
    auto record = std::make_unique<SMSRecord>();
    record->ID  = deleteJSON[json::messages::id].int_value();
    DBServiceAPI::SMSRemove(ownerServicePtr, *record);

    return sys::ReturnCodes::Success;
}

auto MessageHelper::deleteTemplate(json11::Json deleteJSON, uint32_t uuid) -> sys::ReturnCodes
{
    DBServiceAPI::SMSTemplateRemove(ownerServicePtr, deleteJSON[json::messages::id].int_value());
    return sys::ReturnCodes::Success;
}

auto MessageHelper::updateDBEntry(json11::Json updateJSON, uint32_t uuid) -> sys::ReturnCodes
{
    uuidQueue.push(uuid);

    if (updateJSON[json::messages::msgTemplate].bool_value() == true) {
        return updateTemplate(updateJSON, uuid);
    }
    else {
        return updateSMS(updateJSON, uuid);
    }
}

auto MessageHelper::updateSMS(json11::Json updateJSON, uint32_t uuid) -> sys::ReturnCodes
{
    using namespace db::query::smsthread;

    auto query = std::make_unique<db::query::smsthread::MarkAsRead>(
        updateJSON[json::messages::threadID].int_value(),
        (updateJSON[json::messages::isUnread].bool_value() ? MarkAsRead::Read::False : MarkAsRead::Read::True));
    LOG_DEBUG("Marking SMS thread as %d...", updateJSON[json::messages::isUnread].bool_value());

    DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSThread, std::move(query));
    return sys::ReturnCodes::Success;
}

auto MessageHelper::updateTemplate(json11::Json updateJSON, uint32_t uuid) -> sys::ReturnCodes
{
    SMSTemplateRecord record;
    record.ID   = updateJSON[json::messages::id].int_value();
    record.text = updateJSON[json::messages::templateText].string_value();

    DBServiceAPI::SMSTemplateUpdate(ownerServicePtr, record);
    return sys::ReturnCodes::Success;
}

auto MessageHelper::processQueryResult(db::QueryResult *result) -> json11::Json
{
    if (dynamic_cast<db::query::SMSGetByIDResult *>(result) != nullptr) {
        auto SMSresult  = dynamic_cast<db::query::SMSGetByIDResult *>(result);
        auto recordJSON = to_json(SMSresult->getResults());
        return recordJSON;
    }

    else if (dynamic_cast<db::query::SMSGetByContactIDResult *>(result) != nullptr) {
        auto SMSresult = dynamic_cast<db::query::SMSGetByContactIDResult *>(result);
        json11::Json::array SMSarray;

        for (auto record : SMSresult->getResults()) {

            SMSarray.emplace_back(to_json(record));
        }

        return SMSarray;
    }

    else if (dynamic_cast<db::query::SMSGetByTextResult *>(result) != nullptr) {
        auto SMSresult = dynamic_cast<db::query::SMSGetByTextResult *>(result);
        json11::Json::array SMSarray;

        for (auto record : SMSresult->getResults()) {

            SMSarray.emplace_back(to_json(record));
        }

        return SMSarray;
    }

    else if (dynamic_cast<db::query::smsthread::MarkAsReadResult *>(result) != nullptr) {
        auto SMSresult = dynamic_cast<db::query::smsthread::MarkAsReadResult *>(result);

        json11::Json responsePayloadJson = json11::Json::object{
            {json::endpoint, static_cast<int>(Endpoint::messages)},
            {json::status, static_cast<int>(SMSresult->getResult() ? http::Code::OK : http::Code::InternalServerError)},
            {json::uuid, std::to_string(getLastUUID())},
            {json::body, ""}};
        return responsePayloadJson;
    }

    else if (dynamic_cast<db::query::SMSTemplateGetByIDResult *>(result) != nullptr) {
        auto SMSTemplateResult = dynamic_cast<db::query::SMSTemplateGetByIDResult *>(result);
        return to_json(SMSTemplateResult->getResults());
    }
    else {
        return json11::Json();
    }
}

A module-services/service-desktop/endpoints/Messages.hpp => module-services/service-desktop/endpoints/Messages.hpp +43 -0
@@ 0,0 1,43 @@
#pragma once

#include "SMSTemplateRecord.hpp"
#include "Service/Service.hpp"
#include "Service/Common.hpp"
#include "DBHelper.hpp"
#include <service-db/api/DBServiceAPI.hpp>

namespace ParserStateMachine
{

    class MessageHelper : DBHelper
    {
      public:
        MessageHelper(sys::Service *_ownerServicePtr) : DBHelper(_ownerServicePtr){};

        auto createDBEntry(json11::Json createJSON, uint32_t uuid) -> sys::ReturnCodes override;
        auto requestDataFromDB(json11::Json getJSON, uint32_t uuid) -> sys::ReturnCodes override;
        auto updateDBEntry(json11::Json updateJSON, uint32_t uuid) -> sys::ReturnCodes override;
        auto deleteDBEntry(json11::Json deleteJSON, uint32_t uuid) -> sys::ReturnCodes override;

        auto requestTemplate(json11::Json getJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto requestSMS(json11::Json getJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto createTemplate(json11::Json createJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto createSMS(json11::Json createJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto deleteTemplate(json11::Json deleteJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto deleteSMS(json11::Json deleteJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto updateSMS(json11::Json updateJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto updateTemplate(json11::Json updateJSON, uint32_t uuid) -> sys::ReturnCodes;

        auto requestMessagesCount(json11::Json getJSON, uint32_t uuid) -> sys::ReturnCodes;
        auto processQueryResult(db::QueryResult *result) -> json11::Json override;
        auto getLastUUID() -> uint32_t;
        auto to_json(SMSRecord record) -> json11::Json;
        auto to_json(ThreadRecord record) -> json11::Json;
        auto to_json(SMSTemplateRecord record) -> json11::Json;
        auto from_json(json11::Json msgJson) -> SMSTemplateRecord;

      private:
        json11::Json receivedJson;
    };

} // namespace ParserStateMachine

M module-services/service-desktop/parser/EndpointHandler.cpp => module-services/service-desktop/parser/EndpointHandler.cpp +145 -6
@@ 1,15 1,29 @@
#include "EndpointHandler.hpp"
#include "Contacts.hpp"
#include "Messages.hpp"
#include "ParserUtils.hpp"
#include "SMSRecord.hpp"
#include "Service/Common.hpp"
#include "Service/Service.hpp"
#include "log/log.hpp"
#include "messages/DBContactMessage.hpp"
#include "messages/DBSMSMessage.hpp"
#include "messages/DBSMSTemplateMessage.hpp"
#include "messages/QueryMessage.hpp"
#include "queries/phonebook/QueryContactGet.hpp"
#include "queries/sms/QuerySMSGetByID.hpp"
#include "queries/sms/QuerySMSGetByContactID.hpp"
#include "queries/sms/QuerySMSGetByText.hpp"
#include "queries/sms/QuerySMSSearch.hpp"
#include "queries/sms/QuerySMSTemplateGetByID.hpp"
#include "queries/sms/QuerySmsThreadMarkAsRead.hpp"
#include "json/json11.hpp"
#include <string>

using namespace ParserStateMachine;

std::shared_ptr<ContactHelper> EndpointHandler::contactHelper;
std::shared_ptr<MessageHelper> EndpointHandler::messageHelper;

std::string EndpointHandler::buildResponseStr(std::size_t responseSize, std::string responsePayloadString)
{


@@ 22,30 36,35 @@ std::string EndpointHandler::buildResponseStr(std::size_t responseSize, std::str
    return responseStr;
}

std::string EndpointHandler::createSimpleResponse(sys::ReturnCodes status, int endpoint, uint32_t uuid)
std::string EndpointHandler::createSimpleResponse(sys::ReturnCodes status,
                                                  int endpoint,
                                                  uint32_t uuid,
                                                  json11::Json body)
{
    json11::Json responseJson = json11::Json::object{
        {ParserStateMachine::json::endpoint, endpoint},
        {ParserStateMachine::json::status,
         static_cast<int>(status == sys::ReturnCodes::Success ? http::Code::OK : http::Code::InternalServerError)},
        {ParserStateMachine::json::uuid, std::to_string(uuid)},
        {ParserStateMachine::json::body, ""}};
        {ParserStateMachine::json::body, body}};
    return EndpointHandler::buildResponseStr(responseJson.dump().size(), responseJson.dump());
}

std::string EndpointHandler::createSimpleResponse(bool status, int endpoint, uint32_t uuid)
std::string EndpointHandler::createSimpleResponse(bool status, int endpoint, uint32_t uuid, json11::Json body)
{
    json11::Json responseJson = json11::Json::object{
        {ParserStateMachine::json::endpoint, endpoint},
        {ParserStateMachine::json::status, static_cast<int>(status ? http::Code::OK : http::Code::InternalServerError)},
        {ParserStateMachine::json::uuid, std::to_string(uuid)},
        {ParserStateMachine::json::body, ""}};
        {ParserStateMachine::json::body, body}};

    return EndpointHandler::buildResponseStr(responseJson.dump().size(), responseJson.dump());
}

void EndpointHandler::initHelpers(sys::Service *ownerService)
{
    contactHelper = std::make_shared<ContactHelper>(ownerService);
    messageHelper = std::make_shared<MessageHelper>(ownerService);
}

sys::ReturnCodes EndpointHandler::handleQueryMessage(sys::DataMessage *msg, sys::ResponseMessage *resp)


@@ 58,7 77,7 @@ sys::ReturnCodes EndpointHandler::handleQueryMessage(sys::DataMessage *msg, sys:
        LOG_ERROR("Unexpected message.");
        return sys::ReturnCodes::Failure;
    }
    LOG_DEBUG("respTo: %d", (short)queryResponse->responseTo);
    LOG_DEBUG("respTo: %d", static_cast<short>(queryResponse->responseTo));

    auto result = queryResponse->getResult();
    LOG_DEBUG("result: %s", result->debugInfo().c_str());


@@ 67,13 86,38 @@ sys::ReturnCodes EndpointHandler::handleQueryMessage(sys::DataMessage *msg, sys:
        auto responseStr = contactHelper->processQueryResult(result.get()).dump();
        MessageHandler::putToSendQueue(EndpointHandler::buildResponseStr(responseStr.size(), responseStr));
    }
    else if (dynamic_cast<db::query::smsthread::MarkAsReadResult *>(result.get()) != nullptr) {
        auto responseStr = messageHelper->processQueryResult(result.get()).dump();
        MessageHandler::putToSendQueue(EndpointHandler::buildResponseStr(responseStr.size(), responseStr));
    }
    else if (dynamic_cast<db::query::SMSGetByIDResult *>(result.get()) != nullptr) {
        auto responseBody = messageHelper->processQueryResult(result.get()).dump();
        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), responseBody));
    }
    else if (dynamic_cast<db::query::SMSGetByContactIDResult *>(result.get()) != nullptr) {
        auto responseBody = messageHelper->processQueryResult(result.get());
        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), responseBody));
    }
    else if (dynamic_cast<db::query::SMSGetByTextResult *>(result.get()) != nullptr) {
        auto responseBody = messageHelper->processQueryResult(result.get());
        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), responseBody));
    }
    else if (dynamic_cast<db::query::SMSTemplateGetByIDResult *>(result.get()) != nullptr) {
        LOG_DEBUG("template test");
        auto responseBody = messageHelper->processQueryResult(result.get());
        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), responseBody));
    }

    return sys::ReturnCodes::Success;
}

sys::ReturnCodes EndpointHandler::handleContactsMessage(sys::DataMessage *msg, sys::ResponseMessage *resp)
{
    LOG_DEBUG("resp->ResponseTo: %d", (short)resp->responseTo);
    LOG_DEBUG("resp->ResponseTo: %d", static_cast<short>(resp->responseTo));

    if (dynamic_cast<DBContactResponseMessage *>(resp) != nullptr &&
        resp->responseTo == MessageType::DBContactGetByID) {


@@ 100,6 144,78 @@ sys::ReturnCodes EndpointHandler::handleContactsMessage(sys::DataMessage *msg, s
    return sys::ReturnCodes::Success;
}

sys::ReturnCodes EndpointHandler::handleMessagesMessage(sys::DataMessage *msg, sys::ResponseMessage *resp)
{
    LOG_DEBUG("resp->ResponseTo: %d", static_cast<short>(resp->responseTo));

    if (resp->responseTo == MessageType::DBSMSGetCount) {

        auto response = dynamic_cast<DBSMSResponseMessage *>(resp);
        LOG_DEBUG("SMS count: %" PRIu32 "", response->count);
        json11::Json body = json11::Json::object{{json::messages::count, static_cast<int>(response->count)}};
        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), body));
    }
    else if (resp->responseTo == MessageType::DBSMSGetSMSLimitOffset ||
             resp->responseTo == MessageType::DBSMSGetSMSLimitOffsetByThreadID) {

        auto response = dynamic_cast<DBSMSResponseMessage *>(resp);
        auto records  = std::move(response->records);

        json11::Json::array recordsArray;
        for (auto record : *records) {
            recordsArray.emplace_back(messageHelper->to_json(record));
        }

        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), recordsArray));
    }
    else if (resp->responseTo == MessageType::DBSMSRemove) {

        LOG_DEBUG("SMS removed");
        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID()));
    }

    return sys::ReturnCodes::Success;
}

sys::ReturnCodes EndpointHandler::handleMessageTemplatesMessage(sys::DataMessage *msg, sys::ResponseMessage *resp)
{
    LOG_DEBUG("resp->ResponseTo: %d", static_cast<short>(resp->responseTo));

    if (resp->responseTo == MessageType::DBSMSTemplateGetCount) {

        auto response = dynamic_cast<DBSMSTemplateResponseMessage *>(resp);
        LOG_DEBUG("SMS Template count: %" PRIu32 "", response->count);
        json11::Json body = json11::Json::object{{json::messages::count, static_cast<int>(response->count)}};
        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), body));
    }
    else if (resp->responseTo == MessageType::DBSMSTemplateGetLimitOffset) {

        auto response = dynamic_cast<DBSMSTemplateResponseMessage *>(resp);
        auto records  = std::move(response->records);

        json11::Json::array recordsArray;
        for (auto record : *records) {
            recordsArray.emplace_back(messageHelper->to_json(record));
        }

        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID(), recordsArray));
    }
    else if (resp->responseTo == MessageType::DBSMSTemplateAdd ||
             resp->responseTo == MessageType::DBSMSTemplateRemove ||
             resp->responseTo == MessageType::DBSMSTemplateUpdate) {

        MessageHandler::putToSendQueue(EndpointHandler::createSimpleResponse(
            resp->retCode, static_cast<int>(Endpoint::messages), messageHelper->getLastUUID()));
    }

    return sys::ReturnCodes::Success;
}

sys::ReturnCodes EndpointHandler::contacts(
    uint8_t httpMethod, uint32_t uuid, json11::Json &body, std::string &responseStr, sys::Service *ownerService)
{


@@ 122,3 238,26 @@ sys::ReturnCodes EndpointHandler::contacts(

    return sys::ReturnCodes::Success;
}

sys::ReturnCodes EndpointHandler::messages(
    uint8_t httpMethod, uint32_t uuid, json11::Json &body, std::string &responseStr, sys::Service *ownerService)
{
    // process messages request

    switch (static_cast<http::Method>(httpMethod)) {
    case http::Method::get:
        messageHelper->requestDataFromDB(body, uuid);
        break;
    case http::Method::post: // update entry
        messageHelper->updateDBEntry(body, uuid);
        break;
    case http::Method::put:
        messageHelper->createDBEntry(body, uuid);
        break;
    case http::Method::del:
        messageHelper->deleteDBEntry(body, uuid);
        break;
    }

    return sys::ReturnCodes::Success;
}

M module-services/service-desktop/parser/EndpointHandler.hpp => module-services/service-desktop/parser/EndpointHandler.hpp +16 -2
@@ 5,8 5,10 @@
#include "ParserUtils.hpp"
#include "Service/Common.hpp"
#include <service-desktop/ServiceDesktop.hpp>
#include <string>
#include "DBHelper.hpp"
#include "Contacts.hpp"
#include "Messages.hpp"
#include "queries/phonebook/QueryContactGet.hpp"

using namespace ParserStateMachine;


@@ 18,9 20,18 @@ class EndpointHandler

    static sys::ReturnCodes handleQueryMessage(sys::DataMessage *msg, sys::ResponseMessage *resp);
    static sys::ReturnCodes handleContactsMessage(sys::DataMessage *msg, sys::ResponseMessage *resp);
    static sys::ReturnCodes handleMessagesMessage(sys::DataMessage *msg, sys::ResponseMessage *resp);
    static sys::ReturnCodes handleMessageTemplatesMessage(sys::DataMessage *msg, sys::ResponseMessage *resp);

    static sys::ReturnCodes decodeMessage(db::query::ContactGetResult *message);
    static std::string createSimpleResponse(sys::ReturnCodes status, int endpoint, uint32_t uuid);
    static std::string createSimpleResponse(bool status, int endpoint, uint32_t uuid);
    static std::string createSimpleResponse(sys::ReturnCodes status,
                                            int endpoint,
                                            uint32_t uuid,
                                            json11::Json body = json11::Json());
    static std::string createSimpleResponse(bool status,
                                            int endpoint,
                                            uint32_t uuid,
                                            json11::Json body = json11::Json());

    static std::string buildResponseStr(std::size_t responseSize, std::string responsePayloadString);
    static sys::ReturnCodes update(


@@ 35,7 46,10 @@ class EndpointHandler
        uint8_t httpMethod, uint32_t uuid, json11::Json &body, std::string &responseStr, sys::Service *ownerService);
    static sys::ReturnCodes contacts(
        uint8_t httpMethod, uint32_t uuid, json11::Json &body, std::string &responseStr, sys::Service *ownerService);
    static sys::ReturnCodes messages(
        uint8_t httpMethod, uint32_t uuid, json11::Json &body, std::string &responseStr, sys::Service *ownerService);

  private:
    static std::shared_ptr<ContactHelper> contactHelper;
    static std::shared_ptr<MessageHelper> messageHelper;
};

M module-services/service-desktop/parser/MessageHandler.cpp => module-services/service-desktop/parser/MessageHandler.cpp +5 -0
@@ 54,6 54,11 @@ void MessageHandler::processMessage()
    case Endpoint::contacts:
        EndpointHandler::contacts(method, uuid, body, responseStr, OwnerServicePtr);
        break;
    case Endpoint::messages:
        EndpointHandler::messages(method, uuid, body, responseStr, OwnerServicePtr);

        break;

    default:
        break;
    }

M module-services/service-desktop/parser/ParserUtils.hpp => module-services/service-desktop/parser/ParserUtils.hpp +27 -1
@@ 15,7 15,8 @@ namespace ParserStateMachine
        backup,
        restore,
        factory,
        contacts
        contacts,
        messages
    };

    // Message defs and utils


@@ 126,6 127,31 @@ namespace ParserStateMachine

        } // namespace contacts

        namespace messages
        {
            const inline std::string id           = "id";
            const inline std::string count        = "count";
            const inline std::string offset       = "offset";
            const inline std::string phoneNumber  = "phoneNumber";
            const inline std::string messageBody  = "messageBody";
            const inline std::string isUnread     = "unread";
            const inline std::string contactID    = "contactID";
            const inline std::string date         = "date";
            const inline std::string dateSent     = "dateSent";
            const inline std::string type         = "type";
            const inline std::string threadID     = "threadID";
            const inline std::string msgTemplate  = "template";
            const inline std::string templateText = "text";
            namespace thread
            {
                const inline std::string msgCount       = "msgCount";
                const inline std::string snippet        = "snippet";
                const inline std::string unreadMsgCount = "unreadMsgCount";

            } // namespace thread

        } // namespace messages

    } // namespace json

} // namespace ParserStateMachine

M module-services/service-desktop/tests/unittest.cpp => module-services/service-desktop/tests/unittest.cpp +44 -3
@@ 1,13 1,17 @@
#include "Common/Common.hpp"
#include "ContactRecord.hpp"
#include "MessageType.hpp"
#include "ParserUtils.hpp"
#include "Service/Common.hpp"
#include "UpdatePureOS.hpp"
#include "FactoryReset.hpp"
#include "ParserStateMachine.hpp"
#include "EndpointHandler.hpp"
#include "queries/sms/QuerySMSSearchByType.hpp"
#include "service-desktop/ServiceDesktop.hpp"

#include "json/json11.hpp"
#include <memory>
#include <vfs.hpp>
#include <catch2/catch.hpp>
#include <iostream>


@@ 162,7 166,7 @@ TEST_CASE("DB Helpers test - json decoding")
    }
}

TEST_CASE("DB Helpers test - json encoding")
TEST_CASE("DB Helpers test - json encoding (contacts)")
{
    auto helper = std::make_unique<ContactHelper>(nullptr);



@@ 188,18 192,55 @@ TEST_CASE("DB Helpers test - json encoding")
    REQUIRE(contactJson[json::contacts::numbers][0].dump() == "\"724842187\"");
}

TEST_CASE("DB Helpers test - json encoding (messages)")
{
    auto helper  = std::make_unique<MessageHelper>(nullptr);
    auto message = std::make_unique<SMSRecord>();

    utils::PhoneNumber phoneNumber("111222333");
    auto contactNum = ContactRecord::Number(phoneNumber.get(), phoneNumber.toE164(), ContactNumberType ::PAGER);

    message->body      = "test message";
    message->contactID = 1;
    message->date      = 12345;
    message->dateSent  = 54321;
    message->errorCode = 0;
    message->number    = contactNum.number;
    message->threadID  = 1;
    message->ID        = 10;
    message->type      = SMSType::DRAFT;

    auto messageJson = helper->to_json(*message);

    REQUIRE(messageJson[json::messages::messageBody] == "test message");
    REQUIRE(messageJson[json::messages::contactID] == 1);
    REQUIRE(messageJson[json::messages::date] == 12345);
    REQUIRE(messageJson[json::messages::dateSent] == 54321);
    REQUIRE(messageJson[json::messages::threadID] == 1);
    REQUIRE(messageJson[json::messages::id] == 10);

    auto messageTemplate = std::make_unique<SMSTemplateRecord>();

    messageTemplate->text = "test template";
    messageTemplate->ID   = 1;

    auto messageTemplateJson = helper->to_json(*messageTemplate);

    REQUIRE(messageTemplateJson[json::messages::templateText] == "test template");
    REQUIRE(messageTemplateJson[json::messages::id] == 1);
}

TEST_CASE("Simple response builder test")
{
    auto resp =
        EndpointHandler::createSimpleResponse(sys::ReturnCodes::Success, static_cast<int>(Endpoint::contacts), 1234);
    std::string err;
    REQUIRE(resp.substr(0, 10) == "#000000058");
    REQUIRE(resp.substr(0, 10) == "#000000060");
    resp.erase(0, 10);

    auto responseJson = json11::Json::parse(resp, err);
    REQUIRE(err.empty());
    REQUIRE(responseJson[json::endpoint] == static_cast<int>(Endpoint::contacts));
    REQUIRE(responseJson[json::body] == "");
    REQUIRE(responseJson[json::status] == static_cast<int>(http::Code::OK));
    REQUIRE(responseJson[json::uuid].dump() == "\"1234\"");
}