using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using UF.AssessmentProject.Helper; namespace UF.AssessmentProject.Providers { public class HomeProvider : baseProvider { public Model.Transaction.ResponseMessage validateField(Model.Transaction.RequestMessage req) { var resultmess = ""; if (req.partnerkey == null) { resultmess += "partnerkey is required!, "; } else if (req.partnerrefno == null) { resultmess += "partnerrefno is required!, "; } else if(req.timestamp == null) { resultmess += "timestamp is required!, "; } else if(req.sig == null) { resultmess += "sig is required!, "; } if(resultmess.Length > 0) { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = resultmess.Substring(0,resultmess.Length-2), }; } return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.success, }; } public Model.Transaction.ResponseMessage Validate(Model.Transaction.RequestMessage req) { var rs = validateField(req); if (rs.success == DataDictionary.responseResult.failed) { return rs; } if (DateTime.Now >= DateTime.Parse(req.timestamp).AddMinutes(5)) { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = "Expired!" }; } var rawsig = DateTime.Parse(req.timestamp).ToString("yyyyMMddHHmmss") + req.partnerkey + req.partnerrefno + req.totalamount + req.partnerpassword; string sig = CommonUtils.ComputeSha256Hash((CommonUtils.EncodeBase64(rawsig))); var partner = db.Partners.Where(c => c.partnerkey == req.partnerkey).FirstOrDefault(); if (partner == null || (partner != null && (CommonUtils.EncodeBase64(partner.partnerpassword) != req.partnerpassword)) || sig != req.sig) { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = "Access Denied!", }; } var checkNameNull = req.items.Where(x => string.IsNullOrEmpty(x.name) == true).ToList().Count(); if (checkNameNull > 0) { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = "item name cannot be null!", }; } var checkPartneritemrefNull = req.items.Where(x => string.IsNullOrEmpty(x.partneritemref) == true).ToList().Count(); if (checkNameNull > 0) { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = "partneritemref name cannot be null!", }; } var checkUnitPrice = req.items.Where(x => x.unitprice < 0 ).ToList().Count(); if (checkUnitPrice > 0) { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = "unitprice only allow positive value!", }; } long total = 0; foreach (Model.Transaction.itemdetail item in req.items) { if (item.qty > 0 && item.qty <= 5) { total += item.qty * item.unitprice; } else { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = "qty only allow positive and not exceed 5", }; } } if ( req.totalamount != total) { return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.failed, resultmessage = "Invalid Total Amount.", }; } return new Model.Transaction.ResponseMessage { success = DataDictionary.responseResult.success, resultmessage = "Request data is valid.", }; } } }