Implement FileFetchScheduler and refactor Main class
This commit is contained in:
@@ -0,0 +1,29 @@
|
|||||||
|
package fetch
|
||||||
|
|
||||||
|
import cats.effect.IO
|
||||||
|
import db.DBService
|
||||||
|
import fs2.Stream
|
||||||
|
import org.typelevel.log4cats.Logger
|
||||||
|
import org.typelevel.log4cats.slf4j.Slf4jLogger
|
||||||
|
|
||||||
|
|
||||||
|
object FileFetchScheduler {
|
||||||
|
def of(dbService: DBService): IO[FileFetchScheduler] = {
|
||||||
|
Slf4jLogger.create[IO].map {
|
||||||
|
new FileFetchScheduler(dbService, _)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
class FileFetchScheduler(dbService: DBService, log: Logger[IO]) {
|
||||||
|
def run: Stream[IO, Unit] = {
|
||||||
|
val fetchTask = FileNameService.generateCurrentHour.flatMap(FetchService.fetchSingleFile)
|
||||||
|
Scheduler.scheduleTask(fetchTask)
|
||||||
|
.evalMap { case (name, content) =>
|
||||||
|
log.info(s"fetched: $name") *>
|
||||||
|
dbService.save(name, content).attempt.flatMap {
|
||||||
|
case Right(savedName) => log.info(s"saved: $savedName")
|
||||||
|
case Left(err) => log.error(s"error: $err")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,9 +1,8 @@
|
|||||||
package server
|
package fetch
|
||||||
|
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.effect.unsafe.implicits.global
|
import cats.effect.unsafe.implicits.global
|
||||||
import cats.implicits.catsSyntaxApply
|
import cats.implicits.catsSyntaxApply
|
||||||
import fetch.{FetchService, FileNameService}
|
|
||||||
import fs2.Stream
|
import fs2.Stream
|
||||||
|
|
||||||
import java.time.{Duration, LocalTime}
|
import java.time.{Duration, LocalTime}
|
||||||
@@ -1,26 +1,18 @@
|
|||||||
package server
|
package server
|
||||||
import cats.effect._
|
import cats.effect._
|
||||||
import cats.implicits.catsSyntaxTuple2Parallel
|
import cats.implicits.catsSyntaxTuple2Parallel
|
||||||
|
|
||||||
import db.DBService
|
import db.DBService
|
||||||
import fetch.{FetchService, FileNameService}
|
import fetch.FileFetchScheduler
|
||||||
|
|
||||||
object Main extends IOApp {
|
object Main extends IOApp {
|
||||||
def run(args: List[String]): IO[ExitCode] = {
|
def run(args: List[String]): IO[ExitCode] = {
|
||||||
for {
|
for {
|
||||||
dbService <- DBService.of
|
dbService <- DBService.of
|
||||||
fetchTask = FileNameService.generateCurrentHour.flatMap(FetchService.fetchSingleFile)
|
fileFetchScheduler <- FileFetchScheduler.of(dbService)
|
||||||
scheduler = Scheduler.scheduleTask(fetchTask)
|
schedulerTask = fileFetchScheduler.run.compile.drain
|
||||||
.evalMap { case (name, content) =>
|
serverTask = Server.run
|
||||||
IO(println(s"fetched: $name")) *>
|
exitCode <- (serverTask, schedulerTask).parMapN((_, _) => ExitCode.Success)
|
||||||
dbService.save(name, content).attempt.flatMap {
|
|
||||||
case Right(savedName) => IO(println(s"File saved: $savedName"))
|
|
||||||
case Left(err) => IO(println(s"Error: $err"))
|
|
||||||
}
|
|
||||||
}.compile.drain // Convert Stream[IO, Unit] to IO[Unit]
|
|
||||||
|
|
||||||
server = Server.run // This is an IO[Server]
|
|
||||||
|
|
||||||
exitCode <- (server, scheduler).parMapN((_, _) => ExitCode.Success)
|
|
||||||
} yield exitCode
|
} yield exitCode
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user