Server fetches and saves files. Also proper error handling

This commit is contained in:
Guntis Smaukstelis
2023-04-23 22:41:38 +03:00
parent 0622177572
commit 31a56bc0d4
6 changed files with 159 additions and 64 deletions
+36 -3
View File
@@ -1,14 +1,21 @@
package server
import cats.effect._
import cats.implicits.toTraverseOps
import db.DBService
import fetch.FetchService
import io.circe.{Json, Printer}
import org.http4s._
import org.http4s.dsl.io._
import org.http4s.implicits._
import org.http4s.server.Router
import org.http4s.server.blaze.BlazeServerBuilder
import io.circe.syntax._
import io.circe.generic.auto._
import org.http4s.circe.jsonEncoder
import parse.{Meteo, Parser}
import java.time.LocalDateTime
import java.time.{LocalDate, LocalDateTime}
import java.time.format.DateTimeFormatter
import scala.util.Try
@@ -45,8 +52,34 @@ object Server extends IOApp {
case _ => BadRequest(s"Invalid request format")
}
case GET -> Root / "fetch" / dateRange =>
???
// http://localhost:3000/fetchDate/20230423
case GET -> Root / "fetchDate" / dateStr => {
val dateFormatter = DateTimeFormatter.ofPattern("yyyyMMdd")
val maybeDate = Try(LocalDate.parse(dateStr, dateFormatter)).toEither
maybeDate match {
case Right(date) => {
val result = for {
fetched <- FetchService.fetchFromDate(date)
(fetchErrors, successDownloads) = fetched.partitionMap(identity)
saved <- successDownloads.traverse { case (name, content) => DBService.save(name, content) }
(saveErrors, successSaves) = saved.partitionMap(identity)
successes = successDownloads.map(s => s"fetched: ${s._1}") ++ successSaves.map(s => s"saved: $s")
errors = fetchErrors.map(e => s"FetchError: ${e.getMessage}") ++ saveErrors.map(e => s"SaveError: ${e.getMessage}")
} yield (successes, errors)
result.flatMap { case (successes, errors) =>
val responseBody = Json.obj(
"errors" -> errors.asJson,
"successes" -> successes.asJson
)
val printer = Printer.spaces2.copy(dropNullValues = true)
val prettyJson = printer.print(responseBody)
Ok(prettyJson)
}
}
case Left(_) => BadRequest("Invalid request format")
}
}
case GET -> Root / "show" / "fetched_dates" =>
???