56 lines
1.7 KiB
Scala
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)
|