Skip to content

Instantly share code, notes, and snippets.

@nraychaudhuri
Created May 14, 2014 18:51
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 3 You must be signed in to fork a gist
  • Save nraychaudhuri/fd77e4877b3af4622331 to your computer and use it in GitHub Desktop.
Save nraychaudhuri/fd77e4877b3af4622331 to your computer and use it in GitHub Desktop.
Play2-Auth and Slick together
//Trait that bridges between slick and Play2-auth. Just mixin with controllers
trait Auth2SlickBridge {
self: StackableController =>
def AuthAction[A](p: BodyParser[A], params: (RequestAttributeKey[_], Any)*)(f: RequestWithAttributes[A] => Action[A]): Action[A] = {
AsyncStack(p, params:_*) { implicit rs =>
f(rs).apply(rs)
}
}
def AuthAction(params: (RequestAttributeKey[_], Any)*)(f: RequestWithAttributes[AnyContent] => Action[AnyContent]): Action[AnyContent] = {
AsyncStack(params:_*) { implicit rs =>
f(rs).apply(rs)
}
}
}
//exmaple usage
object Message extends Controller with AuthElement with Auth2SlickBridge with AuthConfigImpl {
def main = AuthAction(AuthorityKey -> "user") { implicit play2AuthRequest =>
DBAction { implicit slickRequest =>
Computers.findById(1L).map { computer =>
Ok(html.editForm(1L, Application.computerForm.fill(computer), Companies.options))
}.getOrElse(NotFound)
}
}
}
@sagarsg
Copy link

sagarsg commented Jun 18, 2014

Thank you so much for providing the trait and example.

The example shows how to deal with a single result, but what can we do when a list is returned.

Can you provide a solution when dealing with list of computers -
val computers = Computers.findAll()

@marius-carp
Copy link

Hi,
Can you please update this example to the last versions of Play2-auth (0.14.1) and Play-Slick (1.1.0-M2) on Play-Framework 2.4

Thanks!

@Bunyod
Copy link

Bunyod commented Sep 17, 2015

Hi!
I agree with @marius-carp
I've started migration from Play-Framework 2.3 to Play-Framework 2.4 and I got error:

Error:Play 2 Compiler:
(f: jp.t2v.lab.play2.stackc.RequestWithAttributes[play.api.mvc.AnyContent] => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[play.api.mvc.AnyContent]
(params: jp.t2v.lab.play2.stackc.Attribute[]*)(f: jp.t2v.lab.play2.stackc.RequestWithAttributes[play.api.mvc.AnyContent] => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[play.api.mvc.AnyContent]
[A](p: play.api.mvc.BodyParser[A], params: jp.t2v.lab.play2.stackc.Attribute[
]*)(f: jp.t2v.lab.play2.stackc.RequestWithAttributes[A] => scala.concurrent.Future[play.api.mvc.Result])play.api.mvc.Action[A]

@Bunyod
Copy link

Bunyod commented Sep 17, 2015

I've successfully migrated ).

@Bunyod
Copy link

Bunyod commented Sep 17, 2015

And here updated version of this example:
https://gist.github.com/Bunyod/c84d7cac0528594d050b

@marius-carp
Copy link

@marius-carp
Copy link

This is the code that completes yours actions. It is adjusted to my code, I send Json as result

def getUser(idUser: Int) = AuthAction(AuthorityKey -> NormalUser) { implicit rs =>
    Action.async { implicit slickRequest =>
      dao.findById(idUser).map{ user =>
        Ok(Json.toJson(user))
      }
    }
  }
}

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment