aboutsummaryrefslogtreecommitdiff
path: root/app/controllers/Authentication.scala
diff options
context:
space:
mode:
Diffstat (limited to 'app/controllers/Authentication.scala')
-rw-r--r--app/controllers/Authentication.scala92
1 files changed, 92 insertions, 0 deletions
diff --git a/app/controllers/Authentication.scala b/app/controllers/Authentication.scala
new file mode 100644
index 0000000..f9772e2
--- /dev/null
+++ b/app/controllers/Authentication.scala
@@ -0,0 +1,92 @@
1package controllers
2
3import play.api._
4import play.api.data._
5import play.api.data.Forms._
6import play.api.mvc._
7
8import play.api.db.slick._
9import play.api.db.slick.Config.driver.simple._
10import play.api.Play.current
11
12import scala.concurrent.Future
13
14import models._
15
16
17case class AuthRequest[A](account: Option[Views.Account] = None, request: Request[A]) extends WrappedRequest(request)
18
19object Auth extends ActionBuilder[AuthRequest] {
20
21 def invokeBlock[A](request: Request[A], block: (AuthRequest[A]) => Future[Result]) = DB.withSession { implicit session =>
22 val uuid = request.session.get(Security.username)
23 var account: Option[Views.Account] = None
24
25 if (uuid.nonEmpty) {
26 val resultSet = Views.Accounts.filter(_.userUuid === uuid).run
27 if (resultSet.nonEmpty) {
28 account = Some(resultSet.head)
29 }
30 }
31
32 block(AuthRequest(account, request))
33 }
34
35}
36
37
38case class LoginData(username: String, password: String)
39
40object Authentication extends Controller {
41
42 val loginForm = Form(
43 mapping(
44 "username" -> nonEmptyText,
45 "password" -> nonEmptyText
46 )(LoginData.apply)(LoginData.unapply)
47 verifying("Log in failed.", fields => fields match {
48 case loginData => checkLoginData(loginData.username, loginData.password)
49 })
50 )
51
52 def checkLoginData(username: String, password: String) = DB.withSession { implicit session =>
53 Tables.Users.filter(u => u.username === username && u.userPassword === password).length.run > 0
54 }
55
56
57 def login = Auth { implicit request =>
58 if (request.account.isEmpty) {
59 Ok(views.html.pages.loginForm(loginForm))
60 } else {
61 Redirect(routes.Application.index())
62 }
63 }
64
65 def loginSubmit = Auth { implicit request =>
66 DB.withSession { implicit session =>
67 loginForm.bindFromRequest.fold(
68 formWithErrors => {
69 BadRequest(views.html.pages.loginForm(formWithErrors))
70 },
71 validForm => {
72 val userUuid: String = Tables.Users.filter(_.username === validForm.username).map(_.uuid).first.run
73
74 Redirect(routes.Application.index())
75 .withSession(Security.username -> userUuid)
76 .flashing(("success", "Welcome, valuable user!"))
77 }
78 )
79 }
80 }
81
82 def logout = Auth { implicit request =>
83 if (request.account.nonEmpty) {
84 Redirect(routes.Application.index())
85 .withNewSession
86 .flashing("success" -> "You are now logged out. Do not go to our competitor's website. Thanks.")
87 } else {
88 Redirect(routes.Application.index())
89 }
90 }
91
92}