bitcoin-atm
bitcoin atm for pyc inc.
git clone https://9o.is/git/bitcoin-atm.git
User.scala
(3978B)
1 package inc.pyc.chimera
2
3 import lycia._
4 import akka.actor._
5 import dispatch._
6 import Defaults._
7 import net.liftweb.json._
8 import com.ning.http._
9 import multipart.StringPart
10 import client.ByteArrayPart
11 import System._
12
13 /**
14 * Access information about registered users.
15 */
16 class User extends Actor with ActorLogging {
17
18 val settings = Settings(system)
19 import settings._
20
21 implicit val formats = DefaultFormats
22
23 /** Prefix request sent to the server. */
24 val request = url(userDb) / "api" / "btm" / guid / secret
25
26 def receive = {
27 case UserVerify(email, passwd) =>
28 val res = Http(request / "user" / email / passwd / "login" OK as.lift.Json)
29 sender ! parseUserInfo(res())
30
31 case BitcoinAddress(address) =>
32 val res = Http(request / "address" / address / "login" OK as.lift.Json)
33 sender ! parseUserInfo(res())
34
35 case Phone(number, _, _) =>
36 val res = Http(request / "phone" / number / "login" OK as.lift.Json)
37 sender ! parseUserInfo(res())
38
39 case CreateUser(email, phone, iD) =>
40 val fn = "uploaded_from_" + name
41 val req = (request / "create_user").
42 addBodyPart(new StringPart("email", email)).
43 addBodyPart(new StringPart("phone", phone)).
44 addBodyPart(new ByteArrayPart(fn, fn, iD, "image/jpeg", "ISO-8859-1")).
45 POST
46
47 val res = Http(req OK as.lift.Json)
48 implicit val successReason = Msg.idUploadSuccess
49 sender ! parseReason(res())
50
51 case _ =>
52 }
53
54
55 /**
56 * Parses user information sent from the server.
57 */
58 def parseUserInfo(res: JValue): Option[UserInfo] = parse(res) match {
59 case ServerResponseData(_, data, _) => data
60 case _ => None
61 }
62
63
64 def parseReason(res: JValue)(implicit successReason: String): ServerResponse = parse(res) match {
65 case ServerResponseData(success, _, _) if success => ResponseSuccess(successReason)
66 case ServerResponseData(_, _, reason) => ResponseFailure(reason getOrElse Msg.unableFulfillRequest)
67 }
68
69
70 /**
71 * Parses the response sent from the server.
72 */
73 def parse(res: JValue): ServerResponseData = {
74 res.extract[ServerResponseData]
75 }
76
77 }
78
79 /**
80 * Information about logged in user. Nothing too sensitive.
81 *
82 * @param email registered email
83 * @param verified whether email was verified
84 * @param phone phone number
85 * @param phoneVerfied whether phone number was verified
86 * @param fname optional first name
87 * @param lname optional last name
88 * @param purchaseLimit amount that can be purchased in 24 hours
89 * @param addresses registered bitcoin addresses
90 */
91 case class UserInfo(
92 email: Option[String] = None,
93 verified: Option[Boolean] = None,
94 phone: Option[String] = None,
95 phoneVerified: Option[Boolean] = None,
96 fname: Option[String] = None,
97 lname: Option[String] = None,
98 purchaseLimit: Option[Int] = Some(Lycia.buyLimit),
99 addresses: List[String] = Nil) {
100
101 def withPhoneNumber(phone: Phone) = {
102 copy(
103 phone = Some(phone.number),
104 phoneVerified = Some(phone.verified))
105 }
106
107 def withPurchaseLimit(limit: Int) = {
108 copy(purchaseLimit = Some(limit))
109 }
110 }
111
112
113 trait ServerResponse {
114 val message: String
115 }
116
117 /**
118 * Format of the server's response.
119 */
120 case class ServerResponseData(success: Boolean, data: Option[UserInfo], reason: Option[String]) extends ServerResponse {
121 val message: String = reason getOrElse ""
122 }
123
124 /**
125 * Successful response from the server.
126 */
127 case class ResponseSuccess(reason: String) extends ServerResponse {
128 val message: String = reason
129 }
130
131 /**
132 * Failure response from the server.
133 */
134 case class ResponseFailure(reason: String) extends ServerResponse {
135 val message: String = reason
136 }
137
138 /**
139 * Commands the server to register a new user with the following:
140 * email, phone number and picture ID data in string format.
141 */
142 case class CreateUser(email: String, phone: String, iD: Array[Byte])
143