/
DAO.scala
90 lines (74 loc) · 2.38 KB
/
DAO.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
package models
import slick.driver.PostgresDriver.api._
import scala.concurrent.Future
import scala.concurrent.ExecutionContext.Implicits.global
import play.api.db.DB
import play.api.Play.current
trait DAOComponent {
def insert(employee: Employee): Future[Int]
def update(id: Long, employee: Employee): Future[Int]
def delete(id: Long): Future[Int]
def list(page: Int = 0, pageSize: Int = 10, orderBy: Int = 1, filter: String = "%"): Future[Page[Employee]]
def findById(id: Long): Future[Employee]
def count: Future[Int]
}
object DAO extends DAOComponent {
private val employees = TableQuery[Employees]
private def db: Database = Database.forDataSource(DB.getDataSource())
/**
* Filter employee with id
*/
private def filterQuery(id: Long): Query[Employees, Employee, Seq] =
employees.filter(_.id === id)
/**
* Count employees with a filter
*/
private def count(filter: String): Future[Int] =
try db.run(employees.filter(_.name.toLowerCase like filter.toLowerCase()).length.result)
finally db.close
/**
* Count total employees in database
*/
override def count: Future[Int] =
try db.run(employees.length.result)
finally db.close
/**
* Find employee by id
*/
override def findById(id: Long): Future[Employee] =
try db.run(filterQuery(id).result.head)
finally db.close
/**
* Create a new employee
*/
override def insert(employee: Employee): Future[Int] =
try db.run(employees += employee)
finally db.close
/**
* Update employee with id
*/
override def update(id: Long, employee: Employee): Future[Int] =
try db.run(filterQuery(id).update(employee))
finally db.close
/**
* Delete employee with id
*/
override def delete(id: Long): Future[Int] =
try db.run(filterQuery(id).delete)
finally db.close
/**
* Return a page of employees
*/
override def list(page: Int = 0, pageSize: Int = 10, orderBy: Int = 1, filter: String = "%"): Future[Page[Employee]] = {
try {
val offset = pageSize * page
val query =
(for {
employee <- employees if employee.name.toLowerCase like filter.toLowerCase
} yield (employee)).drop(offset).take(pageSize)
val totalRows = count(filter)
val result = db.run(query.result)
result flatMap (employees => totalRows map (rows => Page(employees, page, offset, rows)))
} finally { db.close() }
}
}