@darkwolf/qiwi.mjs
Version:
198 lines (182 loc) • 5.52 kB
JavaScript
import Helper from '@darkwolf/helper.mjs'
import {
PaymentMethod,
PaymentDetails,
PaymentDetailsInternationalCardTransfer,
PaymentDetailsBankTransfer,
PaymentDetailsBankDetailsTransfer,
PaymentRequest
} from '../types/index.mjs'
import { NotEnoughBalanceError, UnknownError } from '../errors/index.mjs'
import { EventType, ProviderId, CurrencyCode, PaymentMethodType } from '../constants/index.mjs'
export default class SendPaymentRequest {
static method = 'POST'
static authRequired = true
static from(parameters, context) {
return new SendPaymentRequest(parameters, context)
}
constructor(parameters = {}, context) {
this.method = SendPaymentRequest.method
this.authRequired = SendPaymentRequest.authRequired
this
.setContext(context)
.setOperationId(parameters.operationId)
.setProviderId(parameters.providerId)
.setPaymentMethod(parameters.paymentMethod)
.setAccount(parameters.account)
.setDetails(parameters.details)
.setCurrency(parameters.currency)
.setAmount(parameters.amount)
.setComment(parameters.comment)
}
get endpoint() {
return `/sinap/api/v2/terms/${this.providerId}/payments`
}
setContext(context = {}) {
this.context = context
return this
}
setOperationId(id) {
this.operationId = id || Helper.now()
return this
}
setProviderId(id) {
this.providerId = id
return this
}
setPaymentMethod(paymentMethod) {
this.paymentMethod = paymentMethod ? (
paymentMethod instanceof PaymentMethod ? paymentMethod : new PaymentMethod(paymentMethod.type, paymentMethod)
) : new PaymentMethod(PaymentMethodType.ACCOUNT, {
accountId: CurrencyCode.RUB
})
return this
}
setAccount(account) {
this.account = account
return this
}
setDetails(details) {
let paymentDetails
if (details) {
if (details instanceof PaymentDetails) {
paymentDetails = details
} else {
switch (this.providerId) {
case ProviderId.VISA_INTERNATIONAL:
case ProviderId.MASTERCARD_INTERNATIONAL: {
paymentDetails = new PaymentDetailsInternationalCardTransfer(details)
break
}
case ProviderId.HOMECREDIT:
case ProviderId.ALFA:
case ProviderId.OTP:
case ProviderId.RSHB:
case ProviderId.RSB:
case ProviderId.VTB:
case ProviderId.UNICREDIT:
case ProviderId.PSB:
case ProviderId.QIWI:
case ProviderId.SBER:
case ProviderId.RENCREDIT:
case ProviderId.MKB:
case ProviderId.RAIFFEISEN: {
paymentDetails = new PaymentDetailsBankTransfer(details)
break
}
case ProviderId.BANK_DETAILS: {
paymentDetails = new PaymentDetailsBankDetailsTransfer(details)
break
}
default: {
paymentDetails = new PaymentDetails(details)
}
}
}
}
this.details = paymentDetails
return this
}
setCurrency(currency) {
this.currency = currency || 'RUB'
return this
}
setAmount(amount) {
this.amount = amount
return this
}
setComment(comment) {
this.comment = comment
return this
}
toParams() {
const params = {}
if (this.operationId) {
params.id = `${this.operationId}`
}
if (this.paymentMethod) {
params.paymentMethod = this.paymentMethod.toParams()
}
if (this.account) {
params.fields = {
account: `${this.account}`
}
}
if (this.details) {
params.fields = {
...params.fields,
...this.details.toParams()
}
}
if (this.currency) {
params.sum = {
...params.sum,
currency: `${CurrencyCode[this.currency] || this.currency}`
}
}
if (Helper.exists(this.amount)) {
params.sum = {
...params.sum,
amount: this.amount
}
}
if (Helper.exists(this.comment)) {
params.comment = this.comment
}
return params
}
async send() {
const response = await this.context.qiwi.request(this)
if (response) {
if (response.ok) {
if (!response.result.id) {
response
.setOk(false)
.setErrorCode(response.result.code)
.setMessage(response.result.message)
let error
switch (response.result.code) {
case 'QWPRC-220': {
error = new NotEnoughBalanceError().setResponse(response)
break
}
default: {
error = new UnknownError(response.result.message).setResponse(response)
}
}
this.context.qiwi.emit(EventType.ERROR, error)
if (!this.context.qiwi.settings.ignoreErrors) throw error
} else {
response.setResult(PaymentRequest.fromParams(response.result, this.context))
this.context.qiwi.emit(EventType.RESPONSE, response)
return response.result
}
} else {
const error = new UnknownError(response.message).setResponse(response)
this.context.qiwi.emit(EventType.ERROR, error)
if (!this.context.qiwi.settings.ignoreErrors) throw error
}
}
return null
}
}