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()) -