diff --git a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala index f649ba6a6ea3cd2939f56e2b33a83fb06f67a67b..0e4c459682f4a1604bef496616f695e17d4fd72e 100644 --- a/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala +++ b/federation-controller-backend/src/main/scala/acab/devcon0/domain/service/IpfsServiceImpl.scala @@ -1,5 +1,6 @@ package acab.devcon0 package domain.service +import java.time.Duration import java.time.Instant import acab.devcon0.domain.dtos.IpfsCidType.Empty @@ -7,13 +8,28 @@ import acab.devcon0.domain.dtos.IpfsCidType.File import acab.devcon0.domain.dtos.IpfsCidType.Folder import acab.devcon0.domain.dtos._ import acab.devcon0.domain.ports.output.client.IpfsClient +import acab.devcon0.output.repository.ipfscid.FlatRepository import acab.devcon0.trile.domain.dtos.aliases.IpfsCid import cats.effect._ import cats.implicits._ +import org.typelevel.log4cats.Logger +import org.typelevel.log4cats.slf4j.Slf4jLogger + +class IpfsServiceImpl(ipfsClient: IpfsClient, flatRepository: FlatRepository) extends IpfsService { + + private val logger: Logger[IO] = Slf4jLogger.getLogger[IO] -class IpfsServiceImpl(ipfsClient: IpfsClient) extends IpfsService { override def lsFileTree(ipfsCid: IpfsCid): IO[IpfsCidDto] = { - getIpfsCidDto(Left(ipfsCid)) + for + startTimestamp <- IO(Instant.now()) + dtoList <- getIpfsCidDto(Left(ipfsCid)) + endTimestamp <- IO(Instant.now()) + _ <- logDuration(startTimestamp, endTimestamp) + yield dtoList + } + + private def logDuration(startTimestamp: Instant, endTimestamp: Instant): IO[Unit] = { + logger.info(s"label=file-tree, duration=${Duration.between(startTimestamp, endTimestamp).toSeconds}(s)") } private def ipfsClientLs(ipfsCid: IpfsCid): IO[IpfsLsResponse] = { @@ -59,8 +75,23 @@ class IpfsServiceImpl(ipfsClient: IpfsClient) extends IpfsService { private def getIpfsCidDto(eitherCidOrLink: Either[IpfsCid, IpfsLsLinkResponse]): IO[IpfsCidDto] = { eitherCidOrLink match - case Left(ipfsCid) => ipfsClientLs(ipfsCid).flatMap(buildIpfsCidDto(_, None)) - case Right(link) => ipfsClientLs(link.hash).flatMap(buildIpfsCidDto(_, Some(link))) + case Left(ipfsCid) => + flatRepository + .get(ipfsCid) + .flatMap(maybeCacheHit => { + maybeCacheHit match + case Some(value) => IO(value) + case None => ipfsClientLs(ipfsCid).flatMap(buildIpfsCidDto(_, None)) + }) + case Right(link) => { + flatRepository + .get(link.hash) + .flatMap(maybeCacheHit => { + maybeCacheHit match + case Some(value) => IO(value) + case None => ipfsClientLs(link.hash).flatMap(buildIpfsCidDto(_, Some(link))) + }) + } } private def getIpfsCidDtos(links: List[IpfsLsLinkResponse]): IO[List[IpfsCidDto]] = {