Skip to content

Commit

Permalink
fix: add MT to CredentialDefinitionRepositoryInMemory
Browse files Browse the repository at this point in the history
  • Loading branch information
yshyn-iohk committed Sep 7, 2023
1 parent 268c638 commit 34a5680
Showing 1 changed file with 45 additions and 19 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,32 @@ package io.iohk.atala.pollux.core.repository
import io.iohk.atala.pollux.core.model.*
import io.iohk.atala.pollux.core.model.error.CredentialRepositoryError.*
import io.iohk.atala.pollux.core.model.schema.CredentialDefinition
import io.iohk.atala.shared.models.WalletAccessContext
import io.iohk.atala.shared.models.{WalletAccessContext, WalletId}
import zio.*

import java.util.UUID

class CredentialDefinitionRepositoryInMemory(
storeRef: Ref[Map[UUID, CredentialDefinition]]
walletRefs: Ref[Map[WalletId, Ref[Map[UUID, CredentialDefinition]]]]
) extends CredentialDefinitionRepository {

private def walletStoreRef: URIO[WalletAccessContext, Ref[Map[UUID, CredentialDefinition]]] =
for {
walletId <- ZIO.serviceWith[WalletAccessContext](_.walletId)
refs <- walletRefs.get
maybeWalletRef = refs.get(walletId)
walletRef <- maybeWalletRef
.fold {
for {
ref <- Ref.make(Map.empty[UUID, CredentialDefinition])
_ <- walletRefs.set(refs.updated(walletId, ref))
} yield ref
}(ZIO.succeed)
} yield walletRef

override def create(record: CredentialDefinition): RIO[WalletAccessContext, CredentialDefinition] = {
for {
storeRef <- walletStoreRef
_ <- for {
store <- storeRef.get
maybeRecord = store.values.find(_.id == record.guid)
Expand All @@ -26,13 +42,18 @@ class CredentialDefinitionRepositoryInMemory(

override def getByGuid(guid: UUID): Task[Option[CredentialDefinition]] = {
for {
store <- storeRef.get
record = store.get(guid)
storeRefs <- walletRefs.get
storeRefOption <- ZIO.filter(storeRefs.values)(storeRef => storeRef.get.map(_.contains(guid))).map(_.headOption)
record <- storeRefOption match {
case Some(storeRef) => storeRef.get.map(_.get(guid))
case None => ZIO.none
}
} yield record
}

override def update(cs: CredentialDefinition): RIO[WalletAccessContext, Option[CredentialDefinition]] = {
for {
storeRef <- walletStoreRef
store <- storeRef.get
maybeExisting = store.get(cs.id)
_ <- maybeExisting match {
Expand All @@ -45,16 +66,18 @@ class CredentialDefinitionRepositoryInMemory(
}

override def getAllVersions(id: UUID, author: String): RIO[WalletAccessContext, Seq[String]] = {
storeRef.get.map { store =>
store.values
.filter(credDef => credDef.id == id && credDef.author == author)
.map(_.version)
.toSeq
}
for {
storeRef <- walletStoreRef
store <- storeRef.get
} yield store.values
.filter(credDef => credDef.id == id && credDef.author == author)
.map(_.version)
.toSeq
}

override def delete(guid: UUID): RIO[WalletAccessContext, Option[CredentialDefinition]] = {
for {
storeRef <- walletStoreRef
store <- storeRef.get
maybeRecord = store.get(guid)
_ <- maybeRecord match {
Expand All @@ -66,6 +89,7 @@ class CredentialDefinitionRepositoryInMemory(

override def deleteAll(): RIO[WalletAccessContext, Long] = {
for {
storeRef <- walletStoreRef
store <- storeRef.get
deleted = store.size
_ <- storeRef.update(Map.empty)
Expand All @@ -75,23 +99,25 @@ class CredentialDefinitionRepositoryInMemory(
override def search(
query: Repository.SearchQuery[CredentialDefinition.Filter]
): RIO[WalletAccessContext, Repository.SearchResult[CredentialDefinition]] = {
storeRef.get.map { store =>
val filtered = store.values.filter { credDef =>
query.filter.author.forall(_ == credDef.author) &&
query.filter.name.forall(_ == credDef.name) &&
query.filter.version.forall(_ == credDef.version) &&
query.filter.tag.forall(tag => credDef.tag == tag)
walletStoreRef.flatMap { storeRef =>
storeRef.get.map { store =>
val filtered = store.values.filter { credDef =>
query.filter.author.forall(_ == credDef.author) &&
query.filter.name.forall(_ == credDef.name) &&
query.filter.version.forall(_ == credDef.version) &&
query.filter.tag.forall(tag => credDef.tag == tag)
}
val paginated = filtered.slice(query.skip, query.skip + query.limit)
Repository.SearchResult(paginated.toSeq, paginated.size, filtered.size)
}
val paginated = filtered.slice(query.skip, query.skip + query.limit)
Repository.SearchResult(paginated.toSeq, paginated.size, filtered.size)
}
}
}

object CredentialDefinitionRepositoryInMemory {
val layer: ULayer[CredentialDefinitionRepository] = ZLayer.fromZIO(
Ref
.make(Map.empty[UUID, CredentialDefinition])
.make(Map.empty[WalletId, Ref[Map[UUID, CredentialDefinition]]])
.map(CredentialDefinitionRepositoryInMemory(_))
)
}

0 comments on commit 34a5680

Please sign in to comment.