Skip to content

Commit

Permalink
Add project
Browse files Browse the repository at this point in the history
  • Loading branch information
gakuzzzz committed Jul 5, 2015
1 parent c9344ee commit b92052a
Show file tree
Hide file tree
Showing 31 changed files with 1,286 additions and 14 deletions.
60 changes: 46 additions & 14 deletions project/Build.scala
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,11 @@ object ApplicationBuild extends Build {
scalaVersion := "2.11.6",
crossScalaVersions := Seq("2.10.5", "2.11.6"),
organization := "jp.t2v",
resolvers += Resolver.typesafeRepo("releases"),
resolvers += Resolver.sonatypeRepo("releases"),
resolvers ++= {
if (isSnapshot.value) {
Seq(Resolver.sonatypeRepo("snapshots"))
} else {
Nil
}
}
resolvers ++=
Resolver.typesafeRepo("releases") ::
Resolver.sonatypeRepo("releases") ::
Nil,
scalacOptions ++= Seq("-language:_", "-deprecation")
)

lazy val appPublishMavenStyle = true
Expand Down Expand Up @@ -58,8 +54,8 @@ object ApplicationBuild extends Build {


lazy val core = Project("core", base = file("module"))
.settings(baseSettings)
.settings(
baseSettings,
libraryDependencies += "com.typesafe.play" %% "play" % playVersion % "provided",
libraryDependencies += "com.typesafe.play" %% "play-cache" % playVersion % "provided",
libraryDependencies += "jp.t2v" %% "stackable-controller" % "0.5.0",
Expand All @@ -72,9 +68,9 @@ object ApplicationBuild extends Build {
)

lazy val test = Project("test", base = file("test"))
.settings(baseSettings)
.settings(
libraryDependencies += "com.typesafe.play" %% "play-test" % playVersion % "provided",
baseSettings,
libraryDependencies += "com.typesafe.play" %% "play-test" % playVersion,
name := appName + "-test",
publishMavenStyle := appPublishMavenStyle,
publishArtifact in Test := appPublishArtifactInTest,
Expand All @@ -85,8 +81,8 @@ object ApplicationBuild extends Build {

lazy val sample = Project("sample", file("sample"))
.enablePlugins(play.sbt.PlayScala)
.settings(baseSettings)
.settings(
baseSettings,
resolvers += "scalaz-bintray" at "https://dl.bintray.com/scalaz/releases",
libraryDependencies += play.sbt.Play.autoImport.cache,
libraryDependencies += play.sbt.Play.autoImport.specs2 % Test,
Expand Down Expand Up @@ -116,6 +112,42 @@ object ApplicationBuild extends Build {
)
.dependsOn(core, test % "test")

lazy val social = Project (id = "social", base = file ("social"))
.settings(
baseSettings,
name := appName + "-social",
libraryDependencies += "com.typesafe.play" %% "play" % playVersion % "provided",
libraryDependencies += "com.typesafe.play" %% "play-ws" % playVersion % "provided",
libraryDependencies += "com.typesafe.play" %% "play-cache" % playVersion % "provided"
).dependsOn(core)

lazy val socialSample = Project("social-sample", file("social-sample"))
.enablePlugins(play.sbt.PlayScala)
.settings(
baseSettings,
name := appName + "-social-sample",
resourceDirectories in Test += baseDirectory.value / "conf",
resolvers += "Sonatype OSS Snapshots" at "https://oss.sonatype.org/content/repositories/snapshots",
libraryDependencies ++= Seq(
"com.typesafe.play" %% "play-ws" % playVersion,
"com.typesafe.play" %% "play-cache" % playVersion,
"org.flywaydb" %% "flyway-play" % "2.0.0",
"org.scalikejdbc" %% "scalikejdbc" % "2.2.7",
"org.scalikejdbc" %% "scalikejdbc-config" % "2.2.7",
"org.scalikejdbc" %% "scalikejdbc-syntax-support-macro" % "2.2.7",
"org.scalikejdbc" %% "scalikejdbc-test" % "2.2.7" % "test",
"org.scalikejdbc" %% "scalikejdbc-play-initializer" % "2.4.0",
"org.scalikejdbc" %% "scalikejdbc-play-dbapi-adapter" % "2.4.0",
"org.scalikejdbc" %% "scalikejdbc-play-fixture" % "2.4.0"
),
publish := { },
publishArtifact := false,
packagedArtifacts := Map.empty,
publishTo <<=(version)(appPublishTo),
pomExtra := appPomExtra
)
.dependsOn(core, social)

lazy val root = Project("root", base = file("."))
.settings(baseSettings)
.settings(
Expand All @@ -124,6 +156,6 @@ object ApplicationBuild extends Build {
packagedArtifacts := Map.empty,
publishTo <<=(version)(appPublishTo),
pomExtra := appPomExtra
).aggregate(core, test, sample)
).aggregate(core, test, sample, social, socialSample)

}
172 changes: 172 additions & 0 deletions social-sample/app/controllers/Application.scala
Original file line number Diff line number Diff line change
@@ -0,0 +1,172 @@
package controllers

import models._
import play.api.mvc.Results._
import play.api.mvc._
import scalikejdbc.DB

import scala.concurrent.ExecutionContext.Implicits.global
import scala.concurrent.{ ExecutionContext, Future }
import scala.reflect.{ ClassTag, classTag }
import jp.t2v.lab.play2.auth._
import jp.t2v.lab.play2.auth.social.providers.twitter.{TwitterProviderUserSupport, TwitterController}
import jp.t2v.lab.play2.auth.social.providers.facebook.{FacebookProviderUserSupport, FacebookController}
import jp.t2v.lab.play2.auth.social.providers.github.{GitHubProviderUserSupport, GitHubController}
import jp.t2v.lab.play2.auth.social.providers.slack.SlackController

object Application extends Controller with OptionalAuthElement with AuthConfigImpl with Logout {

def index = StackAction { implicit request =>
DB.readOnly { implicit session =>
val user = loggedIn
val gitHubUser = user.flatMap(u => GitHubUser.findByUserId(u.id))
val facebookUser = user.flatMap(u => FacebookUser.findByUserId(u.id))
val twitterUser = user.flatMap(u => TwitterUser.findByUserId(u.id))
val slackAccessToken = user.flatMap(u => SlackAccessToken.findByUserId(u.id))
Ok(views.html.index(user, gitHubUser, facebookUser, twitterUser, slackAccessToken))
}
}

def logout = Action.async { implicit request =>
gotoLogoutSucceeded
}

}

trait AuthConfigImpl extends AuthConfig {
type Id = Long
type User = models.User
type Authority = models.Authority
val idTag: ClassTag[Id] = classTag[Id]
val sessionTimeoutInSeconds: Int = 3600

def resolveUser(id: Id)(implicit ctx: ExecutionContext): Future[Option[User]] =
Future.successful(DB.readOnly { implicit session =>
User.find(id)
})

def loginSucceeded(request: RequestHeader)(implicit ctx: ExecutionContext): Future[Result] =
Future.successful(Redirect(routes.Application.index()))

def logoutSucceeded(request: RequestHeader)(implicit ctx: ExecutionContext): Future[Result] =
Future.successful(Redirect(routes.Application.index))

def authenticationFailed(request: RequestHeader)(implicit ctx: ExecutionContext): Future[Result] =
Future.successful(Redirect(routes.Application.index))

override def authorizationFailed(request: RequestHeader, user: User, authority: Option[Authority])(implicit ctx: ExecutionContext) =
Future.successful(Forbidden("no permission"))

def authorize(user: User, authority: Authority)(implicit ctx: ExecutionContext): Future[Boolean] = Future.successful {
true
}

}

object FacebookAuthController extends FacebookController
with AuthConfigImpl
with FacebookProviderUserSupport {

override def onOAuthLinkSucceeded(token: AccessToken, consumerUser: User)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
retrieveProviderUser(token).map { providerUser =>
DB.localTx { implicit session =>
FacebookUser.save(consumerUser.id, providerUser)
Redirect(routes.Application.index)
}
}
}

override def onOAuthLoginSucceeded(token: AccessToken)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
retrieveProviderUser(token).flatMap { providerUser =>
DB.localTx { implicit session =>
FacebookUser.findById(providerUser.id) match {
case None =>
val id = User.create(providerUser.name, providerUser.coverUrl).id
FacebookUser.save(id, providerUser)
gotoLoginSucceeded(id)
case Some(fu) =>
gotoLoginSucceeded(fu.userId)
}
}
}
}

}

object GitHubAuthController extends GitHubController
with AuthConfigImpl
with GitHubProviderUserSupport {

override def onOAuthLinkSucceeded(token: AccessToken, consumerUser: User)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
retrieveProviderUser(token).map { providerUser =>
DB.localTx { implicit session =>
GitHubUser.save(consumerUser.id, providerUser)
Redirect(routes.Application.index)
}
}
}

override def onOAuthLoginSucceeded(token: AccessToken)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
retrieveProviderUser(token).flatMap { providerUser =>
DB.localTx { implicit session =>
GitHubUser.findById(providerUser.id) match {
case None =>
val id = User.create(providerUser.login, providerUser.avatarUrl).id
GitHubUser.save(id, providerUser)
gotoLoginSucceeded(id)
case Some(gh) =>
gotoLoginSucceeded(gh.userId)
}
}
}
}

}

