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 }