Server responses for grib list and grib structure
This commit is contained in:
@@ -2,6 +2,7 @@ package fetchDMI
|
|||||||
|
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits.toTraverseOps
|
import cats.implicits.toTraverseOps
|
||||||
|
import data.DataService
|
||||||
import fs2.io.file.{CopyFlag, CopyFlags, Files, Path}
|
import fs2.io.file.{CopyFlag, CopyFlags, Files, Path}
|
||||||
import grib.GribParser
|
import grib.GribParser
|
||||||
import org.http4s._
|
import org.http4s._
|
||||||
@@ -61,7 +62,7 @@ class FetchService(log: Logger[IO]) {
|
|||||||
urlWithParams = Uri.unsafeFromString(s"${base.toString}?${queryParams.toString}")
|
urlWithParams = Uri.unsafeFromString(s"${base.toString}?${queryParams.toString}")
|
||||||
request = Request[IO](Method.GET, urlWithParams)
|
request = Request[IO](Method.GET, urlWithParams)
|
||||||
|
|
||||||
tmpPath = Path("data/tmp.grib")
|
tmpPath = Path(s"${DataService.FOLDER}/tmp.grib")
|
||||||
_ <- client.stream(request)
|
_ <- client.stream(request)
|
||||||
.flatMap(_.body)
|
.flatMap(_.body)
|
||||||
.through(Files[IO].writeAll(tmpPath))
|
.through(Files[IO].writeAll(tmpPath))
|
||||||
@@ -69,7 +70,7 @@ class FetchService(log: Logger[IO]) {
|
|||||||
.drain
|
.drain
|
||||||
gribList <- GribParser.parseFile(tmpPath)
|
gribList <- GribParser.parseFile(tmpPath)
|
||||||
gribTime = gribList.head.time
|
gribTime = gribList.head.time
|
||||||
fileName = Path(s"data/harmonie_${gribTime.referenceTime}_${gribTime.forecastTime}.grib".replace(":", ""))
|
fileName = Path(s"${DataService.FOLDER}/harmonie_${gribTime.referenceTime}_${gribTime.forecastTime}.grib".replace(":", ""))
|
||||||
_ <- Files[IO].move(tmpPath, fileName, CopyFlags.apply(CopyFlag.ReplaceExisting))
|
_ <- Files[IO].move(tmpPath, fileName, CopyFlags.apply(CopyFlag.ReplaceExisting))
|
||||||
_ <- log.info(fileName.toString)
|
_ <- log.info(fileName.toString)
|
||||||
fileNameStr = fileName.toString
|
fileNameStr = fileName.toString
|
||||||
|
|||||||
@@ -5,6 +5,7 @@ import fs2.io.file.Path
|
|||||||
import io.circe.generic.auto._
|
import io.circe.generic.auto._
|
||||||
import io.circe.syntax._
|
import io.circe.syntax._
|
||||||
import cats.effect.unsafe.implicits.global
|
import cats.effect.unsafe.implicits.global
|
||||||
|
import data.DataService
|
||||||
|
|
||||||
object GribParserTest {
|
object GribParserTest {
|
||||||
def main(args: Array[String]): Unit = {
|
def main(args: Array[String]): Unit = {
|
||||||
@@ -12,7 +13,8 @@ object GribParserTest {
|
|||||||
println(gribTitle)
|
println(gribTitle)
|
||||||
|
|
||||||
|
|
||||||
val fileName = "data/HARMONIE_DINI_SF_2025-01-24T030000Z_2025-01-26T010000Z.grib"
|
// val fileName = s"${DataService.FOLDER}/HARMONIE_DINI_SF_2025-01-24T030000Z_2025-01-26T010000Z.grib"
|
||||||
|
val fileName = s"${DataService.FOLDER}/harmonie_2025-02-01T1500Z_2025-02-01T180000Z.grib"
|
||||||
val path = Path(fileName)
|
val path = Path(fileName)
|
||||||
|
|
||||||
val program = for {
|
val program = for {
|
||||||
|
|||||||
@@ -3,9 +3,9 @@ package server
|
|||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits.toTraverseOps
|
import cats.implicits.toTraverseOps
|
||||||
import com.comcast.ip4s.IpLiteralSyntax
|
import com.comcast.ip4s.IpLiteralSyntax
|
||||||
|
import data.DataService
|
||||||
import db.PostgresService
|
import db.PostgresService
|
||||||
import fetch.FetchService
|
import fetch.FetchService
|
||||||
import grib.GribParser
|
|
||||||
import parse.Aggregate
|
import parse.Aggregate
|
||||||
import server.ValidateRoutes.{AggFieldList, AggKey, CityList, DateTimeRange, Granularity, ValidateDate, ValidateDateTime, ValidateMonths, ValidateZonedDateTime}
|
import server.ValidateRoutes.{AggFieldList, AggKey, CityList, DateTimeRange, Granularity, ValidateDate, ValidateDateTime, ValidateMonths, ValidateZonedDateTime}
|
||||||
import io.circe.{Json, Printer}
|
import io.circe.{Json, Printer}
|
||||||
@@ -51,15 +51,21 @@ class Server(postgresService: PostgresService, fetch: FetchService, log: Logger[
|
|||||||
private case class ResponseWrapper(result: Map[String, Option[Aggregate.AggregateValue]], query: UserQuery)
|
private case class ResponseWrapper(result: Map[String, Option[Aggregate.AggregateValue]], query: UserQuery)
|
||||||
|
|
||||||
private val apiRoutes = HttpRoutes.of[IO] {
|
private val apiRoutes = HttpRoutes.of[IO] {
|
||||||
// http://0.0.0.0:8080/api/show/grib/2025-01-24T03:00:00Z
|
// http://0.0.0.0:8080/api/show/grib-name/harmonie_2025-02-01T1500Z_2025-02-01T180000Z.grib
|
||||||
// case GET -> Root / "show" / "grib" / ValidateZonedDateTime(referenceTime) =>
|
case GET -> Root / "show" / "grib" / fileName =>
|
||||||
case GET -> Root / "show" / "grib" =>
|
// val fileName = "data/HARMONIE_DINI_SF_2025-01-24T030000Z_2025-01-26T010000Z.grib"
|
||||||
// TODO change from hardcoded value to reference time and forecast time
|
DataService.getGribStucture(fileName).flatMap(response => Ok(response.asJson.pretty))
|
||||||
val fileName = "data/HARMONIE_DINI_SF_2025-01-24T030000Z_2025-01-26T010000Z.grib"
|
|
||||||
GribParser.parseFile(Path(fileName)).flatMap(response => Ok(response.asJson.pretty))
|
|
||||||
|
|
||||||
case GET -> Root / "show" / "gribName" => Ok("{\"fileName\":\"TODO replace this fake name\"}")
|
case GET -> Root / "show" / "gribName" => Ok("{\"fileName\":\"TODO replace this fake name\"}")
|
||||||
|
|
||||||
|
// http://0.0.0.0:8080/api/show/grib-list
|
||||||
|
case GET -> Root / "show" / "grib-list" =>
|
||||||
|
DataService.getFileList().flatMap(fileList => Ok(fileList.asJson))
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
// http://0.0.0.0:8080/api/query/city/Liepāja,Rēzekne/20230414_2200-20230501_1230/hour/tempMax/max
|
// http://0.0.0.0:8080/api/query/city/Liepāja,Rēzekne/20230414_2200-20230501_1230/hour/tempMax/max
|
||||||
case GET -> Root / "query" / "city" / CityList(cities) / DateTimeRange(from, to) / Granularity(granularity) / field / AggKey(key) =>
|
case GET -> Root / "query" / "city" / CityList(cities) / DateTimeRange(from, to) / Granularity(granularity) / field / AggKey(key) =>
|
||||||
val userQuery = UserQuery(cities, field, key, granularity, from, to)
|
val userQuery = UserQuery(cities, field, key, granularity, from, to)
|
||||||
|
|||||||
Reference in New Issue
Block a user