Scala-Play-Slick-Demo/modules/slick/src/main/scala/com/example/user/slick/services/SlickLibraryService.scala
2020-05-16 15:40:23 +05:30

56 lines
1.7 KiB
Scala

package com.example.user.slick.services
import javax.inject._
import scala.concurrent.ExecutionContext
// import slick.jdbc.JdbcProfile
import slick.jdbc.JdbcBackend.Database
import scala.concurrent.Future
import com.example.models._
import com.example.user.slick.dbios.SlickLibraryDbio
import com.example.services.LibraryService
// import slick.jdbc.H2Profile.api._
@Singleton
class SlickLibraryService @Inject() (
db: Database,
libraryDbio: SlickLibraryDbio
)(implicit ec: ExecutionContext)
extends LibraryService {
import libraryDbio.profile.api._
// Simple function that returns a book
def findBookById(id: Long): Future[Option[Book]] =
db.run(libraryDbio.findBookById(id).map(_.map(libraryDbio.booksRowToBooks)))
// Simple function that returns a list of books with it's author
def findBooksWithAuthor: Future[Seq[(Book, Author)]] =
db.run(libraryDbio.findBooksWithAuthor.map { lst =>
lst.map(tup => {
val (x, y) = tup
(libraryDbio.booksRowToBooks(x), libraryDbio.authorsRowToAuthor(y))
})
})
// Insert a book and an author composing two DBIOs in a transaction
def insertBookAndAuthor(
book: NewBook,
author: NewAuthor
): Future[(Long, Long)] = {
val action = for {
authorId <- libraryDbio.insertAuthor2(author)
bookId <- libraryDbio.insertBook2(book.copy(authorId = authorId))
} yield (
// libraryDbio.booksRowToBooks(book),
// libraryDbio.authorsRowToAuthor(author)
bookId,
authorId
)
db.run(action.transactionally)
}
def findBookById2(id: Long) =
db.run(libraryDbio.findBookById(id).map(_.map(_.title)))
}
case class Book2(title: String)