esnekpos
Version:
Node.js entegrasyon paketi - EsnekPOS ödeme sistemi için resmi olmayan istemci
193 lines (178 loc) • 6.47 kB
JavaScript
/**
* İstek doğrulama fonksiyonları
*/
const Joi = require('joi');
const { CURRENCY, LOCALE, SUBMERCHANT_TYPE } = require('./constants');
/**
* İstemci yapılandırmasını doğrula
* @param {Object} config - İstemci yapılandırma nesnesi
*/
function validateClientConfig(config) {
const schema = Joi.object({
merchant: Joi.string().required(),
merchantKey: Joi.string().required(),
testMode: Joi.boolean().default(false)
});
const { error } = schema.validate(config);
if (error) {
throw new Error(`Geçersiz yapılandırma: ${error.message}`);
}
}
/**
* 3D ödeme isteğini doğrula
* @param {Object} paymentRequest - Ödeme isteği nesnesi
*/
function validate3DPaymentRequest(paymentRequest) {
const schema = Joi.object({
Config: Joi.object({
MERCHANT: Joi.string().required(),
MERCHANT_KEY: Joi.string().required(),
BACK_URL: Joi.string().uri().required(),
PRICES_CURRENCY: Joi.string().valid(...Object.values(CURRENCY)).required(),
ORDER_REF_NUMBER: Joi.string().max(24).required(),
ORDER_AMOUNT: Joi.string().required()
}).required(),
CreditCard: Joi.object({
CC_NUMBER: Joi.string().length(16).pattern(/^\d+$/).required(),
EXP_MONTH: Joi.string().length(2).pattern(/^\d+$/).required(),
EXP_YEAR: Joi.string().length(4).pattern(/^\d+$/).required(),
CC_CVV: Joi.string().pattern(/^\d+$/).required(),
CC_OWNER: Joi.string().required(),
INSTALLMENT_NUMBER: Joi.string().pattern(/^\d+$/).required()
}).required(),
Customer: Joi.object({
FIRST_NAME: Joi.string().required(),
LAST_NAME: Joi.string().required(),
MAIL: Joi.string().email().required(),
PHONE: Joi.string().required(),
CITY: Joi.string().required(),
STATE: Joi.string().required(),
ADDRESS: Joi.string().required(),
CLIENT_IP: Joi.string().ip().required()
}).required(),
Product: Joi.array().items(
Joi.object({
PRODUCT_ID: Joi.string().required(),
PRODUCT_NAME: Joi.string().required(),
PRODUCT_CATEGORY: Joi.string().required(),
PRODUCT_DESCRIPTION: Joi.string().required(),
PRODUCT_AMOUNT: Joi.string().required()
})
).min(1).required()
});
const { error } = schema.validate(paymentRequest);
if (error) {
throw new Error(`Geçersiz 3D ödeme isteği: ${error.message}`);
}
}
/**
* Ortak ödeme sayfası isteğini doğrula
* @param {Object} paymentRequest - Ödeme isteği nesnesi
*/
function validateCommonPaymentRequest(paymentRequest) {
const schema = Joi.object({
Config: Joi.object({
MERCHANT: Joi.string().required(),
MERCHANT_KEY: Joi.string().required(),
ORDER_REF_NUMBER: Joi.string().max(24).required(),
ORDER_AMOUNT: Joi.string().required(),
PRICES_CURRENCY: Joi.string().valid(...Object.values(CURRENCY)).required(),
BACK_URL: Joi.string().uri().required(),
LOCALE: Joi.string().valid(...Object.values(LOCALE)).required()
}).required(),
Customer: Joi.object({
FIRST_NAME: Joi.string().required(),
LAST_NAME: Joi.string().required(),
MAIL: Joi.string().email().required(),
PHONE: Joi.string().required(),
CITY: Joi.string().required(),
STATE: Joi.string().required(),
ADDRESS: Joi.string().required()
}).required(),
Product: Joi.array().items(
Joi.object({
PRODUCT_ID: Joi.string().required(),
PRODUCT_NAME: Joi.string().required(),
PRODUCT_CATEGORY: Joi.string().required(),
PRODUCT_DESCRIPTION: Joi.string().required(),
PRODUCT_AMOUNT: Joi.string().required()
})
).min(1).required()
});
const { error } = schema.validate(paymentRequest);
if (error) {
throw new Error(`Geçersiz ortak ödeme sayfası isteği: ${error.message}`);
}
}
/**
* İşlem sorgulama isteğini doğrula
* @param {Object} queryRequest - Sorgulama isteği nesnesi
*/
function validateProcessQueryRequest(queryRequest) {
const schema = Joi.object({
MERCHANT: Joi.string().required(),
MERCHANT_KEY: Joi.string().required(),
ORDER_REF_NUMBER: Joi.string().required()
});
const { error } = schema.validate(queryRequest);
if (error) {
throw new Error(`Geçersiz işlem sorgulama isteği: ${error.message}`);
}
}
/**
* İade/İptal isteğini doğrula
* @param {Object} refundRequest - İade isteği nesnesi
*/
function validateRefundRequest(refundRequest) {
const schema = Joi.object({
MERCHANT: Joi.string().required(),
MERCHANT_KEY: Joi.string().required(),
ORDER_REF_NUMBER: Joi.string().required(),
AMOUNT: Joi.number().required(),
SYNC_WITH_POS: Joi.boolean().optional()
});
const { error } = schema.validate(refundRequest);
if (error) {
throw new Error(`Geçersiz iade/iptal isteği: ${error.message}`);
}
}
/**
* Pazaryeri alt üye işyeri tanımlama isteğini doğrula
* @param {Object} subMerchantRequest - Alt üye işyeri isteği
*/
function validateSubMerchantRequest(subMerchantRequest) {
const schema = Joi.object({
MERCHANT: Joi.string().required(),
MERCHANT_KEY: Joi.string().required(),
NAME: Joi.string().required(),
OWNER_NAME: Joi.string().required(),
OWNER_SURNAME: Joi.string().required(),
OWNER_IDENTITY_NUMBER: Joi.string().required(),
EMAIL: Joi.string().email().required(),
GSM: Joi.string().required(),
COMPANY_NAME: Joi.string().required(),
TAX_OFFICE: Joi.string().required(),
TAX_NUMBER: Joi.string().required(),
BANK_NAME: Joi.string().required(),
EXTERNAL_ID: Joi.string().required(),
TYPE: Joi.string().valid(...Object.values(SUBMERCHANT_TYPE)).required(),
BANK_ACCOUNTS: Joi.array().items(
Joi.object({
IBAN: Joi.string().required(),
CURRENCY: Joi.string().valid(...Object.values(CURRENCY)).required()
})
).min(1).required()
});
const { error } = schema.validate(subMerchantRequest);
if (error) {
throw new Error(`Geçersiz alt üye işyeri tanımlama isteği: ${error.message}`);
}
}
module.exports = {
validateClientConfig,
validate3DPaymentRequest,
validateCommonPaymentRequest,
validateProcessQueryRequest,
validateRefundRequest,
validateSubMerchantRequest
};