All Downloads are FREE. Search and download functionalities are using the official Maven repository.

sd.pay.sms1pay.SMS.scala Maven / Gradle / Ivy

There is a newer version: 2.2.0
Show newest version
package sd.pay.sms1pay

import javax.inject.{ Inject, Singleton }
import play.api.data.Form
import play.api.db.DB
import play.api.{ Application, Logger }
import play.api.libs.json.JsObject
import play.api.mvc.Request
import sd.Uid2Name
import scala.concurrent.Future
import scala.util.Failure
import play.api.libs.concurrent.Execution.Implicits._

@Singleton
class SMS @Inject() (forms1pay: Forms1pay, uid2Name: Uid2Name, addCoin: SmsAddCoin, smsRes: SmsResult) {
  private[this] val logger = Logger("sms1pay")
  import smsRes._

  private def check[T <: DataBase](form: Form[T])(logic: (Int, String, T) => Future[JsObject]) //uid, username, data
  (implicit req: Request[_]): Future[JsObject] = {
    form.bindFromRequest.fold(
      f => {
        logger.warn(
          s"""${f.errors.map(e => e.key + ":" + e.messages.mkString(",")).mkString("FormError: [", ",", "]")}
             |${req.headers.headers.map { case (k, v) => k + ":" + v }.mkString("Headers: [", ",", "]")}
             |${req.uri}""".stripMargin
        )
        ErrSignature
      },
      d => d.uidOpt.fold(ErrSignature) { uid =>
        uid2Name(uid).fold(ErrId(uid)) { username =>
          logic(uid, username, d)
        }
      }
    )
  }

  def check(implicit req: Request[_], app: Application): Future[JsObject] =
    check(forms1pay.formCheck) { (_, _, _) =>
      OkValid
    }

  private def chargeLogic(uid: Int, username: String, d: ChargeData)(implicit app: Application): Future[JsObject] =
    DB.withConnection { implicit conn =>
      if (Anorm1pay.exists(d.request_id)) ErrProcessed
      else {
        Anorm1pay.insertLog(d, uid)
        addCoin(uid, d.amount, s"Nạp Bảo qua SMS từ số ${d.msisdn} số tiền ${d.amount}")
          .map(OkCharged(username, _))
          .andThen {
            case Failure(e) => logger.error(d.toString, e)
          }
      }
    }

  def charge(implicit req: Request[_], app: Application): Future[JsObject] =
    check(forms1pay.formCharge) { (uid, username, d) =>
      try chargeLogic(uid, username, d)
      catch {
        case e: Exception =>
          logger.error(req.queryString.toString, e)
          ErrInternal
      }
    }
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy