Prechádzať zdrojové kódy

Make all the requests from teams endpoint

theenglishway (time) 2 rokov pred
rodič
commit
9b62395ac2

+ 28 - 21
src/main/scala/BallDontLie.scala

@@ -2,7 +2,6 @@ package balldontlie
 
 import upickle.default._
 import game._
-import requests.Response
 
 case class ResponseMetadata(
     total_pages: Int,
@@ -45,15 +44,7 @@ object GamesResponse {
       Utils.get_json(endpoint, baseParams)
 
     val response: GamesResponse = upickle.default.read[GamesResponse](json)
-    if (response.meta.current_page != response.meta.total_pages) {
-      val json = Utils.get_json(
-        endpoint,
-        baseParams + ("page" -> response.meta.next_page.toString())
-      )
-      Utils.read[GamesResponse](json)
-    } else {
-      response
-    }
+    response.data
   }
 }
 
@@ -62,18 +53,34 @@ object TeamsResponse {
   implicit val teamsResponseR: Reader[TeamsResponse] = macroR[TeamsResponse]
   val endpoint = "https://www.balldontlie.io/api/v1/teams"
 
-  val getTeams: TeamsResponse = {
-    val json = Utils.get_json(endpoint, Nil)
-    val response: TeamsResponse = Utils.read[TeamsResponse](json)
+  val getTeams = {
+    val getDataFromPage = (page: Int) => {
+      val json = Utils.get_json(endpoint, Map("page" -> page.toString()))
+      val response: TeamsResponse = Utils.read[TeamsResponse](json)
+
+      val nextPage =
+        if (response.meta.current_page != response.meta.total_pages) {
+          Some(response.meta.next_page)
+        } else {
+          None
+        }
 
-    if (response.meta.current_page != response.meta.total_pages) {
-      val json = Utils.get_json(
-        endpoint,
-        Map("page" -> response.meta.next_page.toString())
-      )
-      Utils.read[TeamsResponse](json)
-    } else {
-      response
+      (response.data, nextPage)
     }
+
+    def getDataFromAllPages(
+        dataSoFar: List[Team],
+        nextPage: Option[Int]
+    ): List[Team] = {
+      nextPage match {
+        case Some(page) =>
+          val (data, next) = getDataFromPage(page)
+          getDataFromAllPages(dataSoFar ++ data, next)
+        case None =>
+          dataSoFar
+      }
+    }
+
+    getDataFromAllPages(Nil, Some(1))
   }
 }

+ 4 - 1
src/main/scala/json.worksheet.sc

@@ -25,4 +25,7 @@ val response: TeamsResponse = upickle.default.read[TeamsResponse](teams_json)
 
 val teams_p2_string = os.read(wd / "teams_p2.json")
 val teams_p2_json = ujson.read(teams_p2_string)
-upickle.default.read[TeamsResponse](teams_p2_json)
+upickle.default.read[TeamsResponse](teams_p2_json)
+
+val teams = TeamsResponse.getTeams
+teams.size