瀏覽代碼

Add a parametrized EndpointResponse type

theenglishway (time) 2 年之前
父節點
當前提交
d29aae1d78
共有 1 個文件被更改,包括 53 次插入0 次删除
  1. 53 0
      src/main/scala/BallDontLie.scala

+ 53 - 0
src/main/scala/BallDontLie.scala

@@ -88,3 +88,56 @@ object TeamsResponse {
     getDataFromAllPages(Nil, Some(1))
   }
 }
+
+case class EndpointResponse[T](data: T, meta: ResponseMetadata) {
+  type Params = Iterable[(String, String)]
+
+  def getNext() = {
+    if (meta.next_page == 0) {
+      None
+    } else {
+      Some(meta.next_page)
+    }
+  }
+}
+
+object EndpointResponse {
+  type ListOfTeams = List[Team]
+  type TeamsResponse = EndpointResponse[ListOfTeams]
+
+  def doPaginatedRequest[T: Reader](
+      endpoint: String,
+      page: Int,
+      per_page: Int,
+      params: Map[String, Any] = Map()
+  ) = {
+    Utils
+      .get_and_decode[T](
+        endpoint,
+        params ++ Map("page" -> page, "per_page" -> per_page)
+      )
+  }
+
+  def getTeams(): ListOfTeams = {
+    implicit val teamsResponseR: Reader[TeamsResponse] = macroR[TeamsResponse]
+
+    def getAllData(
+        endpoint: String,
+        params: Map[String, Any] = Map()
+    ) = {
+      val response = doPaginatedRequest[TeamsResponse](endpoint, 1, 25, params)
+      response.getNext() match {
+        case Some(page) =>
+          response.data ++ (doPaginatedRequest[TeamsResponse](
+            endpoint,
+            page,
+            25,
+            params
+          )).data
+        case None => response.data
+      }
+    }
+
+    getAllData("https://www.balldontlie.io/api/v1/teams")
+  }
+}