object TwitterAuthController extends TwitterController
with AuthConfigImpl
with TwitterProviderUserSupport {

override def onOAuthLinkSucceeded(token: AccessToken, consumerUser: User)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
retrieveProviderUser(token).map { providerUser =>
DB.localTx { implicit session =>
TwitterUser.save(consumerUser.id, providerUser)
Redirect(routes.Application.index)
}
}
}

override def onOAuthLoginSucceeded(token: AccessToken)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
retrieveProviderUser(token).flatMap { providerUser =>
DB.localTx { implicit session =>
TwitterUser.findById(providerUser.id) match {
case None =>
val id = User.create(providerUser.screenName, providerUser.profileImageUrl).id
TwitterUser.save(id, providerUser)
gotoLoginSucceeded(id)
case Some(tu) =>
gotoLoginSucceeded(tu.userId)
}
}
}
}

}

object SlackAuthController extends SlackController
with AuthConfigImpl {

override def onOAuthLinkSucceeded(accessToken: AccessToken, consumerUser: User)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
Future.successful {
DB.localTx { implicit session =>
SlackAccessToken.save(consumerUser.id, accessToken)
Redirect(routes.Application.index)
}
}
}

override def onOAuthLoginSucceeded(accessToken: AccessToken)(implicit request: RequestHeader, ctx: ExecutionContext): Future[Result] = {
???
}

}
Loading

0 comments on commit b92052a

Please sign in to comment.