Skip to content

Commit 140b105

Browse files
committed
Rename BasetSttpClient => SttpStacClientF; modify pagination token codecs
1 parent 6d2ab01 commit 140b105

File tree

9 files changed

+42
-14
lines changed

9 files changed

+42
-14
lines changed

modules/client/js/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ object SttpStacClient {
1010
client: SttpBackend[F, Any],
1111
baseUri: Uri
1212
): SttpStacClient[F] =
13-
BaseSttpStacClient.instance[F, SearchFilters](client, baseUri)
13+
SttpStacClientF.instance[F, SearchFilters](client, baseUri)
1414
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.azavea.stac4s.api
22

33
package object client {
4-
type SttpStacClient[F[_]] = BaseSttpStacClient.Aux[F, SearchFilters]
4+
type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters]
55
}

modules/client/js/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JsInstances
44

55
import sttp.client3.UriContext
66

7-
class SttpStacClientSpec extends BaseSttpStacClientSpec with JsInstances {
7+
class SttpStacClientSpec extends SttpStacClientFSpec with JsInstances {
88
lazy val client = SttpStacClient(backend, uri"http://localhost:9090")
99
}

modules/client/jvm/src/main/scala/com/azavea/stac4s/api/client/SttpStacClient.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,5 +10,5 @@ object SttpStacClient {
1010
client: SttpBackend[F, Any],
1111
baseUri: Uri
1212
): SttpStacClient[F] =
13-
BaseSttpStacClient.instance[F, SearchFilters](client, baseUri)
13+
SttpStacClientF.instance[F, SearchFilters](client, baseUri)
1414
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
package com.azavea.stac4s.api
22

33
package object client {
4-
type SttpStacClient[F[_]] = BaseSttpStacClient.Aux[F, SearchFilters]
4+
type SttpStacClient[F[_]] = SttpStacClientF.Aux[F, SearchFilters]
55
}

modules/client/jvm/src/test/scala/com/azavea/stac4s/api/client/SttpStacClientSpec.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,6 @@ import com.azavea.stac4s.testing.JvmInstances
44

55
import sttp.client3.UriContext
66

7-
class SttpStacClientSpec extends BaseSttpStacClientSpec with JvmInstances {
7+
class SttpStacClientSpec extends SttpStacClientFSpec with JvmInstances {
88
lazy val client = SttpStacClient(backend, uri"http://localhost:9090")
99
}
Lines changed: 30 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,43 @@
11
package com.azavea.stac4s.api.client
22

3+
import cats.syntax.either._
34
import eu.timepit.refined.types.numeric.PosInt
5+
import io.circe
46
import io.circe.generic.semiauto._
7+
import io.circe.parser.parse
58
import io.circe.refined._
9+
import io.circe.syntax._
610
import io.circe.{Decoder, Encoder}
711

812
import java.time.Instant
13+
import java.util.Base64
914

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

17+
/** Circe codecs should encode token into a base64 string
18+
* https://github.com/azavea/franklin/blob/f5be8ddf48661c5bc43cbd22cb7277e961641803/application/src/main/scala/com/azavea/franklin/api/schemas/package.scala#L84-L85
19+
*/
1220
object PaginationToken {
13-
implicit val dec: Decoder[PaginationToken] = deriveDecoder
14-
implicit val enc: Encoder[PaginationToken] = deriveEncoder
21+
val b64Encoder = Base64.getEncoder
22+
val b64Decoder = Base64.getDecoder
23+
24+
val defaultDecoder: Decoder[PaginationToken] = deriveDecoder
25+
val defaultEncoder: Encoder[PaginationToken] = deriveEncoder
26+
27+
def encPaginationToken(token: PaginationToken): String = b64Encoder.encodeToString(
28+
token.asJson(defaultEncoder).noSpaces.getBytes
29+
)
30+
31+
def decPaginationToken(encoded: String): Either[circe.Error, PaginationToken] = {
32+
val jsonString = new String(b64Decoder.decode(encoded))
33+
for {
34+
js <- parse(jsonString)
35+
decoded <- js.as[PaginationToken](defaultDecoder)
36+
} yield decoded
37+
}
38+
39+
implicit val dec: Decoder[PaginationToken] =
40+
Decoder.decodeString.emap(str => decPaginationToken(str).leftMap(_.getMessage))
41+
42+
implicit val enc: Encoder[PaginationToken] = { encPaginationToken(_).asJson }
1543
}
Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ import sttp.client3.circe.asJson
1313
import sttp.client3.{SttpBackend, basicRequest}
1414
import sttp.model.Uri
1515

16-
abstract class BaseSttpStacClient[F[_]: MonadError[*[_], Throwable]](
16+
abstract class SttpStacClientF[F[_]: MonadError[*[_], Throwable]](
1717
client: SttpBackend[F, Any],
1818
baseUri: Uri
1919
) extends StacClient[F] {
@@ -92,13 +92,13 @@ abstract class BaseSttpStacClient[F[_]: MonadError[*[_], Throwable]](
9292
.flatMap(MonadError[F, Throwable].fromEither)
9393
}
9494

95-
object BaseSttpStacClient {
96-
type Aux[F[_], S] = BaseSttpStacClient[F] { type Filter = S }
95+
object SttpStacClientF {
96+
type Aux[F[_], S] = SttpStacClientF[F] { type Filter = S }
9797

9898
def instance[F[_]: MonadError[*[_], Throwable], S](
9999
client: SttpBackend[F, Any],
100100
baseUri: Uri
101-
)(implicit sencoder: Encoder[S]): Aux[F, S] = new BaseSttpStacClient[F](client, baseUri) {
101+
)(implicit sencoder: Encoder[S]): Aux[F, S] = new SttpStacClientF[F](client, baseUri) {
102102
type Filter = S
103103
protected val filterEncoder: Encoder[Filter] = sencoder
104104
}
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,13 +15,13 @@ import sttp.client3.testing.SttpBackendStub
1515
import sttp.model.Method
1616
import sttp.monad.EitherMonad
1717

18-
trait BaseSttpStacClientSpec extends AnyFunSpec with Matchers with BeforeAndAfterAll {
18+
trait SttpStacClientFSpec extends AnyFunSpec with Matchers with BeforeAndAfterAll {
1919

2020
def arbCollectionShort: Arbitrary[StacCollection]
2121
def arbItemCollectionShort: Arbitrary[ItemCollection]
2222
def arbItemShort: Arbitrary[StacItem]
2323

24-
def client: BaseSttpStacClient[Either[Throwable, *]]
24+
def client: SttpStacClientF[Either[Throwable, *]]
2525

2626
lazy val backend =
2727
SttpBackendStub(EitherMonad)

0 commit comments

Comments
 (0)