diff --git a/services/backup/src/BackupServiceImpl.h b/services/backup/src/BackupServiceImpl.h --- a/services/backup/src/BackupServiceImpl.h +++ b/services/backup/src/BackupServiceImpl.h @@ -31,6 +31,11 @@ grpc::ServerWriteReactor *PullBackup( grpc::CallbackServerContext *context, const backup::PullBackupRequest *request) override; + + grpc::ServerUnaryReactor *AddAttachments( + grpc::CallbackServerContext *context, + const backup::AddAttachmentsRequest *request, + google::protobuf::Empty *response) override; }; } // namespace network diff --git a/services/backup/src/BackupServiceImpl.cpp b/services/backup/src/BackupServiceImpl.cpp --- a/services/backup/src/BackupServiceImpl.cpp +++ b/services/backup/src/BackupServiceImpl.cpp @@ -1,6 +1,7 @@ #include "BackupServiceImpl.h" #include "CreateNewBackupReactor.h" +#include "DatabaseManager.h" #include "PullBackupReactor.h" #include "RecoverBackupKeyReactor.h" #include "SendLogReactor.h" @@ -47,5 +48,48 @@ return reactor; } +grpc::ServerUnaryReactor *BackupServiceImpl::AddAttachments( + grpc::CallbackServerContext *context, + const backup::AddAttachmentsRequest *request, + google::protobuf::Empty *response) { + grpc::Status status = grpc::Status::OK; + std::string userID = request->userid(); + std::string backupID = request->backupid(); + std::string logID = request->logid(); + const std::string holders = request->holders(); + try { + if (userID.empty()) { + throw std::runtime_error("user id required but not provided"); + } + if (backupID.empty()) { + throw std::runtime_error("backup id required but not provided"); + } + if (holders.empty()) { + throw std::runtime_error("holders required but not provided"); + } + + if (logID.empty()) { + // add these attachments to backup + std::shared_ptr backupItem = + database::DatabaseManager::getInstance().findBackupItem( + userID, backupID); + backupItem->addAttachmentHolders(holders); + database::DatabaseManager::getInstance().putBackupItem(*backupItem); + } else { + // add these attachments to log + std::shared_ptr logItem = + database::DatabaseManager::getInstance().findLogItem(backupID, logID); + logItem->addAttachmentHolders(holders); + database::DatabaseManager::getInstance().putLogItem(*logItem); + } + } catch (std::runtime_error &e) { + std::cout << "error: " << e.what() << std::endl; + status = grpc::Status(grpc::StatusCode::INTERNAL, e.what()); + } + auto *reactor = context->DefaultReactor(); + reactor->Finish(status); + return reactor; +} + } // namespace network } // namespace comm