From 09449b5675c31f48576e4d7f7c3af35e8617225d Mon Sep 17 00:00:00 2001 From: Guntis Smaukstelis Date: Tue, 11 Feb 2025 11:33:27 +0200 Subject: [PATCH] Delete old grib files more than 9hours old --- src/main/scala/data/DataService.scala | 17 +++++++++++++++++ src/main/scala/data/DataServiceTest.scala | 20 +++++++++++++++++--- 2 files changed, 34 insertions(+), 3 deletions(-) diff --git a/src/main/scala/data/DataService.scala b/src/main/scala/data/DataService.scala index bbad0fb..20af4ee 100644 --- a/src/main/scala/data/DataService.scala +++ b/src/main/scala/data/DataService.scala @@ -1,6 +1,7 @@ package data import cats.effect.IO +import cats.implicits.toTraverseOps import fs2.io.file.{Files, Path} import grib.{Grib, GribParser} @@ -48,6 +49,22 @@ object DataService { } } + def deleteOldForecasts(maxHours: Int = 9): IO[List[String]] = { + val nowUTC = ZonedDateTime.now(ZoneOffset.UTC) + val oldThreshold = nowUTC.minusHours(maxHours) + + for { + fileList <- getFileList() + fileDateList = fileList.flatMap(fileName => + getTimeFromName(fileName).map(extracted => (fileName, extracted._1)) + ) + deleteList = fileDateList.filter(_._2.isBefore(oldThreshold)).map(_._1) + _ <- deleteList.traverse(name => Files[IO].delete(Path(s"$FOLDER/${name}"))) + // TODO change to log + _ <- deleteList.traverse(name => IO.println(s"delete: $name")) + } yield deleteList + } + private def getTimeFromName(filename: String): Option[(ZonedDateTime, ZonedDateTime)] = { Try { val formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HHmm'Z'").withZone(ZoneId.of("UTC")) diff --git a/src/main/scala/data/DataServiceTest.scala b/src/main/scala/data/DataServiceTest.scala index fb66999..aa56bff 100644 --- a/src/main/scala/data/DataServiceTest.scala +++ b/src/main/scala/data/DataServiceTest.scala @@ -6,11 +6,25 @@ import io.circe.syntax.EncoderOps object DataServiceTest { def main(args: Array[String]): Unit = { +// getForecasts().unsafeRunSync() + deleteOldForecasts().unsafeRunSync() + } + + private def deleteOldForecasts(): IO[Unit] = { val program = for { - forecasts <- DataService.getForecasts() - _ <- IO.println(forecasts.asJson) + deleteList <- DataService.deleteOldForecasts() +// _ <- IO.println(deleteList.asJson) } yield () - program.unsafeRunSync() + program + } + + private def getForecasts(): IO[Unit] = { + val program = for { + forecasts <- DataService.getForecasts() + _ <- IO.println(forecasts.asJson) + } yield () + + program } }