Skip to content

Commit

Permalink
Rename BasetSttpClient => SttpStacClientF; modify pagination token co…
Browse files Browse the repository at this point in the history
…decs
  • Loading branch information
pomadchin committed Dec 29, 2020
1 parent 6d2ab01 commit 140b105
Show file tree
Hide file tree
Showing 9 changed files with 42 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ object SttpStacClient {
client: SttpBackend[F, Any],
baseUri: Uri
): SttpStacClient[F] =
BaseSttpStacClient.instance[F, SearchFilters](client, baseUri)
SttpStacClientF.instance[F, SearchFilters](client, baseUri)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.azavea.stac4s.api

package object client {
type SttpStacClient[F[_]] = BaseSttpStacClient.Aux[F, SearchFilters]
type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters]
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JsInstances

import sttp.client3.UriContext

class SttpStacClientSpec extends BaseSttpStacClientSpec with JsInstances {
class SttpStacClientSpec extends SttpStacClientFSpec with JsInstances {
lazy val client = SttpStacClient(backend, uri"http://localhost:9090")
}
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,5 @@ object SttpStacClient {
client: SttpBackend[F, Any],
baseUri: Uri
): SttpStacClient[F] =
BaseSttpStacClient.instance[F, SearchFilters](client, baseUri)
SttpStacClientF.instance[F, SearchFilters](client, baseUri)
}
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
package com.azavea.stac4s.api

package object client {
type SttpStacClient[F[_]] = BaseSttpStacClient.Aux[F, SearchFilters]
type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters]
}
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JvmInstances

import sttp.client3.UriContext

class SttpStacClientSpec extends BaseSttpStacClientSpec with JvmInstances {
class SttpStacClientSpec extends SttpStacClientFSpec with JvmInstances {
lazy val client = SttpStacClient(backend, uri"http://localhost:9090")
}
Original file line number Diff line number Diff line change
@@ -1,15 +1,43 @@
package com.azavea.stac4s.api.client

import cats.syntax.either._
import eu.timepit.refined.types.numeric.PosInt
import io.circe
import io.circe.generic.semiauto._
import io.circe.parser.parse
import io.circe.refined._
import io.circe.syntax._
import io.circe.{Decoder, Encoder}

import java.time.Instant
import java.util.Base64

final case class PaginationToken(timestampAtLeast: Instant, serialIdGreaterThan: PosInt)

/** Circe codecs should encode token into a base64 string
* https://github.com/azavea/franklin/blob/f5be8ddf48661c5bc43cbd22cb7277e961641803/application/src/main/scala/com/azavea/franklin/api/schemas/package.scala#L84-L85
*/
object PaginationToken {
implicit val dec: Decoder[PaginationToken] = deriveDecoder
implicit val enc: Encoder[PaginationToken] = deriveEncoder
val b64Encoder = Base64.getEncoder
val b64Decoder = Base64.getDecoder

val defaultDecoder: Decoder[PaginationToken] = deriveDecoder
val defaultEncoder: Encoder[PaginationToken] = deriveEncoder

def encPaginationToken(token: PaginationToken): String = b64Encoder.encodeToString(
token.asJson(defaultEncoder).noSpaces.getBytes
)

def decPaginationToken(encoded: String): Either[circe.Error, PaginationToken] = {
val jsonString = new String(b64Decoder.decode(encoded))
for {
js <- parse(jsonString)
decoded <- js.as[PaginationToken](defaultDecoder)
} yield decoded
}

implicit val dec: Decoder[PaginationToken] =
Decoder.decodeString.emap(str => decPaginationToken(str).leftMap(_.getMessage))

implicit val enc: Encoder[PaginationToken] = { encPaginationToken(_).asJson }
}
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@ import sttp.client3.circe.asJson
import sttp.client3.{SttpBackend, basicRequest}
import sttp.model.Uri

abstract class BaseSttpStacClient[F[_]: MonadError[*[_], Throwable]](
abstract class SttpStacClientF[F[_]: MonadError[*[_], Throwable]](
client: SttpBackend[F, Any],
baseUri: Uri
) extends StacClient[F] {
Expand Down Expand Up @@ -92,13 +92,13 @@ abstract class BaseSttpStacClient[F[_]: MonadError[*[_], Throwable]](
.flatMap(MonadError[F, Throwable].fromEither)
}

object BaseSttpStacClient {
type Aux[F[_], S] = BaseSttpStacClient[F] { type Filter = S }
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 BaseSttpStacClient[F](client, baseUri) {
)(implicit sencoder: Encoder[S]): Aux[F, S] = new SttpStacClientF[F](client, baseUri) {
type Filter = S
protected val filterEncoder: Encoder[Filter] = sencoder
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -15,13 +15,13 @@ import sttp.client3.testing.SttpBackendStub
import sttp.model.Method
import sttp.monad.EitherMonad

trait BaseSttpStacClientSpec extends AnyFunSpec with Matchers with BeforeAndAfterAll {
trait SttpStacClientFSpec extends AnyFunSpec with Matchers with BeforeAndAfterAll {

def arbCollectionShort: Arbitrary[StacCollection]
def arbItemCollectionShort: Arbitrary[ItemCollection]
def arbItemShort: Arbitrary[StacItem]

def client: BaseSttpStacClient[Either[Throwable, *]]
def client: SttpStacClientF[Either[Throwable, *]]

lazy val backend =
SttpBackendStub(EitherMonad)
Expand Down

0 comments on commit 140b105

Please sign in to comment.