diff --git a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala index 1f8300af..645182a6 100644 --- a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala +++ b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala @@ -7,7 +7,6 @@ import com.azavea.stac4s.jsTypes.TemporalExtent import eu.timepit.refined.types.numeric.NonNegInt import io.circe._ -import io.circe.generic.semiauto._ import io.circe.refined._ case class SearchFilters( @@ -23,13 +22,13 @@ case class SearchFilters( object SearchFilters extends ClientCodecs { - implicit val searchFilterDecoder: Decoder[SearchFilters] = { c => + implicit val searchFiltersDecoder: Decoder[SearchFilters] = { c => for { bbox <- c.downField("bbox").as[Option[Bbox]] datetime <- c.downField("datetime").as[Option[TemporalExtent]] intersects <- c.downField("intersects").as[Option[Geometry]] collectionsOption <- c.downField("collections").as[Option[List[String]]] - itemsOption <- c.downField("items").as[Option[List[String]]] + itemsOption <- c.downField("ids").as[Option[List[String]]] limit <- c.downField("limit").as[Option[NonNegInt]] query <- c.get[Option[Map[String, List[Query]]]]("query") paginationToken <- c.get[Option[PaginationToken]]("next") @@ -47,5 +46,25 @@ object SearchFilters extends ClientCodecs { } } - implicit val searchFilterEncoder: Encoder[SearchFilters] = deriveEncoder + implicit val searchFiltersEncoder: Encoder[SearchFilters] = Encoder.forProduct8( + "bbox", + "datetime", + "intersects", + "collections", + "ids", + "limit", + "query", + "next" + )(filters => + ( + filters.bbox, + filters.datetime, + filters.intersects, + filters.collections, + filters.items, + filters.limit, + filters.query, + filters.next + ) + ) } diff --git a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala index 426c79c9..abc534b1 100644 --- a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala +++ b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala @@ -6,9 +6,6 @@ import sttp.model.Uri object SttpStacClient { - def apply[F[_]: MonadError[*[_], Throwable]]( - client: SttpBackend[F, Any], - baseUri: Uri - ): SttpStacClient[F] = - SttpStacClientF.instance[F, SearchFilters](client, baseUri) + def apply[F[_]: MonadError[*[_], Throwable]](client: SttpBackend[F, Any], baseUri: Uri): SttpStacClient[F] = + SttpStacClientF[F, SearchFilters](client, baseUri) } diff --git a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/package.scala b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/package.scala index 50cc09a1..82f25d01 100644 --- a/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/package.scala +++ b/modules/client/js/src/main/scala/com/azavea/stac4s/api/client/package.scala @@ -1,5 +1,6 @@ package com.azavea.stac4s.api package object client { - type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters] + type StacClient[F[_]] = StacClientF[F, SearchFilters] + type SttpStacClient[F[_]] = SttpStacClientF[F, SearchFilters] } diff --git a/modules/client/js/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala b/modules/client/js/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala index a977f902..14234271 100644 --- a/modules/client/js/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala +++ b/modules/client/js/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala @@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JsInstances import sttp.client3.UriContext -class SttpStacClientSpec extends SttpStacClientFSpec with JsInstances { +class SttpStacClientSpec extends SttpStacClientFSpec[SearchFilters] with JsInstances { lazy val client = SttpStacClient(backend, uri"http://localhost:9090") } diff --git a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala index 0074336f..18ad346b 100644 --- a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala +++ b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SearchFilters.scala @@ -7,7 +7,6 @@ import com.azavea.stac4s.jvmTypes.TemporalExtent import eu.timepit.refined.types.numeric.NonNegInt import geotrellis.vector.{io => _, _} import io.circe._ -import io.circe.generic.semiauto._ import io.circe.refined._ case class SearchFilters( @@ -23,13 +22,13 @@ case class SearchFilters( object SearchFilters extends ClientCodecs { - implicit val searchFilterDecoder: Decoder[SearchFilters] = { c => + implicit val searchFiltersDecoder: Decoder[SearchFilters] = { c => for { bbox <- c.downField("bbox").as[Option[Bbox]] datetime <- c.downField("datetime").as[Option[TemporalExtent]] intersects <- c.downField("intersects").as[Option[Geometry]] collectionsOption <- c.downField("collections").as[Option[List[String]]] - itemsOption <- c.downField("items").as[Option[List[String]]] + itemsOption <- c.downField("ids").as[Option[List[String]]] limit <- c.downField("limit").as[Option[NonNegInt]] query <- c.get[Option[Map[String, List[Query]]]]("query") paginationToken <- c.get[Option[PaginationToken]]("next") @@ -47,5 +46,25 @@ object SearchFilters extends ClientCodecs { } } - implicit val searchFilterEncoder: Encoder[SearchFilters] = deriveEncoder + implicit val searchFiltersEncoder: Encoder[SearchFilters] = Encoder.forProduct8( + "bbox", + "datetime", + "intersects", + "collections", + "ids", + "limit", + "query", + "next" + )(filters => + ( + filters.bbox, + filters.datetime, + filters.intersects, + filters.collections, + filters.items, + filters.limit, + filters.query, + filters.next + ) + ) } diff --git a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala index 426c79c9..abc534b1 100644 --- a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala +++ b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala @@ -6,9 +6,6 @@ import sttp.model.Uri object SttpStacClient { - def apply[F[_]: MonadError[*[_], Throwable]]( - client: SttpBackend[F, Any], - baseUri: Uri - ): SttpStacClient[F] = - SttpStacClientF.instance[F, SearchFilters](client, baseUri) + def apply[F[_]: MonadError[*[_], Throwable]](client: SttpBackend[F, Any], baseUri: Uri): SttpStacClient[F] = + SttpStacClientF[F, SearchFilters](client, baseUri) } diff --git a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/client.scala b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/client.scala index 50cc09a1..82f25d01 100644 --- a/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/client.scala +++ b/modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/client.scala @@ -1,5 +1,6 @@ package com.azavea.stac4s.api package object client { - type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters] + type StacClient[F[_]] = StacClientF[F, SearchFilters] + type SttpStacClient[F[_]] = SttpStacClientF[F, SearchFilters] } diff --git a/modules/client/jvm/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala b/modules/client/jvm/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala index 0f5648a5..8547b947 100644 --- a/modules/client/jvm/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala +++ b/modules/client/jvm/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala @@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JvmInstances import sttp.client3.UriContext -class SttpStacClientSpec extends SttpStacClientFSpec with JvmInstances { +class SttpStacClientSpec extends SttpStacClientFSpec[SearchFilters] with JvmInstances { lazy val client = SttpStacClient(backend, uri"http://localhost:9090") } diff --git a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClientF.scala similarity index 86% rename from modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala rename to modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClientF.scala index 904e3ebc..a5d038bc 100644 --- a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClient.scala +++ b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/StacClientF.scala @@ -4,10 +4,9 @@ import com.azavea.stac4s._ import eu.timepit.refined.types.string.NonEmptyString -trait StacClient[F[_]] { - type Filter +trait StacClientF[F[_], S] { def search: F[List[StacItem]] - def search(filter: Filter): F[List[StacItem]] + def search(filter: S): F[List[StacItem]] def collections: F[List[StacCollection]] def collection(collectionId: NonEmptyString): F[StacCollection] def items(collectionId: NonEmptyString): F[List[StacItem]] diff --git a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala index 5405f774..64073420 100644 --- a/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala +++ b/modules/client/shared/src/main/scala/com/azavea/stac4s/api/client/SttpStacClientF.scala @@ -13,18 +13,13 @@ import sttp.client3.circe.asJson import sttp.client3.{SttpBackend, basicRequest} import sttp.model.Uri -abstract class SttpStacClientF[F[_]: MonadError[*[_], Throwable]]( +case class SttpStacClientF[F[_]: MonadError[*[_], Throwable], S: Encoder]( client: SttpBackend[F, Any], baseUri: Uri -) extends StacClient[F] { - - type Filter - - protected implicit def filterEncoder: Encoder[Filter] - +) extends StacClientF[F, S] { def search: F[List[StacItem]] = search(None) - def search(filter: Filter): F[List[StacItem]] = search(filter.asJson.some) + def search(filter: S): F[List[StacItem]] = search(filter.asJson.some) private def search(filter: Option[Json]): F[List[StacItem]] = client @@ -91,15 +86,3 @@ abstract class SttpStacClientF[F[_]: MonadError[*[_], Throwable]]( .map(_.body) .flatMap(MonadError[F, Throwable].fromEither) } - -object SttpStacClientF { - type Aux[F[_], S] = SttpStacClientF[F] { type Filter = S } - - def instance[F[_]: MonadError[*[_], Throwable], S]( - client: SttpBackend[F, Any], - baseUri: Uri - )(implicit sencoder: Encoder[S]): Aux[F, S] = new SttpStacClientF[F](client, baseUri) { - type Filter = S - protected val filterEncoder: Encoder[Filter] = sencoder - } -} diff --git a/modules/client/shared/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientFSpec.scala b/modules/client/shared/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientFSpec.scala index d2459042..4d54505c 100644 --- a/modules/client/shared/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientFSpec.scala +++ b/modules/client/shared/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientFSpec.scala @@ -16,13 +16,13 @@ import sttp.client3.testing.SttpBackendStub import sttp.model.Method import sttp.monad.EitherMonad -trait SttpStacClientFSpec extends AnyFunSpec with Matchers with BeforeAndAfterAll { +trait SttpStacClientFSpec[S] extends AnyFunSpec with Matchers with BeforeAndAfterAll { def arbCollectionShort: Arbitrary[StacCollection] def arbItemCollectionShort: Arbitrary[ItemCollection] def arbItemShort: Arbitrary[StacItem] - def client: SttpStacClientF[Either[Throwable, *]] + def client: SttpStacClientF[Either[Throwable, *], S] lazy val backend = SttpBackendStub(EitherMonad)