package net.bestqa
import cats.effect.{ExitCode, IO, IOApp}
import org.http4s.HttpRoutes
import org.http4s.dsl.io._
import org.http4s.implicits._
import org.http4s.ember.server.EmberServerBuilder
import io.circe.generic.auto._
import org.http4s.circe.CirceEntityEncoder._
import cats.syntax.*
import com.comcast.ip4s.port
import doobie.util.transactor.Transactor
import doobie.implicits.*
import io.getquill.{idiom => _, *}
import io.getquill.doobie.DoobieContext
import doobie._
object Http4DoobieQuillSqliteServer extends IOApp {
val ctx = new DoobieContext.SQLite(LowerCase)
import ctx._
case class Actor(id: Int, name: String)
def findGreatId = ctx.run(
quote {
query[Actor].filter(_.id > 3)
}
)
def findAllActors(xa: Transactor[IO]) = {
val query = sql"select id, name from actor".query[Actor]
val action = query.to[List]
action.transact(xa)
}
case class Message(content: String)
def routes(xa: Transactor[IO]): HttpRoutes[IO] = HttpRoutes.of[IO] {
case GET -> Root => Ok(Message("Hello, from http4s-ember-demo!"))
case GET -> Root / "actors" => Ok(findAllActors(xa))
case GET -> Root / "actors_quill" => Ok(findGreatId.transact(xa))
}
override def run(args: List[String]) =
val xa = Transactor.fromDriverManager[IO](
"org.sqlite.JDBC", // JDBC driver class
"jdbc:sqlite:/home/hwu/dev/bestqa_scala/data/lite", // Connection URL
"", // User
"" // Password
)
EmberServerBuilder
.default[IO]
.withHttpApp(routes(xa).orNotFound)
.withPort(port"9955")
.build
.use(_ => IO.never) // Ensuring the server runs indefinitely
.as(ExitCode.Success)
}