package shop.http.routes import cats._ import org.http4s._ import org.http4s.dsl.Http4sDsl import org.http4s.server.Router import shop.algebras.Items import shop.domain.brand._ import shop.http.json._ import shop.http.params._ final class ItemRoutes[F[_]: Defer: Monad]( items: Items[F] ) extends Http4sDsl[F] { private[routes] val prefixPath = "/items" object BrandQueryParam extends OptionalQueryParamDecoderMatcher[BrandParam]("brand") private val httpRoutes: HttpRoutes[F] = HttpRoutes.of[F] { case GET -> Root :? BrandQueryParam(brand) => Ok(brand.fold(items.findAll)(b => items.findBy(b.toDomain))) } val routes: HttpRoutes[F] = Router( prefixPath -> httpRoutes ) }