FetchSingleFile with Either

This commit is contained in:
Guntis Smaukstelis
2023-05-20 23:05:30 +03:00
parent b4955e2619
commit 5744f5c214
3 changed files with 19 additions and 10 deletions
+9 -6
View File
@@ -50,14 +50,17 @@ object FetchService {
} }
} }
def fetchSingleFile(fileName: String): IO[(String, String)] = { def fetchSingleFile(fileName: String): IO[Either[Throwable, (String, String)]] = {
fetchFiles(List(fileName)).flatMap { results => fetchFiles(List(fileName)).map { results =>
results.headOption match { results.headOption match {
case Some(Right(result)) => IO.pure(result) case Some(Right(result)) =>
case Some(Left(err)) => IO.raiseError(err) IO.println(s"fetched: $fileName").as(Right(result))
case None => IO.raiseError(new Exception("No file fetched")) case Some(Left(err)) =>
IO.println(s"failed fetch: $fileName with error: ${err.getMessage}").as(Left(err))
case None =>
IO.println(s"failed fetch: $fileName").as(Left(new Exception("No file fetched")))
} }
} }.flatten
} }
def fetchInRange(from: LocalDateTime, to: LocalDateTime): IO[List[Either[Throwable, (String, String)]]] = { def fetchInRange(from: LocalDateTime, to: LocalDateTime): IO[List[Either[Throwable, (String, String)]]] = {
@@ -18,11 +18,17 @@ class FileFetchScheduler(dbService: DBService, log: Logger[IO]) {
def run: Stream[IO, Unit] = { def run: Stream[IO, Unit] = {
val fetchTask = FileNameService.generateCurrentHour.flatMap(FetchService.fetchSingleFile) val fetchTask = FileNameService.generateCurrentHour.flatMap(FetchService.fetchSingleFile)
Scheduler.scheduleTask(fetchTask) Scheduler.scheduleTask(fetchTask)
.evalMap { case (name, content) => .evalMap {
log.info(s"fetched: $name") *> case Left(fetchErr) =>
log.error(s"Fetch error: $fetchErr")
case Right((name, content)) =>
dbService.save(name, content).attempt.flatMap { dbService.save(name, content).attempt.flatMap {
case Right(savedName) => log.info(s"saved: $savedName")
case Left(err) => log.error(s"error: $err") case Left(err) => log.error(s"error: $err")
case Right(saveResult) => saveResult match {
case Left(err) => log.error(s"error: $err")
case Right(savedName) => log.info(s"saved: $savedName")
}
} }
} }
} }
+1 -1
View File
@@ -32,7 +32,7 @@ object Scheduler {
// } // }
// } // }
def scheduleTask(task: IO[(String, String)]): Stream[IO, (String, String)] = { def scheduleTask(task: IO[Either[Throwable, (String, String)]]): Stream[IO, Either[Throwable, (String, String)]] = {
Stream.eval(durationToNextHalfHour).flatMap { delay => { Stream.eval(durationToNextHalfHour).flatMap { delay => {
Stream.eval(IO.println(s"Scheduler started with delay: ${delay.toMinutes} min")) *> Stream.eval(IO.println(s"Scheduler started with delay: ${delay.toMinutes} min")) *>
(Stream.sleep[IO](delay) ++ Stream.awakeEvery[IO](1.hour)) (Stream.sleep[IO](delay) ++ Stream.awakeEvery[IO](1.hour))