From f5352686241a8aa5f2ab462ee97245fe5c8cbb35 Mon Sep 17 00:00:00 2001 From: Pawel Olejniczak Date: Mon, 8 Feb 2021 14:46:06 +0100 Subject: [PATCH] [EGD-5586] Clean up messages endpoint API Introducing changes according to new messages endpoint api proposal doc. All request have been updated, and some new were added. Harness tests were updated too. These changes will be followed up with pagination implementation. --- module-db/Interface/ThreadRecord.cpp | 4 +- .../developerMode/DeveloperModeHelper.cpp | 8 +- .../endpoints/messages/MessageHelper.cpp | 882 ++++++++++-------- .../endpoints/messages/MessageHelper.hpp | 60 +- .../endpoints/messages/MessagesEndpoint.cpp | 6 +- .../endpoints/messages/MessagesEndpoint.hpp | 2 +- .../service-desktop/parser/ParserUtils.cpp | 24 +- .../service-desktop/parser/ParserUtils.hpp | 62 +- .../service-desktop/tests/unittest.cpp | 14 +- test/pytest/service-desktop/test_messages.py | 51 +- test/pytest/service-desktop/test_templates.py | 50 +- test/pytest/service-desktop/test_threads.py | 27 + test/pytest/test_search_sms.py | 3 +- test/pytest/test_send_message.py | 20 +- test/search_sms.py | 3 +- 15 files changed, 687 insertions(+), 529 deletions(-) create mode 100644 test/pytest/service-desktop/test_threads.py diff --git a/module-db/Interface/ThreadRecord.cpp b/module-db/Interface/ThreadRecord.cpp index 7d8e3bc53..1f304577d 100644 --- a/module-db/Interface/ThreadRecord.cpp +++ b/module-db/Interface/ThreadRecord.cpp @@ -226,7 +226,9 @@ std::unique_ptr ThreadRecordInterface::markAsReadQuery(const st ret = Update(record); } - return std::make_unique(ret); + auto response = std::make_unique(ret); + response->setRequestQuery(query); + return response; } std::unique_ptr ThreadRecordInterface::threadsGetQuery(const std::shared_ptr &query) diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp index 1c9817348..49b057093 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp @@ -65,7 +65,7 @@ auto DeveloperModeHelper::processPutRequest(Context &context) -> sys::ReturnCode } else if (body[json::developerMode::smsCommand].is_string()) { if (body[json::developerMode::smsCommand].string_value() == json::developerMode::smsAdd) { - SMSType smsType = static_cast(context.getBody()[json::messages::type].int_value()); + const auto smsType = static_cast(context.getBody()[json::messages::messageType].int_value()); if (smsType == SMSType::DRAFT || smsType == SMSType::QUEUED || smsType == SMSType::FAILED) { return prepareSMS(context); } @@ -212,11 +212,9 @@ auto DeveloperModeHelper::smsRecordFromJson(json11::Json msgJson) -> SMSRecord { auto record = SMSRecord(); - record.type = static_cast(msgJson[json::messages::type].int_value()); + record.type = static_cast(msgJson[json::messages::messageType].int_value()); record.date = utils::time::getCurrentTimestamp().getTime(); - utils::PhoneNumber phoneNumber(msgJson[json::messages::phoneNumber].string_value()); - record.number = phoneNumber.getView(); - record.body = UTF8(msgJson[json::messages::messageBody].string_value()); + record.body = UTF8(msgJson[json::messages::messageBody].string_value()); return record; } diff --git a/module-services/service-desktop/endpoints/messages/MessageHelper.cpp b/module-services/service-desktop/endpoints/messages/MessageHelper.cpp index e6fd18d9d..f43fb09ab 100644 --- a/module-services/service-desktop/endpoints/messages/MessageHelper.cpp +++ b/module-services/service-desktop/endpoints/messages/MessageHelper.cpp @@ -9,16 +9,13 @@ #include #include -#include #include #include #include #include #include #include -#include #include -#include #include #include #include @@ -28,160 +25,308 @@ #include #include #include +#include #include #include #include #include -#include #include -#include +#include -using namespace parserFSM; - -auto MessageHelper::to_json(SMSRecord record) -> json11::Json +namespace parserFSM { - auto recordEntry = json11::Json::object{{json::messages::contactID, static_cast(record.contactID)}, - {json::messages::date, static_cast(record.date)}, - {json::messages::dateSent, static_cast(record.dateSent)}, - {json::messages::id, static_cast(record.ID)}, - {json::messages::messageBody, record.body.c_str()}, - {json::messages::type, static_cast(record.type)}, - {json::messages::threadID, static_cast(record.threadID)}}; - return recordEntry; -} - -auto MessageHelper::to_json(SMSTemplateRecord record) -> json11::Json -{ - - auto recordEntry = json11::Json::object{{json::messages::id, static_cast(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(record.contactID)}, - {json::messages::date, static_cast(record.date)}, - {json::messages::thread::msgCount, static_cast(record.msgCount)}, - {json::messages::id, static_cast(record.ID)}, - {json::messages::thread::snippet, record.snippet.c_str()}, - {json::messages::isUnread, record.isUnread()}, - {json::messages::type, static_cast(record.type)}, - {json::messages::thread::unreadMsgCount, static_cast(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(Context &context) -> sys::ReturnCodes -{ - - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return requestTemplate(context); - } - else { - return requestSMS(context); - } -} - -auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes -{ - if (context.getBody()[json::messages::count].bool_value() == true) // get messages count + auto MessageHelper::toJson(const SMSRecord &record) -> json11::Json { - auto query = std::make_unique(); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - auto id = SMSResult->getResults(); - - context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + auto recordEntry = json11::Json::object{{json::messages::contactID, static_cast(record.contactID)}, + {json::messages::receivedAt, static_cast(record.date)}, + {json::messages::sentAt, static_cast(record.dateSent)}, + {json::messages::messageID, static_cast(record.ID)}, + {json::messages::messageBody, record.body.c_str()}, + {json::messages::messageType, static_cast(record.type)}, + {json::messages::threadID, static_cast(record.threadID)}}; + return recordEntry; } - else if (context.getBody()[json::messages::id].int_value() != 0) { // messages search - auto query = std::make_unique(context.getBody()[json::messages::id].int_value()); + auto MessageHelper::toJson(const SMSTemplateRecord &record) -> json11::Json + { - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - - context.setResponseBody(MessageHelper::to_json(SMSResult->getResults())); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + auto recordEntry = + json11::Json::object{{json::messages::templateID, static_cast(record.ID)}, + {json::messages::templateBody, record.text.c_str()}, + {json::messages::lastUsedAt, static_cast(record.lastUsageTimestamp)}}; + return recordEntry; } - else if (context.getBody()[json::messages::contactID].int_value() != 0) { - auto query = - std::make_unique(context.getBody()[json::messages::contactID].int_value()); + auto MessageHelper::toJson(const ThreadRecord &record) -> json11::Json + { - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { + auto recordEntry = json11::Json::object{{json::messages::contactID, static_cast(record.contactID)}, + {json::messages::numberID, static_cast(record.numberID)}, + {json::messages::lastUpdatedAt, static_cast(record.date)}, + {json::messages::messageCount, static_cast(record.msgCount)}, + {json::messages::threadID, static_cast(record.ID)}, + {json::messages::messageSnippet, record.snippet.c_str()}, + {json::messages::isUnread, record.isUnread()}, + {json::messages::messageType, static_cast(record.type)}}; + return recordEntry; + } - json11::Json::array SMSarray; - for (auto record : SMSResult->getResults()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); + auto MessageHelper::fromJson(const json11::Json &msgJson) -> SMSTemplateRecord + { + SMSTemplateRecord record; + + record.text = UTF8(msgJson[json::messages::templateBody].string_value()); + + return record; + } + + auto MessageHelper::requestDataFromDB(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::category].string_value() == json::messages::categoryMessage) { + return requestSMS(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) { + return requestTemplate(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryThread) { + return requestThread(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + auto MessageHelper::createDBEntry(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::category].string_value() == json::messages::categoryMessage) { + return createSMS(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) { + return createTemplate(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + auto MessageHelper::updateDBEntry(Context &context) -> sys::ReturnCodes + { + 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) { + return updateThread(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + auto MessageHelper::deleteDBEntry(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::category].string_value() == json::messages::categoryMessage) { + return deleteSMS(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) { + return deleteTemplate(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryThread) { + return deleteThread(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::count].bool_value()) // get messages count + { + auto query = std::make_unique(); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + auto id = smsResult->getResults(); + + context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; } + else { + return false; + } + }, + context); - context.setResponseBody(SMSarray); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else if (context.getBody()[json::messages::messageID].int_value() != 0) { // get message by ID - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + auto query = + std::make_unique(context.getBody()[json::messages::messageID].int_value()); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + + context.setResponseBody(MessageHelper::toJson(smsResult->getResults())); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else if (context.getBody()[json::messages::threadID].int_value() != 0) { // get messages by thread ID + + auto query = + std::make_unique(context.getBody()[json::messages::threadID].int_value(), + context.getBody()[json::messages::offset].int_value(), + context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; + + json11::Json::array smsArray; + for (const auto &record : smsResult->getResults()) { + smsArray.emplace_back(MessageHelper::toJson(record)); + } + + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, smsArray}}); + + context.setResponseBody(responseBody); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else if (!context.getBody()[json::messages::messageBody].string_value().empty()) // get by message body + { + // not adding pagination for this request, since it is just for development and testing purposes, and it's + // not going to be used by Mudita Center + auto query = std::make_unique( + context.getBody()[json::messages::messageBody].string_value()); + if (const auto filterByNumber = !context.getBody()[json::messages::phoneNumber].string_value().empty(); + filterByNumber) { + utils::PhoneNumber number{context.getBody()[json::messages::phoneNumber].string_value()}; + query->filterByPhoneNumber(number.getView()); + } + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + + json11::Json::array smsArray; + for (const auto &record : smsResult->getResults()) { + smsArray.emplace_back(MessageHelper::toJson(record)); + } + + context.setResponseBody(smsArray); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else // get messages + { + auto query = std::make_unique(context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit, + context.getBody()[json::messages::offset].int_value()); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; + + json11::Json::array smsArray; + for (const auto &record : smsResult->getRecords()) { + smsArray.emplace_back(MessageHelper::toJson(record)); + LOG_DEBUG("Record found!: %" PRIu32 "\n", record.ID); + } + + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, smsArray}}); + context.setResponseBody(responseBody); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + return sys::ReturnCodes::Success; } - else if (context.getBody()[json::messages::threadID].int_value() != 0) { - auto query = - std::make_unique(context.getBody()[json::messages::threadID].int_value()); + auto MessageHelper::createSMS(Context &context) -> sys::ReturnCodes + { + context.setResponseStatus(http::Code::InternalServerError); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Success; + } + auto MessageHelper::deleteSMS(Context &context) -> sys::ReturnCodes + { + if (!context.getBody()[json::messages::messageID].is_number()) { + LOG_ERROR("Bad request! messageID is incorrect or missing!"); + return sys::ReturnCodes::Unresolved; + } + auto id = context.getBody()[json::messages::messageID].int_value(); + auto query = std::make_unique(id); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { + if (auto smsTemplateResult = dynamic_cast(result)) { - json11::Json::array SMSarray; - for (auto record : SMSResult->getResults()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); - } - - context.setResponseBody(SMSarray); + context.setResponseStatus(smsTemplateResult->getResults() ? http::Code::OK + : http::Code::InternalServerError); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -193,81 +338,123 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes query->setQueryListener(std::move(listener)); DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + + return sys::ReturnCodes::Success; } - else if (context.getBody()[json::messages::messageBody].string_value().empty() == false) { - auto query = - std::make_unique(context.getBody()[json::messages::messageBody].string_value()); - if (const auto filterByNumber = !context.getBody()[json::messages::phoneNumber].string_value().empty(); - filterByNumber) { - utils::PhoneNumber number{context.getBody()[json::messages::phoneNumber].string_value()}; - query->filterByPhoneNumber(number.getView()); + + auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::count].bool_value()) // get templates count + { + auto query = std::make_unique(); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + auto id = smsResult->getResults(); + + context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + } + else if (context.getBody()[json::messages::templateID].int_value() != 0) { // get template by ID + auto query = std::make_unique( + context.getBody()[json::messages::templateID].int_value()); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsTemplateResult = dynamic_cast(result)) { + + context.setResponseBody(MessageHelper::toJson(smsTemplateResult->getResults())); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + } + else // get messages templates + { + auto query = + std::make_unique(context.getBody()[json::messages::offset].int_value(), + context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit); + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsTemplateResult = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; + + json11::Json::array smsTemplateArray; + for (const auto &record : smsTemplateResult->getResults()) { + smsTemplateArray.emplace_back(toJson(record)); + } + + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, smsTemplateArray}}); + + context.setResponseBody(responseBody); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); } - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - - json11::Json::array SMSarray; - for (auto record : SMSResult->getResults()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); - } - - context.setResponseBody(SMSarray); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + return sys::ReturnCodes::Success; } - else // get messages + auto MessageHelper::updateTemplate(Context &context) -> sys::ReturnCodes { - auto query = std::make_unique(context.getBody()[json::messages::count].int_value(), - context.getBody()[json::messages::offset].int_value()); + if (!context.getBody()[json::messages::templateID].is_number()) { + LOG_ERROR("Bad request! templateID is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + if (!context.getBody()[json::messages::templateBody].is_string()) { + LOG_ERROR("Bad request! templateBody is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + SMSTemplateRecord record; + record.ID = context.getBody()[json::messages::templateID].int_value(); + record.text = context.getBody()[json::messages::templateBody].string_value(); + + auto query = std::make_unique(record); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { + if (auto smsTemplateResult = dynamic_cast(result)) { - json11::Json::array SMSarray; - for (auto record : SMSResult->getRecords()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); - } - - context.setResponseBody(SMSarray); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); - } - - return sys::ReturnCodes::Success; -} - -auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes -{ - if (context.getBody()[json::messages::count].bool_value() == true) // get templates count - { - auto query = std::make_unique(); - - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - auto id = SMSResult->getResults(); - - context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); + context.setResponseStatus(smsTemplateResult->getResult() ? http::Code::OK + : http::Code::InternalServerError); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -279,15 +466,28 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes query->setQueryListener(std::move(listener)); DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - } - else if (context.getBody()[json::messages::id].int_value() != 0) { // templates search - auto query = std::make_unique(context.getBody()[json::messages::id].int_value()); + return sys::ReturnCodes::Success; + } + + auto MessageHelper::createTemplate(Context &context) -> sys::ReturnCodes + { + if (!context.getBody()[json::messages::templateBody].is_string()) { + LOG_ERROR("Bad request! templateBody is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + SMSTemplateRecord record = fromJson(context.getBody()); + + auto query = std::make_unique(record); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { + if (auto smsTemplateResult = dynamic_cast(result)) { - context.setResponseBody(MessageHelper::to_json(SMSTemplateResult->getResults())); + context.setResponseStatus(smsTemplateResult->getResult() ? http::Code::OK + : http::Code::InternalServerError); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -299,21 +499,67 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes query->setQueryListener(std::move(listener)); DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + + return sys::ReturnCodes::Success; } - else // get messages templates + + auto MessageHelper::deleteTemplate(Context &context) -> sys::ReturnCodes { - auto query = std::make_unique(context.getBody()[json::messages::offset].int_value(), - context.getBody()[json::messages::count].int_value()); + if (!context.getBody()[json::messages::templateID].is_number()) { + LOG_ERROR("Bad request! templateID is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + auto query = + std::make_unique(context.getBody()[json::messages::templateID].int_value()); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { + if (auto smsTemplateResult = dynamic_cast(result)) { - json11::Json::array SMSTemplateArray; - for (auto record : SMSTemplateResult->getResults()) { - SMSTemplateArray.emplace_back(to_json(record)); + context.setResponseStatus(smsTemplateResult->getResults() ? http::Code::OK + : http::Code::InternalServerError); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + return sys::ReturnCodes::Success; + } + + auto MessageHelper::requestThread(Context &context) -> sys::ReturnCodes + { + auto query = std::make_unique(context.getBody()[json::messages::offset].int_value(), + context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto threadsResults = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; + + json11::Json::array threadsArray; + for (const auto &record : threadsResults->getResults()) { + threadsArray.emplace_back(MessageHelper::toJson(record)); } - context.setResponseBody(SMSTemplateArray); + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, threadsArray}}); + + context.setResponseBody(responseBody); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -324,178 +570,58 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes context); query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSThread, std::move(query)); + + return sys::ReturnCodes::Success; } - return sys::ReturnCodes::Success; -} + auto MessageHelper::updateThread(Context &context) -> sys::ReturnCodes // Set thread as read/unread + { + if (!context.getBody()[json::messages::threadID].is_number()) { + LOG_ERROR("Bad request! threadID is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } -auto MessageHelper::createDBEntry(Context &context) -> sys::ReturnCodes -{ + if (!context.getBody()[json::messages::isUnread].is_bool()) { + LOG_ERROR("Bad request! isUnread is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return createTemplate(context); + auto query = std::make_unique(context.getBody()[json::messages::threadID].int_value(), + (context.getBody()[json::messages::isUnread].bool_value() + ? db::query::MarkAsRead::Read::False + : db::query::MarkAsRead::Read::True)); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto threadResult = dynamic_cast(result)) { + + context.setResponseStatus(threadResult->getResult() ? http::Code::OK + : http::Code::InternalServerError); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSThread, std::move(query)); + + return sys::ReturnCodes::Success; } - else { - return createSMS(context); + + auto MessageHelper::deleteThread(Context &context) -> sys::ReturnCodes + { + context.setResponseStatus(http::Code::InternalServerError); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Success; } -} - -auto MessageHelper::createTemplate(Context &context) -> sys::ReturnCodes -{ - SMSTemplateRecord record = from_json(context.getBody()); - - auto query = std::make_unique(record); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSTemplateResult->getResult() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - - return sys::ReturnCodes::Success; -} - -auto MessageHelper::createSMS(Context &context) -> sys::ReturnCodes -{ - return sys::ReturnCodes::Success; -} - -auto MessageHelper::deleteDBEntry(Context &context) -> sys::ReturnCodes -{ - - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return deleteTemplate(context); - } - else { - return deleteSMS(context); - } -} - -auto MessageHelper::deleteSMS(Context &context) -> sys::ReturnCodes -{ - auto id = context.getBody()[json::messages::id].int_value(); - auto query = std::make_unique(id); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSTemplateResult->getResults() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); - - return sys::ReturnCodes::Success; -} - -auto MessageHelper::deleteTemplate(Context &context) -> sys::ReturnCodes -{ - auto id = context.getBody()[json::messages::id].int_value(); - auto query = std::make_unique(id); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSTemplateResult->getResults() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - return sys::ReturnCodes::Success; -} - -auto MessageHelper::updateDBEntry(Context &context) -> sys::ReturnCodes -{ - - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return updateTemplate(context); - } - else { - return updateSMS(context); - } -} - -auto MessageHelper::updateSMS(Context &context) -> sys::ReturnCodes -{ - using namespace db::query; - - auto query = std::make_unique( - context.getBody()[json::messages::threadID].int_value(), - (context.getBody()[json::messages::isUnread].bool_value() ? MarkAsRead::Read::False : MarkAsRead::Read::True)); - - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSResult->getResult() ? http::Code::OK : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSThread, std::move(query)); - return sys::ReturnCodes::Success; -} - -auto MessageHelper::updateTemplate(Context &context) -> sys::ReturnCodes -{ - SMSTemplateRecord record; - record.ID = context.getBody()[json::messages::id].int_value(); - record.text = context.getBody()[json::messages::templateText].string_value(); - - auto query = std::make_unique(record); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSTemplateResult->getResult() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - - return sys::ReturnCodes::Success; -} +} // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/messages/MessageHelper.hpp b/module-services/service-desktop/endpoints/messages/MessageHelper.hpp index e02a21655..a012293c8 100644 --- a/module-services/service-desktop/endpoints/messages/MessageHelper.hpp +++ b/module-services/service-desktop/endpoints/messages/MessageHelper.hpp @@ -14,9 +14,6 @@ #include #include -#include -#include - namespace sys { class Service; @@ -29,55 +26,34 @@ namespace parserFSM class MessageHelper final : public DBHelper { public: - MessageHelper(sys::Service *_ownerServicePtr) : DBHelper(_ownerServicePtr){}; + explicit MessageHelper(sys::Service *_ownerServicePtr) : DBHelper(_ownerServicePtr){}; auto createDBEntry(Context &context) -> sys::ReturnCodes override; auto requestDataFromDB(Context &context) -> sys::ReturnCodes override; auto updateDBEntry(Context &context) -> sys::ReturnCodes override; auto deleteDBEntry(Context &context) -> sys::ReturnCodes override; - auto createTemplate(Context &context) -> sys::ReturnCodes; + static auto toJson(const SMSRecord &record) -> json11::Json; + static auto toJson(const ThreadRecord &record) -> json11::Json; + static auto toJson(const SMSTemplateRecord &record) -> json11::Json; + static auto fromJson(const json11::Json &msgJson) -> SMSTemplateRecord; + + private: + auto requestThread(Context &context) -> sys::ReturnCodes; + auto updateThread(Context &context) -> sys::ReturnCodes; + auto deleteThread(Context &context) -> sys::ReturnCodes; + + auto requestSMS(Context &context) -> sys::ReturnCodes; + auto createSMS(Context &context) -> sys::ReturnCodes; + auto deleteSMS(Context &context) -> sys::ReturnCodes; + auto requestTemplate(Context &context) -> sys::ReturnCodes; + auto createTemplate(Context &context) -> sys::ReturnCodes; auto updateTemplate(Context &context) -> sys::ReturnCodes; auto deleteTemplate(Context &context) -> sys::ReturnCodes; - auto createSMS(Context &context) -> sys::ReturnCodes; - auto requestSMS(Context &context) -> sys::ReturnCodes; - auto updateSMS(Context &context) -> sys::ReturnCodes; - auto deleteSMS(Context &context) -> sys::ReturnCodes; - - // auto createSimpleResponse(Context &context) -> std::string override; - - static auto to_json(SMSRecord record) -> json11::Json; - static auto to_json(ThreadRecord record) -> json11::Json; - static auto to_json(SMSTemplateRecord record) -> json11::Json; - static auto from_json(json11::Json msgJson) -> SMSTemplateRecord; - - private: json11::Json receivedJson; + + const int defaultLimit = 100; // will be removed after introducing pagination }; - - namespace messages - { - inline constexpr auto id = "id"; - inline constexpr auto count = "count"; - inline constexpr auto offset = "offset"; - inline constexpr auto phoneNumber = "phoneNumber"; - inline constexpr auto isUnread = "unread"; - inline constexpr auto contactID = "contactID"; - inline constexpr auto date = "date"; - inline constexpr auto dateSent = "dateSent"; - inline constexpr auto type = "type"; - inline constexpr auto threadID = "threadID"; - inline constexpr auto msgTemplate = "template"; - inline constexpr auto templateText = "text"; - namespace thread - { - inline constexpr auto msgCount = "msgCount"; - inline constexpr auto snippet = "snippet"; - inline constexpr auto unreadMsgCount = "unreadMsgCount"; - - } // namespace thread - - } // namespace messages } // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp index 59721b329..1d77085ab 100644 --- a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp +++ b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp @@ -14,11 +14,11 @@ auto MessagesEndpoint::handle(Context &context) -> void case http::Method::get: helper->requestDataFromDB(context); break; - case http::Method::post: // update entry - helper->updateDBEntry(context); + case http::Method::post: + helper->createDBEntry(context); break; case http::Method::put: - helper->createDBEntry(context); + helper->updateDBEntry(context); break; case http::Method::del: helper->deleteDBEntry(context); diff --git a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp index bb2a220d1..6314bb34b 100644 --- a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp +++ b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp @@ -27,7 +27,7 @@ class MessagesEndpoint : public parserFSM::Endpoint std::shared_ptr helper; public: - MessagesEndpoint(sys::Service *_ownerServicePtr) : Endpoint(_ownerServicePtr) + explicit MessagesEndpoint(sys::Service *_ownerServicePtr) : Endpoint(_ownerServicePtr) { debugName = "MessagesEndpoint"; helper = std::make_shared(ownerServicePtr); diff --git a/module-services/service-desktop/parser/ParserUtils.cpp b/module-services/service-desktop/parser/ParserUtils.cpp index 7a6302f56..df59901fb 100644 --- a/module-services/service-desktop/parser/ParserUtils.cpp +++ b/module-services/service-desktop/parser/ParserUtils.cpp @@ -5,16 +5,18 @@ #include -using namespace parserFSM; - -bool http::isMethodValid(uint8_t method) +namespace parserFSM { - if (method == static_cast(http::Method::get) || method == static_cast(http::Method::post) || - method == static_cast(http::Method::put) || method == static_cast(http::Method::del)) { - return true; + + bool http::isMethodValid(uint8_t method) + { + if (method == static_cast(http::Method::get) || method == static_cast(http::Method::post) || + method == static_cast(http::Method::put) || method == static_cast(http::Method::del)) { + return true; + } + else { + LOG_ERROR("Invalid method!"); + return false; + } } - else { - LOG_ERROR("Invalid method!"); - return false; - } -} +} // namespace parserFSM diff --git a/module-services/service-desktop/parser/ParserUtils.hpp b/module-services/service-desktop/parser/ParserUtils.hpp index dd88784e9..fc580a362 100644 --- a/module-services/service-desktop/parser/ParserUtils.hpp +++ b/module-services/service-desktop/parser/ParserUtils.hpp @@ -45,7 +45,7 @@ namespace parserFSM msg.erase(msg.begin(), msg.begin() + size_header); } - inline unsigned long calcPayloadLength(const std::string header) + inline unsigned long calcPayloadLength(const std::string &header) { try { return std::stol(header.substr(1, std::string::npos)); @@ -67,10 +67,12 @@ namespace parserFSM } inline std::string extractPayload(std::string &msg, size_t payloadLength) { - if (msg.size() > payloadLength) + if (msg.size() > payloadLength) { return msg.substr(0, payloadLength); - else + } + else { return msg; + } } } // namespace message @@ -140,9 +142,9 @@ namespace parserFSM inline constexpr auto command = "command"; namespace commands { - inline constexpr auto upload = "upload"; - inline constexpr auto rm = "rm"; - inline constexpr auto download = "download"; + inline constexpr auto upload = "upload"; + inline constexpr auto rm = "rm"; + inline constexpr auto download = "download"; inline constexpr auto checkFile = "checkFile"; } // namespace commands } // namespace filesystem @@ -159,27 +161,35 @@ namespace parserFSM namespace messages { - inline constexpr auto id = "id"; - inline constexpr auto count = "count"; - inline constexpr auto offset = "offset"; - inline constexpr auto phoneNumber = "phoneNumber"; - inline constexpr auto messageBody = "messageBody"; - inline constexpr auto isUnread = "unread"; - inline constexpr auto contactID = "contactID"; - inline constexpr auto date = "date"; - inline constexpr auto dateSent = "dateSent"; - inline constexpr auto type = "type"; - inline constexpr auto threadID = "threadID"; - inline constexpr auto msgTemplate = "template"; - inline constexpr auto templateText = "text"; - namespace thread - { - inline constexpr auto msgCount = "msgCount"; - inline constexpr auto snippet = "snippet"; - inline constexpr auto unreadMsgCount = "unreadMsgCount"; - - } // namespace thread + inline constexpr auto count = "count"; + inline constexpr auto category = "category"; + inline constexpr auto categoryMessage = "message"; + inline constexpr auto categoryThread = "thread"; + inline constexpr auto categoryTemplate = "template"; + inline constexpr auto limit = "limit"; + inline constexpr auto offset = "offset"; + inline constexpr auto totalCount = "totalCount"; + inline constexpr auto nextPage = "nextPage"; + inline constexpr auto entries = "entries"; + inline constexpr auto messageBody = "messageBody"; + inline constexpr auto messageCount = "messageCount"; + inline constexpr auto messageID = "messageID"; + inline constexpr auto messageType = "messageType"; + inline constexpr auto phoneNumber = "phoneNumber"; + inline constexpr auto receivedAt = "receivedAt"; + inline constexpr auto sentAt = "sentAt"; + inline constexpr auto lastUsedAt = "lastUsedAt"; + inline constexpr auto lastUpdatedAt = "lastUpdatedAt"; + inline constexpr auto isUnread = "isUnread"; + inline constexpr auto contactID = "contactID"; + inline constexpr auto numberID = "numberID"; + inline constexpr auto threadID = "threadID"; + inline constexpr auto messageSnippet = "messageSnippet"; + inline constexpr auto unreadMessageCount = "unreadMessageCount"; + inline constexpr auto messageTemplate = "messageTemplate"; + inline constexpr auto templateBody = "templateBody"; + inline constexpr auto templateID = "templateID"; } // namespace messages } // namespace json diff --git a/module-services/service-desktop/tests/unittest.cpp b/module-services/service-desktop/tests/unittest.cpp index b4419a511..5c4b24fea 100644 --- a/module-services/service-desktop/tests/unittest.cpp +++ b/module-services/service-desktop/tests/unittest.cpp @@ -221,24 +221,24 @@ TEST_CASE("DB Helpers test - json encoding (messages)") message->ID = 10; message->type = SMSType::DRAFT; - auto messageJson = helper->to_json(*message); + auto messageJson = helper->toJson(*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::receivedAt] == 12345); + REQUIRE(messageJson[json::messages::sentAt] == 54321); REQUIRE(messageJson[json::messages::threadID] == 1); - REQUIRE(messageJson[json::messages::id] == 10); + REQUIRE(messageJson[json::messages::messageID] == 10); auto messageTemplate = std::make_unique(); messageTemplate->text = "test template"; messageTemplate->ID = 1; - auto messageTemplateJson = helper->to_json(*messageTemplate); + auto messageTemplateJson = helper->toJson(*messageTemplate); - REQUIRE(messageTemplateJson[json::messages::templateText] == "test template"); - REQUIRE(messageTemplateJson[json::messages::id] == 1); + REQUIRE(messageTemplateJson[json::messages::templateBody] == "test template"); + REQUIRE(messageTemplateJson[json::messages::templateID] == 1); } TEST_CASE("Context class test") diff --git a/test/pytest/service-desktop/test_messages.py b/test/pytest/service-desktop/test_messages.py index 781451c80..c7f93c9ee 100644 --- a/test/pytest/service-desktop/test_messages.py +++ b/test/pytest/service-desktop/test_messages.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. # For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md import pytest @@ -8,50 +8,51 @@ from harness.interface.defs import status @pytest.mark.service_desktop_test def test_messages(harness): # getting the messages count - body = {"count": True} + body = {"category": "message", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] if count == 0: - pytest.skip("No contacts entries, skipping") + pytest.skip("No messages entries, skipping") # getting all the messages - body = {"count": count} + body = {"category": "message", "limit": count, "offset": 0} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - messages = ret["body"] + messages = ret["body"][1][1] # getting entries messages_count = len(messages) assert messages_count == count + # getting a number of messages + number_of_requested_messages = 3 + body = {"category": "message", "limit": number_of_requested_messages, "offset": 0} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + messages = ret["body"][1][1] # getting entries + messages_count = len(messages) + assert messages_count == number_of_requested_messages + + # getting messages binded to threadID + thread_id = 1 + body = {"category": "message", "threadID": thread_id, "limit": 10, "offset": 0} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + for message in ret["body"][1][1]: + assert message["threadID"] == thread_id + # remove message sms_to_remove = messages[0] - body = {"id": sms_to_remove["id"]} + body = {"category": "message", "messageID": sms_to_remove["messageID"]} ret = harness.endpoint_request("messages", "del", body) assert ret["status"] == status["OK"] # getting the messages count again - body = {"count": True} + body = {"category": "message", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] assert ret["body"]["count"] == count - 1 - - # getting messages binded to contactID - contact_id = 2 # in test dataset this one has some messages - body = {"contactID": contact_id} - ret = harness.endpoint_request("messages", "get", body) - assert ret["status"] == status["OK"] - - for message in ret["body"]: - assert message["contactID"] == contact_id - - # getting messages binded to threadID - thread_id = 1 - body = {"threadID": thread_id, "count": 10} - ret = harness.endpoint_request("messages", "get", body) - assert ret["status"] == status["OK"] - - for message in ret["body"]: - assert message["threadID"] == thread_id diff --git a/test/pytest/service-desktop/test_templates.py b/test/pytest/service-desktop/test_templates.py index ef29883a4..a388bc3c4 100644 --- a/test/pytest/service-desktop/test_templates.py +++ b/test/pytest/service-desktop/test_templates.py @@ -1,62 +1,78 @@ -# Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. # For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md import pytest from harness.interface.defs import status @pytest.mark.service_desktop_test -def test_messages(harness): +def test_templates(harness): # getting the templates count - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] if count == 0: - body = {"template": True, "text": "first template"} - ret = harness.endpoint_request("messages", "put", body) + body = {"category": "template", "templateBody": "first template"} + ret = harness.endpoint_request("messages", "post", body) assert ret["status"] == status["OK"] - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] assert count # getting all templates - body = {"template": True, "count": count} + body = {"category": "template", "limit": count} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + assert len(ret["body"][1][1]) == count + + # getting a number of templates + number_of_requested_templates = 3 + body = {"category": "template", "limit": number_of_requested_templates, "offset": 0} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + templates = ret["body"][1][1] # getting entries + templates_count = len(templates) + assert templates_count == number_of_requested_templates + + # getting template by ID + body = {"category": "template", "templateID": 1} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - assert len(ret["body"]) == count # adding new template - body = {"template": True, "text": "test template"} - ret = harness.endpoint_request("messages", "put", body) + body = {"category": "template", "templateBody": "test template"} + ret = harness.endpoint_request("messages", "post", body) assert ret["status"] == status["OK"] # getting the templates count again - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] assert ret["body"]["count"] == count + 1 # getting template to remove - body = {"template": True, "count": count + 1} + body = {"category": "template", "limit": count + 1} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - for template in ret["body"]: - if template["text"] == "test template": - id = template["id"] + templateid = 0 + for template in ret["body"][1][1]: + if template["templateBody"] == "test template": + templateid = template["templateID"] break # removing template - body = {"template": True, "id": id} + body = {"category": "template", "templateID": templateid} ret = harness.endpoint_request("messages", "del", body) assert ret["status"] == status["OK"] # getting the templates count again - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] assert ret["body"]["count"] == count diff --git a/test/pytest/service-desktop/test_threads.py b/test/pytest/service-desktop/test_threads.py new file mode 100644 index 000000000..ebe44364e --- /dev/null +++ b/test/pytest/service-desktop/test_threads.py @@ -0,0 +1,27 @@ +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md +import pytest +from harness.interface.defs import status + + +@pytest.mark.service_desktop_test +def test_threads(harness): + # getting all threads + body = {"category": "thread"} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + # getting a number of threads + number_of_requested_threads = 3 + body = {"category": "thread", "limit": number_of_requested_threads, "offset": 0} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + threads = ret["body"][1][1] # getting entries + threads_count = len(threads) + assert threads_count == number_of_requested_threads + + # set thread as read + body = {"category": "thread", "threadID": 1, "isUnread": False} + ret = harness.endpoint_request("messages", "put", body) + assert ret["status"] == status["OK"] diff --git a/test/pytest/test_search_sms.py b/test/pytest/test_search_sms.py index f21a05536..c3c4256a4 100644 --- a/test/pytest/test_search_sms.py +++ b/test/pytest/test_search_sms.py @@ -5,9 +5,10 @@ import pytest from harness.interface.defs import key_codes + @pytest.mark.rt1051 @pytest.mark.usefixtures("phone_unlocked") def test_search_sms(harness, sms_text, phone_number): - body = {"messageBody": sms_text, "phoneNumber": str(phone_number)} + body = {"category": "message", "messageBody": sms_text, "phoneNumber": str(phone_number)} messages = harness.endpoint_request("messages", "get", body)["body"] assert len(messages) != 0 diff --git a/test/pytest/test_send_message.py b/test/pytest/test_send_message.py index 117b3c1e2..a90734070 100644 --- a/test/pytest/test_send_message.py +++ b/test/pytest/test_send_message.py @@ -9,27 +9,27 @@ from harness.interface.CDCSerial import Keytype def erase_all_templates(harness): # getting the templates count - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] # getting all templates - body = {"template": True, "count": count} + body = {"category": "template", "limit": count} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - assert len(ret["body"]) == count + assert len(ret["body"][1][1]) == count - for template in ret["body"]: - body = {"template": True, "id": template["id"]} + for template in ret["body"][1][1]: + body = {"category": "template", "templateID": template["templateID"]} del_res = harness.endpoint_request("messages", "del", body) assert del_res["status"] == status["OK"] def add_new_template(harness, template_text: str): # adding new template - body = {"template": True, "text": template_text} - ret = harness.endpoint_request("messages", "put", body) + body = {"category": "template", "templateBody": template_text} + ret = harness.endpoint_request("messages", "post", body) assert ret["status"] == status["OK"] @@ -72,19 +72,19 @@ def erase_contacts_by_name(harness, name): def get_message_by_text(harness, message: str, phone_number: str): - body = {"messageBody": message, "phoneNumber": phone_number} + body = {"category": "message", "messageBody": message, "phoneNumber": phone_number} return harness.endpoint_request("messages", "get", body)["body"] # default sms type is draft def prepare_sms(harness, message: str, phone_number: str, sms_type: int = 1): body = {"smsCommand": "smsAdd", "messageBody": message, "phoneNumber": phone_number, "type": sms_type} - return harness.endpoint_request("developerMode", "put", body) + return harness.endpoint_request("developerMode", "post", body) def prepare_sms_template(harness, message: str, phone_number: str): body = {"template": True, "messageBody": message, "phoneNumber": phone_number} - return harness.endpoint_request("developerMode", "put", body) + return harness.endpoint_request("developerMode", "post", body) def compare_messages(old_messages, new_messages, sms_type: SMSType = SMSType.OUTBOX): diff --git a/test/search_sms.py b/test/search_sms.py index bdad6f11f..22784462d 100644 --- a/test/search_sms.py +++ b/test/search_sms.py @@ -14,7 +14,7 @@ from harness.interface.error import TestError, Error def search_sms(harness, message: str, phone_number: str): @harness.with_phone_unlocked def do_it(connection): - body = {"messageBody": message, "phoneNumber": phone_number} + body = {"category": "message", "messageBody": message, "phoneNumber": phone_number} messages = harness.endpoint_request("messages", "get", body)["body"] print(f'Found {len(messages)} messages') @@ -49,4 +49,3 @@ if __name__ == "__main__": except TestError as err: log.error(err) exit(err.get_error_code()) -