From 2294d800c24c46c79b21713cf7ccea785dd36bb9 Mon Sep 17 00:00:00 2001 From: trilero <trile@riseup.net> Date: Wed, 17 Apr 2024 11:00:18 +0200 Subject: [PATCH] [+][FCB] Give it a round to Sets vs List + Make sure to represent uniqueness via Sets as much as possible. That's the core optic. + Otherwise, list is fine, but the semantics need to stress uniqueness --- .../scala/acab/devcon0/boot/ioc/IpfsIoC.scala | 3 +- .../IpfsCidDeltaQueryHandlerImpl.scala | 14 +++++----- ...IpfsCidDeltaUpdateCommandHandlerImpl.scala | 8 ++---- ...IpfsCidDeltaUpdateCommandHandlerImpl.scala | 12 ++++---- .../ipfscid/SearchQueryHandlerImpl.scala | 2 +- .../ipfscid/TreeQueryHandlerImpl.scala | 4 --- .../acab/devcon0/domain/dtos/Federation.scala | 2 +- .../domain/dtos/FederationMember.scala | 4 +-- .../domain/dtos/SearchParameters.scala | 2 +- .../federationmember/CidsRepository.scala | 10 +++---- .../domain/service/IpfsClusterService.scala | 4 +-- .../service/IpfsClusterServiceImpl.scala | 8 +++--- .../federationmember/CidsService.scala | 10 +++---- .../federationmember/CidsServiceImpl.scala | 10 +++---- .../service/ipfscid/FacadeService.scala | 2 +- .../service/ipfscid/FacadeServiceImpl.scala | 8 +++--- ...onMemberChangelogUpdateEventListener.scala | 4 +-- ...tionMemberIpfsCidDeltaUpdateListener.scala | 4 +-- .../output/client/IpfsClientImpl.scala | 7 +++-- .../federationmember/CidsRepositoryImpl.scala | 28 +++++++++---------- .../repository/ipfscid/FlatRepository.scala | 8 +++--- .../ipfscid/SearchNameRepositoryImpl.scala | 10 +++---- .../src/views/FederationMembersView.js | 12 ++++---- 23 files changed, 83 insertions(+), 93 deletions(-) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/boot/ioc/IpfsIoC.scala b/federation-controller-backend/src/main/scala/acab/devcon0/boot/ioc/IpfsIoC.scala index 0919f1f..6cb37e8 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/boot/ioc/IpfsIoC.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/boot/ioc/IpfsIoC.scala @@ -58,7 +58,8 @@ object IpfsIoC { object Service { val ipfsService: IpfsService = new IpfsServiceImpl( - ipfsClient = Output.ipfsClient + ipfsClient = Output.ipfsClient, + flatRepository = Output.flatRepository ) val ipfsClusterService: IpfsClusterService = new IpfsClusterServiceImpl( diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaQueryHandlerImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaQueryHandlerImpl.scala index 6ffb8a0..0c5d896 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaQueryHandlerImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaQueryHandlerImpl.scala @@ -22,29 +22,29 @@ class IpfsCidDeltaQueryHandlerImpl( implicit val logger: Logger[IO] = Slf4jLogger.getLogger[IO] override def handle(query: IpfsCidDeltaQuery): IO[FederationIpfsCidDelta] = { - val removals: List[IpfsCid] = query.delta.removals + val removals: Set[IpfsCid] = query.delta.removals for existingInOtherMembers <- getExistsInOtherMembers(removals, query.delta.federationMemberId) orphanCids = getOrphanCids(removals, existingInOtherMembers) yield FederationIpfsCidDelta(additions = query.delta.additions, removals = orphanCids) } - private def getOrphanCids(deletingIpfsCids: List[IpfsCid], existingInOtherMembers: List[IpfsCid]): List[IpfsCid] = { - deletingIpfsCids.filterNot(existingInOtherMembers.contains(_)) + private def getOrphanCids(deletingIpfsCids: Set[IpfsCid], existingInOtherMembers: Set[IpfsCid]): Set[IpfsCid] = { + deletingIpfsCids.diff(existingInOtherMembers) } - private def getExistsInOtherMembers(ipfsCids: List[IpfsCid], id: FederationMemberId): IO[List[IpfsCid]] = { + private def getExistsInOtherMembers(ipfsCids: Set[IpfsCid], id: FederationMemberId): IO[Set[IpfsCid]] = { getOtherMembersSharedFolderCid(id) .flatMap(getExistingInOtherMembers(ipfsCids, _)) } private def getExistingInOtherMembers( - ipfsCids: List[IpfsCid], + ipfsCids: Set[IpfsCid], membersRootIpfsCid: List[(FederationMemberId, IpfsCid)] - ): IO[List[IpfsCid]] = { + ): IO[Set[IpfsCid]] = { for existsResult: List[(IpfsCid, Boolean)] <- membersRootIpfsCid .flatTraverse(tuple => federationMemberCidsService.exists(tuple._1, tuple._2, ipfsCids)) - yield existsResult.filter(_._2).map(_._1) + yield existsResult.filter(_._2).map(_._1).toSet } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaUpdateCommandHandlerImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaUpdateCommandHandlerImpl.scala index 31ab197..f55d9a2 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaUpdateCommandHandlerImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federation/IpfsCidDeltaUpdateCommandHandlerImpl.scala @@ -8,8 +8,6 @@ import acab.devcon0.domain.service._ import acab.devcon0.domain.service.ipfscid.CopiesService import acab.devcon0.domain.service.ipfscid.FacadeService import cats.effect.IO -import org.typelevel.log4cats.Logger -import org.typelevel.log4cats.slf4j.Slf4jLogger class IpfsCidDeltaUpdateCommandHandlerImpl( ipfsCidFacadeService: FacadeService[IO], @@ -17,8 +15,6 @@ class IpfsCidDeltaUpdateCommandHandlerImpl( ipfsClusterService: IpfsClusterService ) extends IpfsCidDeltaUpdateCommandHandler { - implicit val logger: Logger[IO] = Slf4jLogger.getLogger[IO] - override def handle(cmd: IpfsCidDeltaUpdateCommand): IO[IpfsCidDeltaUpdateEvent[?]] = { for _ <- handleAdditions(cmd) @@ -28,7 +24,7 @@ class IpfsCidDeltaUpdateCommandHandlerImpl( private def handleAdditions(cmd: IpfsCidDeltaUpdateCommand): IO[Unit] = { for - _ <- ipfsCidCopiesService.increment(cmd.delta.additions.toSet) + _ <- ipfsCidCopiesService.increment(cmd.delta.additions) _ <- ipfsClusterService.addPins(cmd.delta.additions) yield () } @@ -36,7 +32,7 @@ class IpfsCidDeltaUpdateCommandHandlerImpl( private def handleRemovals(cmd: IpfsCidDeltaUpdateCommand): IO[Unit] = { for _ <- ipfsCidFacadeService.deleteFlats(cmd.delta.removals) - _ <- ipfsCidCopiesService.decrement(cmd.delta.removals.toSet) + _ <- ipfsCidCopiesService.decrement(cmd.delta.removals) _ <- ipfsClusterService.removePins(cmd.delta.removals) yield () } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/IpfsCidDeltaUpdateCommandHandlerImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/IpfsCidDeltaUpdateCommandHandlerImpl.scala index 7c5268c..f57046e 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/IpfsCidDeltaUpdateCommandHandlerImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/federationmember/IpfsCidDeltaUpdateCommandHandlerImpl.scala @@ -40,18 +40,16 @@ class IpfsCidDeltaUpdateCommandHandlerImpl( yield FederationMemberIpfsCidDelta(federationMemberId = cmd.id, additions = additions, removals = removals) } - private def getIpfsCidsMemberDeletes(cmd: IpfsCidDeltaUpdateCommand): IO[List[IpfsCid]] = { + private def getIpfsCidsMemberDeletes(cmd: IpfsCidDeltaUpdateCommand): IO[Set[IpfsCid]] = { val ipfsCid: IpfsCid = cmd.federationMemberChangelogItem.ipfsCid val federationMemberId: FederationMemberId = cmd.id val federationMemberChangelogItem: FederationMemberChangelogItem = cmd.federationMemberChangelogItem for maybePreviousRootIpfsCid <- getPreviousRootIpfsCid(federationMemberId, federationMemberChangelogItem) deletedCids <- maybePreviousRootIpfsCid match - case None => IO(List()) + case None => IO(Set()) case Some(oldIpfsCid) => cidsService.getDeleted(federationMemberId, oldIpfsCid, ipfsCid) - yield { - deletedCids - } + yield deletedCids } private def getPreviousRootIpfsCid( @@ -63,7 +61,7 @@ class IpfsCidDeltaUpdateCommandHandlerImpl( .map(_.map(_.ipfsCid)) } - private def getIpfsCidsMemberAdds(cmd: IpfsCidDeltaUpdateCommand): IO[List[IpfsCid]] = { + private def getIpfsCidsMemberAdds(cmd: IpfsCidDeltaUpdateCommand): IO[Set[IpfsCid]] = { val ipfsCid: IpfsCid = cmd.federationMemberChangelogItem.ipfsCid val federationMemberId: FederationMemberId = cmd.id val federationMemberChangelogItem: FederationMemberChangelogItem = cmd.federationMemberChangelogItem @@ -125,7 +123,7 @@ class IpfsCidDeltaUpdateCommandHandlerImpl( allIpfsCidDtos <- IO(IpfsCidMapper.FlatAll.to(ipfsCidFileTree)) ipfsCid = cmd.federationMemberChangelogItem.ipfsCid federationMemberId = cmd.id - allIpfsCids <- IO(allIpfsCidDtos.toList.map(_.cid)) + allIpfsCids <- IO(allIpfsCidDtos.map(_.cid)) _ <- cidsService.add(federationMemberId, ipfsCid, allIpfsCids) _ <- saveIpfsCidFlatsInner(allIpfsCidDtos) yield allIpfsCidDtos diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/SearchQueryHandlerImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/SearchQueryHandlerImpl.scala index 7526be2..630d723 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/SearchQueryHandlerImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/SearchQueryHandlerImpl.scala @@ -20,7 +20,7 @@ class SearchQueryHandlerImpl( override def handle(query: SearchQuery): IO[IpfsCidSearchResponse] = { for searchResultIpfsCids <- searchNameService.search(query.searchParameters) - ipfsCidDtos <- facadeService.getFlats(searchResultIpfsCids.result.toSet) + ipfsCidDtos <- facadeService.getFlats(searchResultIpfsCids.result) result <- ipfsCidDtos.toList.traverse(buildIpfsCidMetadataDto) yield IpfsCidSearchResponse(result, searchResultIpfsCids.totalCount, searchResultIpfsCids.pageSize) } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/TreeQueryHandlerImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/TreeQueryHandlerImpl.scala index 2454275..dde34a6 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/TreeQueryHandlerImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/adapters/ipfscid/TreeQueryHandlerImpl.scala @@ -6,16 +6,12 @@ import acab.devcon0.domain.service.IpfsService import acab.devcon0.domain.service.ipfscid.FacadeService import acab.devcon0.trile.domain.dtos.aliases.IpfsCid import cats.effect.IO -import org.typelevel.log4cats.Logger -import org.typelevel.log4cats.slf4j.Slf4jLogger class TreeQueryHandlerImpl( facadeService: FacadeService[IO], ipfsService: IpfsService ) extends TreeQueryHandler { - implicit val logger: Logger[IO] = Slf4jLogger.getLogger[IO] - override def handle(query: TreeQuery): IO[IpfsCidDto] = { query match case NodesTreeQuery(maybeIpfsCid) => getNodeTree(maybeIpfsCid) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/Federation.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/Federation.scala index 6aabe56..f1a2140 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/Federation.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/Federation.scala @@ -2,4 +2,4 @@ package acab.devcon0.domain.dtos import acab.devcon0.trile.domain.dtos.aliases.IpfsCid -final case class FederationIpfsCidDelta(additions: List[IpfsCid], removals: List[IpfsCid]) +final case class FederationIpfsCidDelta(additions: Set[IpfsCid], removals: Set[IpfsCid]) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/FederationMember.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/FederationMember.scala index 8774164..1970e48 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/FederationMember.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/FederationMember.scala @@ -21,6 +21,6 @@ final case class FederationMemberChangelogItem(ipfsCid: IpfsCid, timestamp: Inst final case class FederationMemberIpfsCidDelta( federationMemberId: FederationMemberId, - additions: List[IpfsCid], - removals: List[IpfsCid] + additions: Set[IpfsCid], + removals: Set[IpfsCid] ) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/SearchParameters.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/SearchParameters.scala index d57db79..f1f7ae0 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/SearchParameters.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/dtos/SearchParameters.scala @@ -1,4 +1,4 @@ package acab.devcon0.domain.dtos case class SearchParameters(term: String, page: Int) -case class SearchResult[T](parameters: SearchParameters, result: List[T], totalCount: Long, pageSize: Long) +case class SearchResult[T](parameters: SearchParameters, result: Set[T], totalCount: Long, pageSize: Long) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/ports/output/repository/federationmember/CidsRepository.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/ports/output/repository/federationmember/CidsRepository.scala index 7ae4a0c..2c4f134 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/ports/output/repository/federationmember/CidsRepository.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/ports/output/repository/federationmember/CidsRepository.scala @@ -3,9 +3,9 @@ import acab.devcon0.trile.domain.dtos.aliases.FederationMemberId import acab.devcon0.trile.domain.dtos.aliases.IpfsCid trait CidsRepository[F[_]] { - def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): F[List[IpfsCid]] - def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[List[IpfsCid]] - def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[List[IpfsCid]] - def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: List[IpfsCid]): F[List[IpfsCid]] - def exists(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: List[IpfsCid]): F[List[(IpfsCid, Boolean)]] + def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): F[Set[IpfsCid]] + def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[Set[IpfsCid]] + def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[Set[IpfsCid]] + def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: Set[IpfsCid]): F[Set[IpfsCid]] + def exists(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: Set[IpfsCid]): F[List[(IpfsCid, Boolean)]] } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterService.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterService.scala index 3968a75..b0729ea 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterService.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterService.scala @@ -10,6 +10,6 @@ trait IpfsClusterService { def getPeers: IO[IpfsClusterPeers] def getPeer(p2pPeerId: P2pPeerId): IO[IpfsClusterPeer] def getPeer: IO[IpfsClusterPeer] - def addPins(ipfsCids: List[IpfsCid]): IO[Unit] - def removePins(ipfsCids: List[IpfsCid]): IO[Unit] + def addPins(ipfsCids: Set[IpfsCid]): IO[Unit] + def removePins(ipfsCids: Set[IpfsCid]): IO[Unit] } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterServiceImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterServiceImpl.scala index 4101575..a251f66 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterServiceImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsClusterServiceImpl.scala @@ -32,12 +32,12 @@ class IpfsClusterServiceImpl(client: IpfsClusterClient) extends IpfsClusterServi IORetry.fibonacci(getPeerIO) } - override def addPins(ipfsCids: List[IpfsCid]): IO[Unit] = { - ipfsCids.traverse(addPin).void + override def addPins(ipfsCids: Set[IpfsCid]): IO[Unit] = { + ipfsCids.toSeq.traverse(addPin).void } - override def removePins(ipfsCids: List[IpfsCid]): IO[Unit] = { - ipfsCids.traverse(client.removePin).void + override def removePins(ipfsCids: Set[IpfsCid]): IO[Unit] = { + ipfsCids.toSeq.traverse(client.removePin).void } private def addPin(ipfsCid: IpfsCid): IO[Unit] = { IORetry.fibonacci(client.addPin(ipfsCid)) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsService.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsService.scala index 1bddeda..eacdcb1 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsService.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsService.scala @@ -3,9 +3,9 @@ import acab.devcon0.trile.domain.dtos.aliases.FederationMemberId import acab.devcon0.trile.domain.dtos.aliases.IpfsCid trait CidsService[F[_]] { - def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): F[List[IpfsCid]] - def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[List[IpfsCid]] - def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[List[IpfsCid]] - def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: List[IpfsCid]): F[List[IpfsCid]] - def exists(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: List[IpfsCid]): F[List[(IpfsCid, Boolean)]] + def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): F[Set[IpfsCid]] + def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[Set[IpfsCid]] + def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): F[Set[IpfsCid]] + def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: Set[IpfsCid]): F[Set[IpfsCid]] + def exists(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: Set[IpfsCid]): F[List[(IpfsCid, Boolean)]] } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsServiceImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsServiceImpl.scala index b06d80b..a3082bc 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsServiceImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/federationmember/CidsServiceImpl.scala @@ -7,26 +7,26 @@ import cats.effect.IO class CidsServiceImpl(repository: CidsRepository[IO]) extends CidsService[IO] { - override def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): IO[List[IpfsCid]] = { + override def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): IO[Set[IpfsCid]] = { repository.getAll(id, rootIpfsCid) } - override def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[List[IpfsCid]] = { + override def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[Set[IpfsCid]] = { repository.getDeleted(id, oldIpfsCid, newIpfsCid) } - override def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[List[IpfsCid]] = { + override def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[Set[IpfsCid]] = { repository.getAdded(id, oldIpfsCid, newIpfsCid) } - override def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: List[IpfsCid]): IO[List[IpfsCid]] = { + override def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: Set[IpfsCid]): IO[Set[IpfsCid]] = { repository.add(id, rootIpfsCid, ipfsCids) } override def exists( id: FederationMemberId, rootIpfsCid: IpfsCid, - ipfsCids: List[IpfsCid] + ipfsCids: Set[IpfsCid] ): IO[List[(IpfsCid, Boolean)]] = { repository.exists(id, rootIpfsCid, ipfsCids) } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeService.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeService.scala index 2d4ada2..50dded7 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeService.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeService.scala @@ -10,7 +10,7 @@ trait FacadeService[F[_]] { def getFlats(ipfsCids: Set[IpfsCid]): F[Set[IpfsCidDto]] def saveFlat(ipfsCidDto: IpfsCidDto): F[IpfsCidDto] def saveFlats(ipfsCidDtos: Set[IpfsCidDto]): F[Set[IpfsCidDto]] - def deleteFlats(ipfsCid: List[IpfsCid]): F[Unit] + def deleteFlats(ipfsCid: Set[IpfsCid]): F[Unit] def getNodeTree(ipfsCid: IpfsCid): F[Option[IpfsCidDto]] def saveNodeTree(ipfsCidDto: IpfsCidDto): F[IpfsCidDto] } diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeServiceImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeServiceImpl.scala index ee11b8c..0729a3f 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeServiceImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/ipfscid/FacadeServiceImpl.scala @@ -11,9 +11,9 @@ import org.typelevel.log4cats.Logger import org.typelevel.log4cats.slf4j.Slf4jLogger class FacadeServiceImpl( - val flatRepository: FlatRepository, - val fileTreeRepository: FileTreeRepository, - val nodeTreeRepository: NodeTreeRepository + flatRepository: FlatRepository, + fileTreeRepository: FileTreeRepository, + nodeTreeRepository: NodeTreeRepository ) extends FacadeService[IO] { private val logger: Logger[IO] = Slf4jLogger.getLogger[IO] @@ -52,7 +52,7 @@ class FacadeServiceImpl( .onError(logError) } - override def deleteFlats(ipfsCids: List[IpfsCid]): IO[Unit] = { + override def deleteFlats(ipfsCids: Set[IpfsCid]): IO[Unit] = { if ipfsCids.isEmpty then IO(List()) else flatRepository diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberChangelogUpdateEventListener.scala b/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberChangelogUpdateEventListener.scala index d6328fa..c3c9d39 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberChangelogUpdateEventListener.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberChangelogUpdateEventListener.scala @@ -77,7 +77,7 @@ class FederationMemberChangelogUpdateEventListener( Supervisor[IO](await = true).use { supervisor => val messages: List[FederationMemberIpfsCidsDeltaUpdateMessage] = delta.additions .grouped(chunkSize) - .map(cids => FederationMemberIpfsCidDelta(delta.federationMemberId, cids, List())) + .map(cids => FederationMemberIpfsCidDelta(delta.federationMemberId, cids, Set())) .map(newDelta => FederationMemberIpfsCidsDeltaUpdateMessage(newDelta)) .toList supervisor.supervise(messages.traverse(redisPublisher.publish)) @@ -88,7 +88,7 @@ class FederationMemberChangelogUpdateEventListener( Supervisor[IO](await = true).use { supervisor => val messages = delta.removals .grouped(chunkSize) - .map(cids => FederationMemberIpfsCidDelta(delta.federationMemberId, List(), cids)) + .map(cids => FederationMemberIpfsCidDelta(delta.federationMemberId, Set(), cids)) .map(newDelta => FederationMemberIpfsCidsDeltaUpdateMessage(newDelta)) .toList supervisor.supervise(messages.traverse(redisPublisher.publish)) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberIpfsCidDeltaUpdateListener.scala b/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberIpfsCidDeltaUpdateListener.scala index 060e7f3..5eff740 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberIpfsCidDeltaUpdateListener.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/input/redispubsub/FederationMemberIpfsCidDeltaUpdateListener.scala @@ -51,7 +51,7 @@ class FederationMemberIpfsCidDeltaUpdateListener( Supervisor[IO](await = true).use { supervisor => val messages = delta.additions .grouped(chunkSize) - .map(cids => FederationIpfsCidsDeltaUpdateMessage(FederationIpfsCidDelta(additions = cids, removals = List()))) + .map(cids => FederationIpfsCidsDeltaUpdateMessage(FederationIpfsCidDelta(additions = cids, removals = Set()))) .toList supervisor.supervise(messages.traverse(redisPublisher.publish)) }.void @@ -61,7 +61,7 @@ class FederationMemberIpfsCidDeltaUpdateListener( Supervisor[IO](await = true).use { supervisor => val messages = delta.removals .grouped(chunkSize) - .map(cids => FederationIpfsCidsDeltaUpdateMessage(FederationIpfsCidDelta(additions = List(), removals = cids))) + .map(cids => FederationIpfsCidsDeltaUpdateMessage(FederationIpfsCidDelta(additions = Set(), removals = cids))) .toList supervisor.supervise(messages.traverse(redisPublisher.publish)) }.void diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/output/client/IpfsClientImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/output/client/IpfsClientImpl.scala index f570e7d..f7ef0d3 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/output/client/IpfsClientImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/output/client/IpfsClientImpl.scala @@ -2,15 +2,16 @@ package acab.devcon0.output.client import acab.devcon0.configuration.IpfsConfiguration import acab.devcon0.domain.codecs.IpfsCodecs -import acab.devcon0.domain.dtos.* +import acab.devcon0.domain.dtos._ import acab.devcon0.domain.ports.output.client.IpfsClient import acab.devcon0.trile.domain.dtos.aliases.IpfsCid import acab.devcon0.trile.utils.EffectsUtils -import cats.effect.{IO, Resource} +import cats.effect.IO +import cats.effect.Resource import cats.implicits.catsSyntaxMonadError import org.typelevel.log4cats.Logger import org.typelevel.log4cats.slf4j.Slf4jLogger -import sttp.client4.* +import sttp.client4._ import sttp.model.Uri class IpfsClientImpl(backendResource: Resource[IO, SyncBackend], ipfsConfiguration: IpfsConfiguration) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/federationmember/CidsRepositoryImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/federationmember/CidsRepositoryImpl.scala index 3fe0455..17ae6a0 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/federationmember/CidsRepositoryImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/federationmember/CidsRepositoryImpl.scala @@ -56,9 +56,9 @@ object CidsRepository { def add( id: FederationMemberId, rootIpfsCid: IpfsCid, - ipfsCids: List[IpfsCid] + ipfsCids: Set[IpfsCid] ): RedisCommands[IO, String, String] => IO[Unit] = { redis => - redis.sAdd(key(id, rootIpfsCid), ipfsCids*).void + redis.sAdd(key(id, rootIpfsCid), ipfsCids.toSeq*).void } def remove(id: FederationMemberId): RedisCommands[IO, String, String] => IO[Unit] = { redis => @@ -73,21 +73,22 @@ object CidsRepository { def exists( id: FederationMemberId, rootIpfsCid: IpfsCid, - ipfsCids: List[IpfsCid] + ipfsCids: Set[IpfsCid] ): RedisCommands[IO, String, String] => IO[List[(IpfsCid, Boolean)]] = { redis => val redisKey = key(id, rootIpfsCid) existsByKey(ipfsCids, redis, redisKey) } private def existsByKey( - ipfsCids: List[IpfsCid], + ipfsCids: Set[IpfsCid], redis: RedisCommands[IO, String, String], redisKey: String ): IO[List[(IpfsCid, Boolean)]] = { for - existsKey <- redis.exists(redisKey) - sMisMember <- if existsKey && ipfsCids.nonEmpty then redis.sMisMember(redisKey, ipfsCids*) else IO(List()) - zipIt <- if sMisMember.isEmpty then IO(List()) else IO(ipfsCids.zip(sMisMember)) + existsKey <- redis.exists(redisKey) + sMisMember <- + if existsKey && ipfsCids.nonEmpty then redis.sMisMember(redisKey, ipfsCids.toSeq*) else IO(List()) + zipIt <- if sMisMember.isEmpty then IO(List()) else IO(ipfsCids.toList.zip(sMisMember)) yield zipIt } } @@ -98,25 +99,22 @@ class CidsRepositoryImpl(val commandsApi: Resource[IO, RedisCommands[IO, String, implicit val logger: Logger[IO] = Slf4jLogger.getLogger[IO] - override def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): IO[List[IpfsCid]] = { + override def getAll(id: FederationMemberId, rootIpfsCid: IpfsCid): IO[Set[IpfsCid]] = { commandsApi .use(CidsRepository.Index.Operations.getAll(id, rootIpfsCid)(_)) - .map(_.toList) } - override def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[List[IpfsCid]] = { + override def getDeleted(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[Set[IpfsCid]] = { commandsApi .use(CidsRepository.Index.Operations.getDeleted(id, oldIpfsCid, newIpfsCid)(_)) - .map(_.toList) } - override def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[List[IpfsCid]] = { + override def getAdded(id: FederationMemberId, oldIpfsCid: IpfsCid, newIpfsCid: IpfsCid): IO[Set[IpfsCid]] = { commandsApi .use(CidsRepository.Index.Operations.getAdded(id, oldIpfsCid, newIpfsCid)(_)) - .map(_.toList) } - override def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: List[IpfsCid]): IO[List[IpfsCid]] = { + override def add(id: FederationMemberId, rootIpfsCid: IpfsCid, ipfsCids: Set[IpfsCid]): IO[Set[IpfsCid]] = { commandsApi .use(redis => { val operations: TxStore[IO, String, String] => List[IO[Unit]] = { _ => @@ -130,7 +128,7 @@ class CidsRepositoryImpl(val commandsApi: Resource[IO, RedisCommands[IO, String, override def exists( id: FederationMemberId, rootIpfsCid: IpfsCid, - ipfsCids: List[IpfsCid] + ipfsCids: Set[IpfsCid] ): IO[List[(IpfsCid, Boolean)]] = { commandsApi .use(CidsRepository.Index.Operations.exists(id, rootIpfsCid, ipfsCids)(_)) diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/FlatRepository.scala b/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/FlatRepository.scala index b1284a9..159f396 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/FlatRepository.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/FlatRepository.scala @@ -47,8 +47,8 @@ private object FlatRepository { .void } - def deleteAll(ipfsCids: List[IpfsCid]): RedisCommands[IO, String, String] => IO[Unit] = { redis => - val keys = ipfsCids.map(key) + def deleteAll(ipfsCids: Set[IpfsCid]): RedisCommands[IO, String, String] => IO[Unit] = { redis => + val keys = ipfsCids.map(key).toSeq redis.del(keys*).void } } @@ -86,7 +86,7 @@ class FlatRepository(val commandsApi: Resource[IO, RedisCommands[IO, String, Str .map(_ => ipfsCidDtos) } - def deleteAll(ipfsCids: List[IpfsCid]): IO[Unit] = { + def deleteAll(ipfsCids: Set[IpfsCid]): IO[Unit] = { if ipfsCids.nonEmpty then commandsApi.use(deleteAllInner(ipfsCids, _)) else IO.unit } @@ -117,7 +117,7 @@ class FlatRepository(val commandsApi: Resource[IO, RedisCommands[IO, String, Str } private def deleteAllInner( - ipfsCids: List[IpfsCid], + ipfsCids: Set[IpfsCid], redis: RedisCommands[IO, String, String] ): IO[Unit] = { val operations: TxStore[IO, String, String] => List[IO[Unit]] = { _ => diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/SearchNameRepositoryImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/SearchNameRepositoryImpl.scala index d5bd89a..d1e6711 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/SearchNameRepositoryImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/output/repository/ipfscid/SearchNameRepositoryImpl.scala @@ -54,8 +54,8 @@ private object SearchNameRepository { ) ) .map(searchResults => { - val totalCount: Long = Long.unbox(searchResults.get(3)) - val ipfsCids: List[IpfsCid] = redisResultsToIpfsCids(searchResults) + val totalCount: Long = Long.unbox(searchResults.get(3)) + val ipfsCids: Set[IpfsCid] = redisResultsToIpfsCids(searchResults) SearchResult(searchParameters, ipfsCids, totalCount, pageSize) }) } @@ -68,7 +68,7 @@ private object SearchNameRepository { } - private def redisResultsToIpfsCids(searchResults: util.List[AnyRef]): List[String] = { + private def redisResultsToIpfsCids(searchResults: util.List[AnyRef]): Set[String] = { Try { searchResults .get(7) @@ -76,8 +76,8 @@ private object SearchNameRepository { .asScala .map(_.get(1)) .map(_.replace(redisutils.Redis.SetPrefixes.ipfsCidFlat, "").substring(1)) - .toList - }.getOrElse(List()) + .toSet + }.getOrElse(Set()) } private def createIndexInner(redis: RedisCommands[IO, String, String]): IO[Unit] = { diff --git a/federation-controller-frontend/src/views/FederationMembersView.js b/federation-controller-frontend/src/views/FederationMembersView.js index a234330..f38dd4b 100644 --- a/federation-controller-frontend/src/views/FederationMembersView.js +++ b/federation-controller-frontend/src/views/FederationMembersView.js @@ -68,8 +68,8 @@ function FederationMembersView() { try { const response = await axios.get(BackendApiUrls.Federation.Members()); for (const member of response.data) { - if (member.ipfsPeerRootCid) { - member.fileCount = await countFederationMemberFiles(member.ipfsPeerRootCid); + if (member.sharedFolderCid) { + member.fileCount = await countFederationMemberFiles(member.sharedFolderCid); } else { member.fileCount = '-'; } @@ -119,7 +119,7 @@ function FederationMembersView() { </ListItemAvatar> <ListItemText primary="Shared folder CID" - secondary={member.ipfsPeerRootCid || '-'} + secondary={member.sharedFolderCid || '-'} /> </ListItem> <ListItem alignItems="flex-start"> @@ -155,16 +155,16 @@ function FederationMembersView() { </Typography> </CardContent> <CardActions style={{justifyContent: 'flex-end'}}> - {member && member.ipfsPeerRootCid && ( + {member && member.sharedFolderCid && ( <Button variant="outlined" color="primary" startIcon={<ExploreOutlinedIcon/>} onClick={(event) => { event.preventDefault(); - navigate(`/ipfs/cid/meta/${member.ipfsPeerRootCid}`) + navigate(`/ipfs/cid/meta/${member.sharedFolderCid}`) }} - href={`/ipfs/cid/meta/${member.ipfsPeerRootCid}`} + href={`/ipfs/cid/meta/${member.sharedFolderCid}`} > Browse files </Button> -- GitLab