diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h --- a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h +++ b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.h @@ -2,6 +2,7 @@ #include "DeviceSessionItem.h" #include "Item.h" +#include "MessageItem.h" #include "PublicKeyItem.h" #include "SessionSignItem.h" @@ -23,6 +24,8 @@ template <> std::shared_ptr createItemByType(); +template <> std::shared_ptr createItemByType(); + } // namespace database } // namespace network } // namespace comm diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp --- a/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp +++ b/services/tunnelbroker/docker-server/contents/server/src/Database/DatabaseEntitiesTools.cpp @@ -18,6 +18,10 @@ return std::make_shared(); } +template <> std::shared_ptr createItemByType() { + return std::make_shared(); +} + } // namespace database } // namespace network } // namespace comm diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.h b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.h new file mode 100644 --- /dev/null +++ b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.h @@ -0,0 +1,53 @@ +#pragma once + +#include "Item.h" + +#include + +namespace comm { +namespace network { +namespace database { + +class MessageItem : public Item { + std::string messageID; + std::string fromDeviceID; + std::string toDeviceID; + std::string payload; + std::string blobHashes; + uint64_t expire; + + void validate() const override; + +public: + static const std::string FIELD_MESSAGE_ID; + static const std::string FIELD_FROM_DEVICE_ID; + static const std::string FIELD_TO_DEVICE_ID; + static const std::string FIELD_PAYLOAD; + static const std::string FIELD_BLOB_HASHES; + static const std::string FIELD_EXPIRE; + + std::string getPrimaryKey() const override; + std::string getTableName() const override; + std::string getMessageID() const; + std::string getFromDeviceID() const; + std::string getToDeviceID() const; + std::string getPayload() const; + std::string getBlobHashes() const; + uint64_t getExpire() const; + + MessageItem() { + } + MessageItem( + const std::string messageID, + const std::string fromDeviceID, + const std::string toDeviceID, + const std::string payload, + const std::string blobHashes, + const uint64_t expire); + MessageItem(const AttributeValues &itemFromDB); + void assignItemFromDatabase(const AttributeValues &itemFromDB) override; +}; + +} // namespace database +} // namespace network +} // namespace comm diff --git a/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.cpp b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.cpp new file mode 100644 --- /dev/null +++ b/services/tunnelbroker/docker-server/contents/server/src/Database/MessageItem.cpp @@ -0,0 +1,101 @@ +#include "MessageItem.h" +#include "ConfigManager.h" + +namespace comm { +namespace network { +namespace database { + +const std::string MessageItem::FIELD_MESSAGE_ID = "MessageID"; +const std::string MessageItem::FIELD_FROM_DEVICE_ID = "FromDeviceID"; +const std::string MessageItem::FIELD_TO_DEVICE_ID = "ToDeviceID"; +const std::string MessageItem::FIELD_PAYLOAD = "Payload"; +const std::string MessageItem::FIELD_BLOB_HASHES = "BlobHashes"; +const std::string MessageItem::FIELD_EXPIRE = "Expire"; + +MessageItem::MessageItem( + const std::string messageID, + const std::string fromDeviceID, + const std::string toDeviceID, + const std::string payload, + const std::string blobHashes, + const uint64_t expire) + : messageID(messageID), + fromDeviceID(fromDeviceID), + toDeviceID(toDeviceID), + payload(payload), + blobHashes(blobHashes), + expire(expire) { + this->validate(); +} + +MessageItem::MessageItem(const AttributeValues &itemFromDB) { + this->assignItemFromDatabase(itemFromDB); +} + +void MessageItem::validate() const { + if (!this->messageID.size()) { + throw std::runtime_error("Error: messageID is empty"); + } + if (!this->fromDeviceID.size()) { + throw std::runtime_error("Error: fromDeviceID is empty"); + } + if (!this->toDeviceID.size()) { + throw std::runtime_error("Error: toDeviceID is empty"); + } + if (!this->expire == 0) { + throw std::runtime_error("Error: expire field not provided"); + } +} + +void MessageItem::assignItemFromDatabase(const AttributeValues &itemFromDB) { + try { + this->messageID = itemFromDB.at(MessageItem::FIELD_MESSAGE_ID).GetS(); + this->fromDeviceID = + itemFromDB.at(MessageItem::FIELD_FROM_DEVICE_ID).GetS(); + this->toDeviceID = itemFromDB.at(MessageItem::FIELD_TO_DEVICE_ID).GetS(); + this->payload = itemFromDB.at(MessageItem::FIELD_PAYLOAD).GetS(); + this->blobHashes = itemFromDB.at(MessageItem::FIELD_BLOB_HASHES).GetS(); + this->expire = std::stoull(itemFromDB.at(MessageItem::FIELD_EXPIRE).GetN()); + } catch (const std::exception &e) { + throw std::runtime_error( + "Got an exception at MessageItem: " + std::string(e.what())); + } + this->validate(); +} + +std::string MessageItem::getTableName() const { + return config::ConfigManager::getInstance().getParameter( + config::ConfigManager::OPTION_DYNAMODB_MESSAGES_TABLE); +} + +std::string MessageItem::getPrimaryKey() const { + return MessageItem::FIELD_MESSAGE_ID; +} + +std::string MessageItem::getMessageID() const { + return this->messageID; +} + +std::string MessageItem::getFromDeviceID() const { + return this->fromDeviceID; +} + +std::string MessageItem::getToDeviceID() const { + return this->toDeviceID; +} + +std::string MessageItem::getPayload() const { + return this->payload; +} + +std::string MessageItem::getBlobHashes() const { + return this->blobHashes; +} + +uint64_t MessageItem::getExpire() const { + return this->expire; +} + +} // namespace database +} // namespace network +} // namespace comm