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 0919f1fd300ccac74b2eb34d9508a67dfeca1de8..6cb37e874ff9df34426a031fd9457b7c2fd701f1 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 6ffb8a09c067ffabcbf7873bf3ccf86d212cbcc8..0c5d89610b1dde283fc94955e7313d49e59a8623 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 31ab197a4f6a5c74518589f414ca4500893494d0..f55d9a2ebcd3791baf1b9f124c3d6fc245d03519 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 7c5268c3d825341c77da293b188c5a31e7bbca80..f57046e868eeb2b006ee9b1ad9850d0b438b1176 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 7526be2da1cf3788ef25bfac861e78323b83a0c8..630d7237836196bd4e627d60dc6a70eebee24857 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 24542757477f6ef2d1827cabbdc17c63ef2bca31..dde34a69f59205e4dda2e35d914c85c7bb61b823 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 6aabe561e39b9c8cdbf2d40d3b2c670f173123eb..f1a21408b30256cfb3b751afedc5a0dbb77d28b4 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 87741646d629b06d127af4ee44111fdaa9af80de..1970e486962e8e751b0c4cb80bb89dcdaf67e1a3 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 d57db7918ff6bda582b21cd07fdb39b281482113..f1f7ae0cd3927c13624ba88a48e077d3739e794f 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 7ae4a0c298826a405a8665d9058421ab121fd997..2c4f134181c3063c16eb44291d0c1d8c0b66ccb8 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 3968a75bb45e9b2f3180fba3555b26de3853d692..b0729ea82fba0ae39e1a230d646fcde5002fb2a8 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 410157599eef00b099677411cabf9ed681834255..a251f66faf642199d9e74018fec8f3212f7cdf01 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 1bddeda916a3192bb801d09f2e1e9a995f6829eb..eacdcb1c3150235b0a664b63545c00c608a322c7 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 b06d80b1b0101f43ce8c8d7812d226a7de2ec768..a3082bc4a26360d490a781dd7395f5fc4f3c1704 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 2d4ada2f2b3826c818782ceb56cbe27c768bf2a4..50dded72513da988bf2c838e451105f1513c42c0 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 ee11b8c44c3dbd8e9ffe4d1ddc3e6aca547040ab..0729a3f34855fbe128df8ed800e8c6dd5111edba 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 d6328fad59dc80aa7952a6c58464430fdefde9ab..c3c9d3964c7c7a692413cb591ccb497573ea01e6 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 060e7f3f50db76ff6591c0a2d81beec9175273f2..5eff74039dfa23b944cb97e16e27481eb64e9dff 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 f570e7d91906a23bb2819562bb9c3bace3f0e6d2..f7ef0d3238c07958dd0418c1d3e82d86115bce03 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 3fe0455bf6735cab08daca576568bd0946cacefc..17ae6a0cc653fec96da24c9f3055901fa302d50e 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 b1284a9f4ab0148118766242c75c52a39e32c6d5..159f396221576e10181b02d7e67b6e58d7ef9137 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 d5bd89a81a8f820d1fa19f1bae28948c96211ed8..d1e6711c71b7c450ca9cf19177462997f356d501 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 a234330020087f8b6057c0f5c35f2eb2bec05221..f38dd4bc39fd84b65f208681fb9866f3ce68c535 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>