doku-nodejs-library
Version:
98 lines (90 loc) • 4.77 kB
JavaScript
const Joi = require('joi');
class RefundRequestDto {
constructor(originalPartnerReferenceNo, refundAmount, partnerRefundNo, originalExternalId, reason, additionalInfo) {
this.originalPartnerReferenceNo = originalPartnerReferenceNo;
this.originalExternalId = originalExternalId;
this.refundAmount = refundAmount; // instance of AmountDto
this.reason = reason;
this.partnerRefundNo = partnerRefundNo;
this.additionalInfo = additionalInfo;
}
validateRefundRequestDto() {
const additionalInfoSchema = Joi.object({
channel: Joi.string().required(),
});
const amountSchema = Joi.object({
value: Joi.string()
.min(1)
.max(16)
.required()
.regex(/^\d+(\.\d{1,2})?$/)
.message('value must be a valid number with up to two decimal places'),
currency: Joi.string()
.min(1)
.max(3)
.required(),
});
// Create base schema
let schema = Joi.object({
originalPartnerReferenceNo: Joi.string().min(1).max(64).required(),
originalExternalId: Joi.string().allow(null, '').max(36).optional(),
refundAmount: amountSchema.required(),
additionalInfo: additionalInfoSchema.required(),
reason: Joi.string().max(255).optional(),
partnerRefundNo: Joi.string().max(64).required(), // Default partnerRefundNo
});
if (this.additionalInfo.channel == "EMONEY_OVO_SNAP"){
schema = schema.keys({
originalPartnerReferenceNo: Joi.string().max(32).required().messages({"*":"originalPartnerReferenceNo must be 32 characters or fewer. Ensure that originalPartnerReferenceNo is no longer than 32 characters. Example: 'INV-001'."}),
})
} else if (this.additionalInfo.channel == "EMONEY_DANA_SNAP" || this.additionalInfo.channel == "EMONEY_SHOPEE_PAY_SNAP") {
schema = schema.keys({
originalPartnerReferenceNo: Joi.string().max(64).required().messages({"*":"originalPartnerReferenceNo must be 64 characters or fewer. Ensure that originalPartnerReferenceNo is no longer than 64 characters. Example: 'INV-001'."}),
})
} else if(this.additionalInfo.channel == "DIRECT_DEBIT_CIMB_SNAP" || this.additionalInfo.channel == "DIRECT_DEBIT_BRI_SNAP") {
schema = schema.keys({
originalPartnerReferenceNo: Joi.string().max(12).required().messages({"*":"originalPartnerReferenceNo must be 12 characters or fewer. Ensure that originalPartnerReferenceNo is no longer than 12 characters. Example: 'INV-001'."}),
})
} else if(this.additionalInfo.channel ==="DIRECT_DEBIT_ALLO_SNAP") {
schema = schema.keys({
originalPartnerReferenceNo: Joi.string().min(32).max(64).required().messages({"*":"originalPartnerReferenceNo must be 12 characters or fewer. Ensure that originalPartnerReferenceNo is no longer than 12 characters. Example: 'INV-001'."}),
})
}
// Modify schema conditionally
if (this.additionalInfo.channel === "EMONEY_DANA_SNAP" || this.additionalInfo.channel === "EMONEY_SHOPEE_PAY_SNAP" || this.additionalInfo.channel === "EMONEY_OVO_SNAP") {
schema = schema.keys({
partnerRefundNo: Joi.string().min(1).max(64).required().messages({
"*": "partnerRefundNo must be 64 characters or fewer. Ensure that partnerRefundNo is no longer than 64 characters. Example: 'INV-REF-001'."
}), // More strict validation
});
} else if(this.additionalInfo.channel === "DIRECT_DEBIT_BRI_SNAP" || this.additionalInfo.channel === "DIRECT_DEBIT_CIMB_SNAP") {
schema = schema.keys({
partnerRefundNo: Joi.string().min(1).max(12).required().messages({
"*": "partnerRefundNo must be 12 characters or fewer. Ensure that partnerRefundNo is no longer than 12 characters. Example: 'INV-REF-001'."
}), // More strict validation
});
} else if(this.additionalInfo.channel === "DIRECT_DEBIT_ALLO_SNAP") {
schema = schema.keys({
partnerRefundNo: Joi.string().min(32).max(64).required().messages({
"*": "partnerRefundNo must be 12 characters or fewer. Ensure that partnerRefundNo is no longer than 12 characters. Example: 'INV-REF-001'."
}), // More strict validation
});
}
// Validate the object
const { error } = schema.validate(this, { abortEarly: true });
if (error) {
throw new Error(`${error.details.map(x => x.message).join(', ')}`);
}
}
toObject() {
return {
originalPartnerReferenceNo: this.originalPartnerReferenceNo,
originalExternalId: this.originalExternalId,
refundAmount: this.refundAmount.toObject(),
reason: this.reason,
partnerRefundNo: this.partnerRefundNo,
additionalInfo: this.additionalInfo
};
}
}
module.exports = RefundRequestDto;