// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. // For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md #include "MessageHelper.hpp" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace parserFSM; auto MessageHelper::to_json(SMSRecord record) -> json11::Json { 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 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)); } 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 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)); } else if (context.getBody()[json::messages::contactID].int_value() != 0) { auto query = std::make_unique(context.getBody()[json::messages::contactID].int_value()); 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)); } else if (context.getBody()[json::messages::threadID].int_value() != 0) { auto query = std::make_unique(context.getBody()[json::messages::threadID].int_value()); 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)); } 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 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)); } else // get messages { auto query = std::make_unique(context.getBody()[json::messages::count].int_value(), context.getBody()[json::messages::offset].int_value()); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { if (auto SMSResult = 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)}}); 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::id].int_value() != 0) { // templates search auto query = std::make_unique(context.getBody()[json::messages::id].int_value()); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { if (auto SMSTemplateResult = dynamic_cast(result)) { context.setResponseBody(MessageHelper::to_json(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::count].int_value()); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { if (auto SMSTemplateResult = dynamic_cast(result)) { json11::Json::array SMSTemplateArray; for (auto record : SMSTemplateResult->getResults()) { SMSTemplateArray.emplace_back(to_json(record)); } context.setResponseBody(SMSTemplateArray); 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::createDBEntry(Context &context) -> sys::ReturnCodes { if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { return createTemplate(context); } else { return createSMS(context); } } 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; }