We'll be adding a feature to Bootzooka, a skeleton Scala microservice/web application project.
This will involve using doobie, monix, tapir, http4s, circe and compile-time dependency injection.
If you'd like to follow along:
| val insertUserInTx: IO[Int] = insertUser.transact(transactor) | |
| // (2) BEGIN; INSERT; COMMIT; sendEmail(); | |
| val result2: IO[Unit] = insertUserInTx.flatMap(_ => sendEmail) | |
| // (3) sendEmail(); BEGIN; INSERT; COMMIT; | |
| val result3: IO[Int] = sendEmail.flatMap(_ => insertUserInTx) |
| // Re-useable effect descriptions | |
| val sendEmail: IO[Unit] = IO(println("Sending email")) | |
| val insertUser: ConnectionIO[Int] = | |
| sql"INSERT INTO users(name, email) VALUES('Emily', 'emily@email.com')" | |
| .update.run | |
| // (1) BEGIN; INSERT; sendEmail(); COMMIT; | |
| val insertThenSend: ConnectionIO[Unit] = | |
| insertUser.flatMap(_ => sendEmail.to[ConnectionIO]) | |
| val sendEmail: IO[Unit] = IO(println("Sending email")) | |
| val sendEmailWithConnection: ConnectionIO[Unit] = | |
| sendEmail.to[ConnectionIO] | |
| val sendEmailInTx: IO[Unit] = sendEmailWithConnection.transact(transactor) |
| (1) BEGIN; INSERT; sendEmail(); COMMIT; | |
| (2) BEGIN; INSERT; COMMIT; sendEmail(); | |
| (3) sendEmail(); BEGIN; INSERT; COMMIT; | |
| (4) BEGIN; sendEmail(); INSERT; COMMIT; |
| def insertPerson(p: Person): ConnectionIO[Int] = | |
| sql"INSERT INTO persons(name, age) VALUES(${p.name}, ${p.age})".update.run | |
| def countPersons: ConnectionIO[Int] = | |
| sql"SELECT COUNT(*) FROM persons".query[Int].unique | |
| val insertAndCount = | |
| insertPerson(Person("Pedro", 81)).flatMap(_ => countPersons) |
| val transactor: Transactor[IO] = ??? | |
| val result: IO[List[Person]] = personsQuery.transact(transactor) | |
| val persons: List[Person] = result.unsafeRunSync() |
| // details on creating a transactor are omitted | |
| val transactor: Transactor[IO] = ??? | |
| val result: IO[List[Person]] = personsQuery.transact(transactor) |
| import doobie._ | |
| import doobie.implicits._ | |
| case class Person(name: String, age: Int) | |
| val personsQuery: ConnectionIO[List[Person]] = | |
| sql"SELECT p.name, p.age FROM persons p".query[Person].to[List] |
We'll be adding a feature to Bootzooka, a skeleton Scala microservice/web application project.
This will involve using doobie, monix, tapir, http4s, circe and compile-time dependency injection.
If you'd like to follow along:
| val TestConfig: Config = DefaultConfig | |
| .modify(_.email.emailSendInterval) | |
| .setTo(100.milliseconds) |