credential_client.cpp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  1. #include "credential_client.hpp"
  2. #include "logging/logger.hpp"
  3. namespace smartbotic::credentials {
  4. using namespace common;
  5. CredentialClient::CredentialClient(const CredentialClientConfig& config)
  6. : config_(config) {
  7. channel_ = grpc::CreateChannel(config_.address, grpc::InsecureChannelCredentials());
  8. stub_ = proto::CredentialService::NewStub(channel_);
  9. LOG_INFO("CredentialClient initialized with address: {}", config_.address);
  10. }
  11. Result<HttpAuth> CredentialClient::getHttpAuth(const std::string& credential_id,
  12. const std::string& workflow_id) {
  13. proto::GetCredentialAuthRequest request;
  14. request.set_credential_id(credential_id);
  15. request.set_workflow_id(workflow_id);
  16. proto::GetCredentialAuthResponse response;
  17. grpc::ClientContext context;
  18. // Set timeout
  19. auto deadline = std::chrono::system_clock::now() +
  20. std::chrono::milliseconds(config_.timeout_ms);
  21. context.set_deadline(deadline);
  22. grpc::Status status = stub_->GetCredentialAuth(&context, request, &response);
  23. if (!status.ok()) {
  24. return Error(ErrorCode::Unavailable,
  25. "Credential service error: " + status.error_message());
  26. }
  27. if (!response.success()) {
  28. return Error(ErrorCode::NotFound, response.error());
  29. }
  30. HttpAuth auth;
  31. auth.header_name = response.header_name();
  32. auth.header_value = response.header_value();
  33. return auth;
  34. }
  35. Result<ImapData> CredentialClient::getImapCredentials(const std::string& credential_id,
  36. const std::string& workflow_id) {
  37. proto::GetImapCredentialsRequest request;
  38. request.set_credential_id(credential_id);
  39. request.set_workflow_id(workflow_id);
  40. proto::GetImapCredentialsResponse response;
  41. grpc::ClientContext context;
  42. // Set timeout
  43. auto deadline = std::chrono::system_clock::now() +
  44. std::chrono::milliseconds(config_.timeout_ms);
  45. context.set_deadline(deadline);
  46. grpc::Status status = stub_->GetImapCredentials(&context, request, &response);
  47. if (!status.ok()) {
  48. return Error(ErrorCode::Unavailable,
  49. "Credential service error: " + status.error_message());
  50. }
  51. if (!response.success()) {
  52. return Error(ErrorCode::NotFound, response.error());
  53. }
  54. ImapData data;
  55. data.host = response.host();
  56. data.port = response.port();
  57. data.username = response.username();
  58. data.password = response.password();
  59. data.use_ssl = response.use_ssl();
  60. return data;
  61. }
  62. Result<MysqlData> CredentialClient::getMysqlCredentials(const std::string& credential_id,
  63. const std::string& workflow_id) {
  64. proto::GetMysqlCredentialsRequest request;
  65. request.set_credential_id(credential_id);
  66. request.set_workflow_id(workflow_id);
  67. proto::GetMysqlCredentialsResponse response;
  68. grpc::ClientContext context;
  69. // Set timeout
  70. auto deadline = std::chrono::system_clock::now() +
  71. std::chrono::milliseconds(config_.timeout_ms);
  72. context.set_deadline(deadline);
  73. grpc::Status status = stub_->GetMysqlCredentials(&context, request, &response);
  74. if (!status.ok()) {
  75. return Error(ErrorCode::Unavailable,
  76. "Credential service error: " + status.error_message());
  77. }
  78. if (!response.success()) {
  79. return Error(ErrorCode::NotFound, response.error());
  80. }
  81. MysqlData data;
  82. data.host = response.host();
  83. data.port = response.port();
  84. data.username = response.username();
  85. data.password = response.password();
  86. data.database = response.database();
  87. data.use_ssl = response.use_ssl();
  88. return data;
  89. }
  90. Result<PostgresqlData> CredentialClient::getPostgresqlCredentials(const std::string& credential_id,
  91. const std::string& workflow_id) {
  92. proto::GetPostgresqlCredentialsRequest request;
  93. request.set_credential_id(credential_id);
  94. request.set_workflow_id(workflow_id);
  95. proto::GetPostgresqlCredentialsResponse response;
  96. grpc::ClientContext context;
  97. // Set timeout
  98. auto deadline = std::chrono::system_clock::now() +
  99. std::chrono::milliseconds(config_.timeout_ms);
  100. context.set_deadline(deadline);
  101. grpc::Status status = stub_->GetPostgresqlCredentials(&context, request, &response);
  102. if (!status.ok()) {
  103. return Error(ErrorCode::Unavailable,
  104. "Credential service error: " + status.error_message());
  105. }
  106. if (!response.success()) {
  107. return Error(ErrorCode::NotFound, response.error());
  108. }
  109. PostgresqlData data;
  110. data.host = response.host();
  111. data.port = response.port();
  112. data.username = response.username();
  113. data.password = response.password();
  114. data.database = response.database();
  115. data.use_ssl = response.use_ssl();
  116. return data;
  117. }
  118. Result<std::vector<CredentialInfo>> CredentialClient::listCredentials(const std::string& workflow_id) {
  119. proto::ListCredentialsRequest request;
  120. request.set_workflow_id(workflow_id);
  121. proto::ListCredentialsResponse response;
  122. grpc::ClientContext context;
  123. auto deadline = std::chrono::system_clock::now() +
  124. std::chrono::milliseconds(config_.timeout_ms);
  125. context.set_deadline(deadline);
  126. grpc::Status status = stub_->ListCredentials(&context, request, &response);
  127. if (!status.ok()) {
  128. return Error(ErrorCode::Unavailable,
  129. "Credential service error: " + status.error_message());
  130. }
  131. std::vector<CredentialInfo> credentials;
  132. for (const auto& cred : response.credentials()) {
  133. CredentialInfo info;
  134. info.id = cred.id();
  135. info.name = cred.name();
  136. info.type = credentialTypeFromString(cred.type());
  137. info.description = cred.description();
  138. credentials.push_back(info);
  139. }
  140. return credentials;
  141. }
  142. bool CredentialClient::isConnected() const {
  143. if (!channel_) return false;
  144. auto state = channel_->GetState(false);
  145. return state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_IDLE;
  146. }
  147. } // namespace smartbotic::credentials