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

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

The newest version!
package sd.pay.sms1pay

import javax.inject.{Inject, Singleton}

import play.api.data.Form
import play.api.data.FormBinding.Implicits.formBinding
import play.api.db.Database
import play.api.Logger
import play.api.libs.json.JsObject
import play.api.mvc.Request
import sd.Uid2Name
import scala.concurrent.{ExecutionContext, Future}
import scala.util.Failure

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

  private def check[T <: BaseData](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[_]): Future[JsObject] =
    check(forms1pay.formCheck) { (_, _, _) =>
      OkValid
    }

  private def chargeLogic(
      uid: Int,
      username: String,
      d: ChargeData
  ): 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[_]): 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