...

/

Functions for Data Access

Functions for Data Access

Learn how to implement functions to manipulate data and carry out main service.

We'll cover the following...

Slick repository functions

Now, our repository needs some functions for more convenient access to the data.

Press + to interact
def loadProduct(id: ProductId): Future[Seq[(UUID, String, String)]] = {
val program = for {
(p, ns) <- productsTable
.filter(_.id === id)
.join(namesTable)
.on(_.id === _.productId)
} yield (p.id, ns.langCode, ns.name)
dbConfig.db.run(program.result)
}
def loadProducts(): DatabasePublisher[(UUID, String, String)] = {
val program = for {
(p, ns) <- productsTable.join(namesTable)
.on(_.id === _.productId).sortBy(_._1.id)
} yield (p.id, ns.langCode, ns.name)
dbConfig.db.stream(program.result)
}
def saveProduct(p: Product): Future[List[Int]] = {
val cp = productsTable += (p.id)
val program = DBIO.sequence(
cp :: saveTranslations(p).toList
).transactionally
dbConfig.db.run(program)
}
def updateProduct(p: Product): Future[List[Int]] = {
val program = namesTable
.filter(_.productId === p.id)
.delete
.andThen(DBIO.sequence(saveTranslations(p).toList))
.transactionally 33 dbConfig.db.run(program)
}
protected def saveTranslations(p: Product): NonEmptyList[DBIO[Int]] = {
val save = saveTranslation(p.id)(_)
p.names.toNonEmptyList.map(t => save(t))
}
/* Create a query to insert or update a given translation in the database.
* @param id The unique ID of the product.
* @param t The translation to be saved.
* @return A composable sql query for Slick.
*/
protected def saveTranslation(id: ProductId)(t: Translation): DBIO[Int] =
namesTable.insertOrUpdate((id, t.lang, t.name))

The saveTranslations and saveTranslation functions are helpers that enable us to create and load queries that we can compose. They are used in the ...

Access this course and 1400+ top-rated courses and projects.