scala-news-reader

rss/atom news reader in scala

git clone https://9o.is/git/scala-news-reader.git

FacebookBuilder.scala

(2607B)


      1 package com.joereader.lib.api.rest.oauth.facebook
      2 
      3 import com.joereader._
      4 import lib.api._
      5 import rest.facebook._
      6 import rest.oauth._
      7 import com.joereader._
      8 import snippet.EmailVar
      9 import config._
     10 import model._
     11 
     12 import dispatch._
     13 import Defaults._
     14 
     15 import net.liftweb._
     16 import net.liftweb.http._
     17 import net.liftweb.common._
     18 
     19 import java.net.URL
     20 
     21 trait FacebookBuilder extends OauthBuilder {
     22 
     23   override def name = "facebook"
     24 
     25   override def signInRequest =
     26     :/("www.facebook.com").secure / "dialog" / "oauth"
     27 
     28   override def callbackRequest =
     29     :/("graph.facebook.com").secure / "oauth" / "access_token"
     30 
     31   override def token = FacebookToken
     32 
     33   override def setAccessToken(res: String) =
     34     for (attr <- res.split("&")) {
     35       val param = attr.split("=")
     36       val (key, value) =
     37         (param.headOption, param.tail.headOption)
     38 
     39       val failMsg = s"Can't extract $name access token"
     40       for {
     41         key <- Box(key) ?~ failMsg
     42         value <- Box(value) ?~ failMsg
     43       } if (key == "access_token") {
     44         token(Full(AccessToken(value)))
     45         info(s"$name access token has been set to $value")
     46       }
     47     }
     48 
     49 }
     50 
     51 /* 
     52  * This facebook builder is used for tasks that 
     53  * require more scopes that a simple sign in. 
     54  */
     55 object FacebookBuilder extends FacebookBuilder {
     56   override def scope = 
     57     "user_education_history" :: "user_interests" :: 
     58     "user_likes" :: "user_work_history" :: 
     59     "publish_actions" :: Nil
     60 }
     61 
     62 /* This facebook builder is used for signing in. */
     63 object FacebookBuilderSignIn extends FacebookBuilder {
     64   override def name = super.name + ".signin"
     65   
     66   override def scope = "email" :: Nil
     67 
     68   override def setClientCallback {
     69     ClientCallback(baseUrl.map {
     70       bu =>
     71         val url = bu + Site.signUp1.url.drop(1)
     72         info(s"$name client callback set to $url")
     73         new URL(url)
     74     })
     75   }
     76 
     77   override def endResponse(callback: URL) = {
     78     import Field._
     79 
     80     FacebookClient.me(Email)() match {
     81       case Left(err) =>
     82         error(err)
     83         super.endResponse(callback)
     84 
     85       case Right(me) =>
     86         (for (email <- me.email) yield {
     87           val user = User.findByEmail(email)
     88           user.map(User.logUserIn(_, true))
     89 
     90           if (user.isEmpty) {
     91             BetaUser.createRecord.id(email).save
     92 
     93             RedirectWithState(callback.toString,
     94               RedirectState { () =>
     95                 EmailVar(email)
     96               })
     97           } else DoRedirectResponse(Site.home.url)
     98 
     99         }) getOrElse {
    100           warn(s"Email for user ${me.id} in $name could not be found")
    101           super.endResponse(callback)
    102         }
    103     }
    104 
    105   }
    106 }