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