You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

67 lines
1.9 KiB

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._
override def getAuthorsForBook(id: Long): Future[Seq[(Author, Book)]] = {
db.run {
libraryDbio
.getAuthorsForBook(id)
.map(_.map {
case (x, y) => {
(libraryDbio.authorsRowToAuthor(x), libraryDbio.booksRowToBooks(y))
}
})
}
}
// 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)