diff --git a/modules/http4s/src/main/scala/org/legogroup/woof/http4s/CorrelationIdMiddleware.scala b/modules/http4s/src/main/scala/org/legogroup/woof/http4s/CorrelationIdMiddleware.scala index 32daeb0..f85c614 100644 --- a/modules/http4s/src/main/scala/org/legogroup/woof/http4s/CorrelationIdMiddleware.scala +++ b/modules/http4s/src/main/scala/org/legogroup/woof/http4s/CorrelationIdMiddleware.scala @@ -2,6 +2,7 @@ package org.legogroup.woof.http4s import cats.data.{Kleisli, NonEmptyList, OptionT} import cats.effect.kernel.Sync +import cats.effect.std.UUIDGen import cats.syntax.all.* import cats.{Applicative, FlatMap, Monad} import org.http4s.Header.Raw @@ -16,23 +17,18 @@ object CorrelationIdMiddleware: private val defaultTraceHeaderName: CIString = CIString("X-Trace-Id") - trait UUIDGen[F[_]]: - def gen: F[UUID] - given [F[_]: Sync]: UUIDGen[F] = new UUIDGen[F]: - def gen = Sync[F].delay(UUID.randomUUID) - private def getOrGenerate[F[_]: Applicative: UUIDGen](headerName: Option[CIString], request: Request[F]): F[String] = val key = headerName.getOrElse(defaultTraceHeaderName) request.headers .get(key) .map(_.head.value) .fold( - summon[UUIDGen[F]].gen.map(_.toString), + summon[UUIDGen[F]].randomUUID.map(_.toString), )(_.pure[F]) def middleware[F[_]: Logger: Monad: UUIDGen](headerName: Option[CIString] = None): HttpRoutes[F] => HttpRoutes[F] = routes => - Kleisli[([T] =>> OptionT[F, T]), Request[F], Response[F]] { request => + Kleisli[[T] =>> OptionT[F, T], Request[F], Response[F]] { request => val key = headerName.getOrElse(defaultTraceHeaderName) for traceId <- OptionT.liftF(getOrGenerate(headerName, request)) diff --git a/modules/http4s/src/test/scala/org/legogroup/woof/http4s/CorrelationIdMiddlewareSuite.scala b/modules/http4s/src/test/scala/org/legogroup/woof/http4s/CorrelationIdMiddlewareSuite.scala index 8e708f2..5a00ae0 100644 --- a/modules/http4s/src/test/scala/org/legogroup/woof/http4s/CorrelationIdMiddlewareSuite.scala +++ b/modules/http4s/src/test/scala/org/legogroup/woof/http4s/CorrelationIdMiddlewareSuite.scala @@ -1,13 +1,13 @@ package org.legogroup.woof.http4s import cats.data.{Kleisli, OptionT} +import cats.effect.std.UUIDGen import cats.effect.{Clock, IO} import cats.syntax.all.* import cats.{Applicative, Monad} import munit.CatsEffectSuite import org.http4s.{HttpRoutes, Request, Response} import org.legogroup.woof.{*, given} -import org.legogroup.woof.http4s.CorrelationIdMiddleware.UUIDGen import org.typelevel.ci.CIString import java.time.ZoneId @@ -24,9 +24,9 @@ class CorrelationIdMiddlewareSuite extends CatsEffectSuite: given Printer = NoColorPrinter() given Filter = Filter.everything - val testUuid = UUID.fromString("E20A27FE-5142-4E21-BA09-35BC6FB84591") + val testUuid: UUID = UUID.fromString("E20A27FE-5142-4E21-BA09-35BC6FB84591") given UUIDGen[IO] with - def gen = testUuid.pure[IO] + def randomUUID: IO[UUID] = testUuid.pure[IO] test("add trace id with middleware") {