diff --git a/services/tunnelbroker/src/cxx_bridge.rs b/services/tunnelbroker/src/cxx_bridge.rs --- a/services/tunnelbroker/src/cxx_bridge.rs +++ b/services/tunnelbroker/src/cxx_bridge.rs @@ -36,5 +36,8 @@ notifyToken: &str, ) -> NewSessionResult; pub fn getSessionItem(sessionID: &str) -> Result; + pub fn getSessionItemsByDeviceID( + deviceID: &str, + ) -> Result>; } } diff --git a/services/tunnelbroker/src/libcpp/Tunnelbroker.h b/services/tunnelbroker/src/libcpp/Tunnelbroker.h --- a/services/tunnelbroker/src/libcpp/Tunnelbroker.h +++ b/services/tunnelbroker/src/libcpp/Tunnelbroker.h @@ -14,3 +14,4 @@ rust::Str deviceOS, rust::Str notifyToken); SessionItem getSessionItem(rust::Str sessionID); +rust::Vec getSessionItemsByDeviceID(rust::Str deviceID); diff --git a/services/tunnelbroker/src/libcpp/Tunnelbroker.cpp b/services/tunnelbroker/src/libcpp/Tunnelbroker.cpp --- a/services/tunnelbroker/src/libcpp/Tunnelbroker.cpp +++ b/services/tunnelbroker/src/libcpp/Tunnelbroker.cpp @@ -156,3 +156,21 @@ .deviceOS = sessionItem->getDeviceOs(), .isOnline = sessionItem->getIsOnline()}; } + +rust::Vec getSessionItemsByDeviceID(rust::Str deviceID) { + std::vector> + sessionItems = comm::network::database::DatabaseManager::getInstance() + .findSessionItemsByDeviceID(std::string{deviceID}); + rust::Vec result; + for (auto &sessionItem : sessionItems) { + result.push_back(SessionItem{ + .deviceID = sessionItem->getDeviceID(), + .publicKey = sessionItem->getPubKey(), + .notifyToken = sessionItem->getNotifyToken(), + .deviceType = static_cast(sessionItem->getDeviceType()), + .appVersion = sessionItem->getAppVersion(), + .deviceOS = sessionItem->getDeviceOs(), + .isOnline = sessionItem->getIsOnline()}); + } + return result; +} diff --git a/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.h b/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.h --- a/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.h +++ b/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.h @@ -41,6 +41,8 @@ void putSessionItem(const DeviceSessionItem &item); std::shared_ptr findSessionItem(const std::string &deviceID); + std::vector> + findSessionItemsByDeviceID(const std::string &deviceID); void removeSessionItem(const std::string &sessionID); void updateSessionItemIsOnline(const std::string &sessionID, bool isOnline); bool updateSessionItemDeviceToken( diff --git a/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.cpp b/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.cpp --- a/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.cpp +++ b/services/tunnelbroker/src/libcpp/src/Database/DatabaseManager.cpp @@ -62,6 +62,33 @@ this->innerPutItem(std::make_shared(item), request); } +std::vector> +DatabaseManager::findSessionItemsByDeviceID(const std::string &deviceID) { + std::vector> result; + Aws::DynamoDB::Model::QueryRequest req; + + req.SetTableName(DeviceSessionItem().getTableName()); + req.SetKeyConditionExpression( + DeviceSessionItem::FIELD_DEVICE_ID + " = :valueToMatch"); + + AttributeValues attributeValues; + attributeValues.emplace(":valueToMatch", deviceID); + + req.SetExpressionAttributeValues(attributeValues); + req.SetIndexName(DeviceSessionItem::INDEX_DEVICE_ID); + + const Aws::DynamoDB::Model::QueryOutcome &outcome = + getDynamoDBClient()->Query(req); + if (!outcome.IsSuccess()) { + throw std::runtime_error(outcome.GetError().GetMessage()); + } + const Aws::Vector &items = outcome.GetResult().GetItems(); + for (auto &item : items) { + result.push_back(std::make_shared(item)); + } + return result; +} + std::shared_ptr DatabaseManager::findSessionItem(const std::string &sessionID) { Aws::DynamoDB::Model::GetItemRequest request; diff --git a/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.h b/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.h --- a/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.h +++ b/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.h @@ -32,6 +32,7 @@ static const std::string FIELD_CHECKPOINT_TIME; static const std::string FIELD_EXPIRE; static const std::string FIELD_IS_ONLINE; + static const std::string INDEX_DEVICE_ID; PrimaryKeyDescriptor getPrimaryKeyDescriptor() const override; PrimaryKeyValue getPrimaryKeyValue() const override; diff --git a/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.cpp b/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.cpp --- a/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.cpp +++ b/services/tunnelbroker/src/libcpp/src/Database/DeviceSessionItem.cpp @@ -18,6 +18,7 @@ const std::string DeviceSessionItem::FIELD_CHECKPOINT_TIME = "CheckpointTime"; const std::string DeviceSessionItem::FIELD_EXPIRE = "Expire"; const std::string DeviceSessionItem::FIELD_IS_ONLINE = "IsOnline"; +const std::string DeviceSessionItem::INDEX_DEVICE_ID = "DeviceID-index"; DeviceSessionItem::DeviceSessionItem( const std::string sessionID,