credential_client.cpp 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229
  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<SmtpData> CredentialClient::getSmtpCredentials(const std::string& credential_id,
  63. const std::string& workflow_id) {
  64. proto::GetSmtpCredentialsRequest request;
  65. request.set_credential_id(credential_id);
  66. request.set_workflow_id(workflow_id);
  67. proto::GetSmtpCredentialsResponse response;
  68. grpc::ClientContext context;
  69. auto deadline = std::chrono::system_clock::now() +
  70. std::chrono::milliseconds(config_.timeout_ms);
  71. context.set_deadline(deadline);
  72. grpc::Status status = stub_->GetSmtpCredentials(&context, request, &response);
  73. if (!status.ok()) {
  74. return Error(ErrorCode::Unavailable,
  75. "Credential service error: " + status.error_message());
  76. }
  77. if (!response.success()) {
  78. return Error(ErrorCode::NotFound, response.error());
  79. }
  80. SmtpData data;
  81. data.host = response.host();
  82. data.port = response.port();
  83. data.username = response.username();
  84. data.password = response.password();
  85. data.security = response.security();
  86. data.from_address = response.from_address();
  87. data.from_name = response.from_name();
  88. return data;
  89. }
  90. Result<MysqlData> CredentialClient::getMysqlCredentials(const std::string& credential_id,
  91. const std::string& workflow_id) {
  92. proto::GetMysqlCredentialsRequest request;
  93. request.set_credential_id(credential_id);
  94. request.set_workflow_id(workflow_id);
  95. proto::GetMysqlCredentialsResponse 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_->GetMysqlCredentials(&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. MysqlData 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<PostgresqlData> CredentialClient::getPostgresqlCredentials(const std::string& credential_id,
  119. const std::string& workflow_id) {
  120. proto::GetPostgresqlCredentialsRequest request;
  121. request.set_credential_id(credential_id);
  122. request.set_workflow_id(workflow_id);
  123. proto::GetPostgresqlCredentialsResponse response;
  124. grpc::ClientContext context;
  125. // Set timeout
  126. auto deadline = std::chrono::system_clock::now() +
  127. std::chrono::milliseconds(config_.timeout_ms);
  128. context.set_deadline(deadline);
  129. grpc::Status status = stub_->GetPostgresqlCredentials(&context, request, &response);
  130. if (!status.ok()) {
  131. return Error(ErrorCode::Unavailable,
  132. "Credential service error: " + status.error_message());
  133. }
  134. if (!response.success()) {
  135. return Error(ErrorCode::NotFound, response.error());
  136. }
  137. PostgresqlData data;
  138. data.host = response.host();
  139. data.port = response.port();
  140. data.username = response.username();
  141. data.password = response.password();
  142. data.database = response.database();
  143. data.use_ssl = response.use_ssl();
  144. return data;
  145. }
  146. Result<std::vector<CredentialInfo>> CredentialClient::listCredentials(const std::string& workflow_id) {
  147. proto::ListCredentialsRequest request;
  148. request.set_workflow_id(workflow_id);
  149. proto::ListCredentialsResponse response;
  150. grpc::ClientContext context;
  151. auto deadline = std::chrono::system_clock::now() +
  152. std::chrono::milliseconds(config_.timeout_ms);
  153. context.set_deadline(deadline);
  154. grpc::Status status = stub_->ListCredentials(&context, request, &response);
  155. if (!status.ok()) {
  156. return Error(ErrorCode::Unavailable,
  157. "Credential service error: " + status.error_message());
  158. }
  159. std::vector<CredentialInfo> credentials;
  160. for (const auto& cred : response.credentials()) {
  161. CredentialInfo info;
  162. info.id = cred.id();
  163. info.name = cred.name();
  164. info.type = credentialTypeFromString(cred.type());
  165. info.description = cred.description();
  166. credentials.push_back(info);
  167. }
  168. return credentials;
  169. }
  170. bool CredentialClient::isConnected() const {
  171. if (!channel_) return false;
  172. auto state = channel_->GetState(false);
  173. return state == GRPC_CHANNEL_READY || state == GRPC_CHANNEL_IDLE;
  174. }
  175. } // namespace smartbotic::credentials