diff --git a/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/JdbcGenericSecretStorage.scala b/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/JdbcGenericSecretStorage.scala index 300bf397c5..568dccc3d2 100644 --- a/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/JdbcGenericSecretStorage.scala +++ b/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/JdbcGenericSecretStorage.scala @@ -1,55 +1,39 @@ package org.hyperledger.identus.agent.walletapi.sql import doobie.* -import doobie.implicits.* -import doobie.postgres.implicits.* +import io.getquill.JsonValue +import org.hyperledger.identus.agent.walletapi.sql.model.GenericSecretSql +import org.hyperledger.identus.agent.walletapi.sql.model as db import org.hyperledger.identus.agent.walletapi.storage.{GenericSecret, GenericSecretStorage} import org.hyperledger.identus.shared.db.ContextAwareTask import org.hyperledger.identus.shared.db.Implicits.* import org.hyperledger.identus.shared.models.WalletAccessContext import zio.* -import zio.json.ast.Json - -import java.time.Instant class JdbcGenericSecretStorage(xa: Transactor[ContextAwareTask]) extends GenericSecretStorage { override def set[K, V](key: K, secret: V)(implicit ev: GenericSecret[K, V]): RIO[WalletAccessContext, Unit] = { val keyPath = ev.keyPath(key) val payload = ev.encodeValue(secret) - val cxnIO = (now: Instant) => sql""" - | INSERT INTO public.generic_secret( - | key, - | payload, - | created_at, - | wallet_id - | ) values ( - | ${keyPath}, - | ${payload}, - | ${now}, - | current_setting('app.current_wallet_id')::UUID - | ) - """.stripMargin.update - for { now <- Clock.instant - _ <- cxnIO(now).run.transactWallet(xa) + walletId <- ZIO.serviceWith[WalletAccessContext](_.walletId) + s = db.GenericSecret(key = keyPath, payload = JsonValue(payload), createdAt = now, walletId = walletId) + _ <- GenericSecretSql + .insert(s) + .transactWallet(xa) } yield () } override def get[K, V](key: K)(implicit ev: GenericSecret[K, V]): RIO[WalletAccessContext, Option[V]] = { val keyPath = ev.keyPath(key) - val cxnIO = sql""" - | SELECT payload - | FROM public.generic_secret - | WHERE key = ${keyPath} - """.stripMargin - .query[Json] - .option - - cxnIO + GenericSecretSql + .findByKey(keyPath) .transactWallet(xa) - .flatMap(_.fold(ZIO.none)(json => ZIO.fromTry(ev.decodeValue(json)).asSome)) + .flatMap( + _.headOption + .fold(ZIO.none)(row => ZIO.fromTry(ev.decodeValue(row.payload.value)).asSome) + ) } } diff --git a/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/model/GenericSecret.scala b/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/model/GenericSecret.scala new file mode 100644 index 0000000000..6be4593d38 --- /dev/null +++ b/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/model/GenericSecret.scala @@ -0,0 +1,30 @@ +package org.hyperledger.identus.agent.walletapi.sql.model + +import io.getquill.{SnakeCase, *} +import io.getquill.context.json.PostgresJsonExtensions +import io.getquill.doobie.DoobieContext +import org.hyperledger.identus.shared.models.WalletId +import zio.json.ast.Json + +import java.time.Instant + +final case class GenericSecret( + key: String, + payload: JsonValue[Json], + createdAt: Instant, + walletId: WalletId +) + +object GenericSecretSql extends DoobieContext.Postgres(SnakeCase), PostgresJsonExtensions { + def insert(secret: GenericSecret) = run { + quote( + query[GenericSecret].insertValue(lift(secret)) + ) + } + + def findByKey(key: String) = run { + quote( + query[GenericSecret].filter(_.key == lift(key)).take(1) + ) + } +} diff --git a/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/model/Wallet.scala b/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/model/Wallet.scala index b552d27599..0b98903c46 100644 --- a/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/model/Wallet.scala +++ b/cloud-agent/service/wallet-api/src/main/scala/org/hyperledger/identus/agent/walletapi/sql/model/Wallet.scala @@ -42,7 +42,6 @@ object Wallet { } object WalletSql extends DoobieContext.Postgres(SnakeCase) { - def insert(wallet: Wallet) = run { quote( query[Wallet] diff --git a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/MockPresentationService.scala b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/MockPresentationService.scala index dce4713c8e..ba9549a691 100644 --- a/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/MockPresentationService.scala +++ b/pollux/core/src/test/scala/org/hyperledger/identus/pollux/core/service/MockPresentationService.scala @@ -15,10 +15,9 @@ import org.hyperledger.identus.pollux.core.service.serdes.{AnoncredCredentialPro import org.hyperledger.identus.pollux.sdjwt.{HolderPrivateKey, PresentationCompact} import org.hyperledger.identus.pollux.vc.jwt.{Issuer, PresentationPayload, W3cCredentialPayload} import org.hyperledger.identus.shared.models.* -import zio.{mock, IO, UIO, URLayer, ZIO, ZLayer} +import zio.{mock, Duration, IO, UIO, URLayer, ZIO, ZLayer} import zio.json.* import zio.mock.{Mock, Proxy} -import zio.Duration import java.time.Instant import java.util.UUID