From e648302ff513d2f60421a8731cacc45ac3fab626 Mon Sep 17 00:00:00 2001 From: Miguel Branco Date: Wed, 17 Jan 2024 14:42:04 +0100 Subject: [PATCH] Adding Salesforce credential. (#330) --- hard-rebuild.sh | 4 ++ .../scala/raw/creds/api/Credentials.scala | 11 ++++ .../raw/creds/api/CredentialsService.scala | 17 +++++++ .../raw/creds/client/ClientCredentials.scala | 51 +++++++++++++++++++ .../client/ClientCredentialsService.scala | 38 +++++++++++++- .../creds/local/LocalCredentialsService.scala | 21 ++++++++ .../creds/protocol/ProtocolCredentials.scala | 10 ++++ 7 files changed, 151 insertions(+), 1 deletion(-) diff --git a/hard-rebuild.sh b/hard-rebuild.sh index e12e3cf77..c6641a968 100755 --- a/hard-rebuild.sh +++ b/hard-rebuild.sh @@ -14,6 +14,10 @@ cd ../sql-client rm -rf target/ sbt clean publishLocal +cd ../snapi-parser +rm -rf target/ +sbt clean publishLocal + cd ../snapi-frontend rm -rf target/ sbt clean publishLocal diff --git a/snapi-frontend/src/main/scala/raw/creds/api/Credentials.scala b/snapi-frontend/src/main/scala/raw/creds/api/Credentials.scala index cfc6909d3..95566fa3b 100644 --- a/snapi-frontend/src/main/scala/raw/creds/api/Credentials.scala +++ b/snapi-frontend/src/main/scala/raw/creds/api/Credentials.scala @@ -146,6 +146,17 @@ final case class SnowflakeCredential( val port = None } +final case class SalesforceCredential( + url: String, + username: String, + password: String, + securityToken: String, + clientId: String, + apiVersion: String, + customObjects: Seq[String], + options: Map[String, String] +) extends Credential + final case class Secret(name: String, value: String) extends Credential // Http credentials diff --git a/snapi-frontend/src/main/scala/raw/creds/api/CredentialsService.scala b/snapi-frontend/src/main/scala/raw/creds/api/CredentialsService.scala index 4e3d6ed3a..19821356e 100644 --- a/snapi-frontend/src/main/scala/raw/creds/api/CredentialsService.scala +++ b/snapi-frontend/src/main/scala/raw/creds/api/CredentialsService.scala @@ -100,6 +100,23 @@ trait CredentialsService extends RawService { def unregisterDropboxToken(user: AuthenticatedUser): Boolean + /** Salesforce */ + + def registerSalesforceCredential( + user: AuthenticatedUser, + name: String, + salesforceCredential: SalesforceCredential + ): Boolean + + def getSalesforceCredential(user: AuthenticatedUser, name: String): Option[SalesforceCredential] + + def existsSalesforceCredential(user: AuthenticatedUser, name: String): Boolean = + getSalesforceCredential(user, name).isDefined + + def listSalesforceCredentials(user: AuthenticatedUser): List[String] + + def unregisterSalesforceCredential(user: AuthenticatedUser, name: String): Boolean + /** Http Credentials */ protected def validateNewHttpCredentialName(name: String) = { diff --git a/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentials.scala b/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentials.scala index e8b681742..28c2b2ab7 100644 --- a/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentials.scala +++ b/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentials.scala @@ -107,6 +107,57 @@ class ClientCredentials(serverAddress: URI)(implicit settings: RawSettings) exte } } + /** Salesforce */ + + def registerSalesforceCredential( + user: AuthenticatedUser, + name: String, + salesforceCredential: SalesforceCredential + ): Boolean = { + try { + restClient.doJsonPostWithEmptyResponse( + "2/salesforce/register", + RegisterSalesforceCredential(user, name, salesforceCredential), + withAuth = false + ) + true + } catch { + case ex: ClientAPIException if ex.errorCode == "salesforceCredentialAlreadyExists" => false + } + } + + def getSalesforceCredential(user: AuthenticatedUser, name: String): Option[SalesforceCredential] = { + try { + Some( + restClient + .doJsonPost[SalesforceCredential]("2/salesforce/get", GetSalesforceCredential(user, name), withAuth = false) + ) + } catch { + case ex: ClientAPIException if ex.errorCode == "salesforceCredentialNotFound" => None + } + } + + def existsSalesforceCredential(user: AuthenticatedUser, name: String): Boolean = + getSalesforceCredential(user, name).isDefined + + def listSalesforceCredentials(user: AuthenticatedUser): List[String] = { + restClient.doJsonPost[List[String]]("2/salesforce/list", ListSalesforceCredentials(user), withAuth = false) + } + + def unregisterSalesforceCredential(user: AuthenticatedUser, name: String): Boolean = { + try { + restClient.doJsonPostWithEmptyResponse( + "2/salesforce/unregister", + UnregisterSalesforceCredential(user, name), + HttpStatus.SC_NO_CONTENT, + withAuth = false + ) + true + } catch { + case ex: ClientAPIException if ex.errorCode == "salesforceCredentialNotFound" => false + } + } + /** HTTP Credentials */ def listHttpCredentials(user: AuthenticatedUser): List[HttpCredentialId] = { diff --git a/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentialsService.scala b/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentialsService.scala index 0689259c3..a85264660 100644 --- a/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentialsService.scala +++ b/snapi-frontend/src/main/scala/raw/creds/client/ClientCredentialsService.scala @@ -85,7 +85,43 @@ class ClientCredentialsService(implicit settings: RawSettings) extends Credentia } } - /** Named Dropbox Tokens * */ + /** Salesforce */ + + override def registerSalesforceCredential( + user: AuthenticatedUser, + name: String, + salesforceCredential: SalesforceCredential + ): Boolean = { + try { + client.registerSalesforceCredential(user, name, salesforceCredential) + } catch { + case ex: APIException => throw new ClientCredentialsException(ex.getMessage, ex) + } + } + + override def getSalesforceCredential(user: AuthenticatedUser, name: String): Option[SalesforceCredential] = { + try { + client.getSalesforceCredential(user, name) + } catch { + case ex: APIException => throw new ClientCredentialsException(ex.getMessage, ex) + } + } + + override def listSalesforceCredentials(user: AuthenticatedUser): List[String] = { + try { + client.listSalesforceCredentials(user) + } catch { + case ex: APIException => throw new ClientCredentialsException(ex.getMessage, ex) + } + } + + override def unregisterSalesforceCredential(user: AuthenticatedUser, name: String): Boolean = { + try { + client.unregisterSalesforceCredential(user, name) + } catch { + case ex: APIException => throw new ClientCredentialsException(ex.getMessage, ex) + } + } /** Http Credentials */ diff --git a/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala b/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala index ca0822392..54cbbabef 100644 --- a/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala +++ b/snapi-frontend/src/main/scala/raw/creds/local/LocalCredentialsService.scala @@ -45,6 +45,26 @@ class LocalCredentialsService extends CredentialsService { false } + override def registerSalesforceCredential( + user: AuthenticatedUser, + name: String, + salesforceCredential: SalesforceCredential + ): Boolean = { + false + } + + override def getSalesforceCredential(user: AuthenticatedUser, name: String): Option[SalesforceCredential] = { + None + } + + override def listSalesforceCredentials(user: AuthenticatedUser): List[String] = { + List.empty + } + + override def unregisterSalesforceCredential(user: AuthenticatedUser, name: String): Boolean = { + false + } + override protected def doRegisterNewHttpCredential( user: AuthenticatedUser, name: String, @@ -123,4 +143,5 @@ class LocalCredentialsService extends CredentialsService { } override def doStop(): Unit = {} + } diff --git a/snapi-frontend/src/main/scala/raw/creds/protocol/ProtocolCredentials.scala b/snapi-frontend/src/main/scala/raw/creds/protocol/ProtocolCredentials.scala index 5e62dade6..4c29daee1 100644 --- a/snapi-frontend/src/main/scala/raw/creds/protocol/ProtocolCredentials.scala +++ b/snapi-frontend/src/main/scala/raw/creds/protocol/ProtocolCredentials.scala @@ -25,6 +25,16 @@ final case class RegisterDropboxCredential(user: AuthenticatedUser, token: Dropb final case class GetDropboxCredential(user: AuthenticatedUser) final case class UnregisterDropboxCredential(user: AuthenticatedUser) +final case class RegisterSalesforceCredential( + user: AuthenticatedUser, + name: String, + salesforceCredential: SalesforceCredential +) +final case class GetSalesforceCredential(user: AuthenticatedUser, name: String) +final case class ListSalesforceCredentials(user: AuthenticatedUser) + +final case class UnregisterSalesforceCredential(user: AuthenticatedUser, name: String) + final case class RegisterHttpCredential(user: AuthenticatedUser, credential: HttpCredential) final case class ListHttpCredentials(user: AuthenticatedUser) final case class GetHttpCredential(user: AuthenticatedUser, name: String)