/// <summary> /// Query Azure Table Storage and update page view /// </summary> private void UpdatePageView(AffiliateRegistration reg) { // Fire and Forget - if multiple threads have spaned var database = SiteDatabase; var key = reg.AffiliateCode + "-updatepageview"; reg = database.GetById <AffiliateRegistration>(reg.Id); if (reg.LastPageViewUpdate.Date == DateTime.Now.Date) { return; } Task.Run(() => { lock (BaseModule.GetLockObject(key)) { var cached = MemoryCache.Default[key] as AffiliateRegistration; if (cached != null) { // someone has recently do the update if (cached.LastPageViewUpdate.Date == DateTime.Now.Date) { return; } } if (reg.LastPageViewUpdate == default(DateTime)) { reg.LastPageViewUpdate = reg.__createdAt; } var table = GetPageViewTable(); var pageViews = (from pv in table.CreateQuery <PageView>() where pv.Timestamp > reg.LastPageViewUpdate && pv.AffiliateCode == reg.AffiliateCode select pv); var userSet = new HashSet <string>(); foreach (var item in pageViews) { reg.TotalPageView++; userSet.Add(item.UserUniqueId); if (item.QueryString.Contains("source=")) { reg.TotalAffiliateLinkClicks++; } if (item.QueryString.Contains("subscribe=1")) { reg.TotalSubscribeLinkClicks++; } } reg.LastPageViewUpdate = DateTime.Now; reg.TotalUniqueUser += userSet.Count; reg.TotalSales = SiteDatabase.Query <SaleOrder>() .Where(so => so.AffiliateCode == reg.AffiliateCode && so.PaymentStatus == PaymentStatus.PaymentReceived).Count(); reg.UpdateCommissionRate(); SiteDatabase.UpsertRecord(reg); // Make the instance for checking available for 1 hour MemoryCache.Default.Add(key, reg, DateTimeOffset.Now.AddHours(1)); } }); }
public AffiliateModule() { AffiliateModule.TemplatePath = Path.Combine(RootPath, "Site", "Views", "EmailTemplates"); Post["/__affiliate/apply"] = HandleRequest((arg) => { if (this.CurrentUser.IsAnonymous) { return(400); } var reg = AffiliateModule.ApplyAffiliate(this.SiteDatabase, this.CurrentUser.Id); var regresult = JObject.FromObject(reg); var body = arg.body.Value; if (body.sharedCoupon != null) { var discountCode = (string)body.sharedCoupon.CouponCode; lock (BaseModule.GetLockObject("SharedCouponCheck-" + reg.Id)) { // prevent dubplicates var existing = this.SiteDatabase.Query <AffiliateRewardsClaim>() .Where(c => c.DiscountCode == discountCode && c.AffiliateRegistrationId == reg.Id) .FirstOrDefault(); if (existing == null) { var toCopy = this.SiteDatabase.GetById <AffiliateRewardsClaim>((int)body.sharedCoupon.CouponId); toCopy.Id = 0; toCopy.AffiliateRegistrationId = reg.Id; toCopy.AffiliateCode = reg.AffiliateCode; toCopy.NcbUserId = this.CurrentUser.Id; toCopy.RewardsName = "shared from ID:" + body.sharedCoupon.AffiliateId; toCopy.IsShareEnabled = false; this.SiteDatabase.UpsertRecord(toCopy); regresult.Add("CouponSaved", true); } } } if (body.sharedReward != null) { lock (BaseModule.GetLockObject("SharedRewardCheck-" + reg.Id)) { var result = AffiliateReward.ClaimReward(this.SiteDatabase, (int)body.sharedReward.Id, reg.Id); if (result != null) { regresult.Add("RewardClaimed", true); } } } return(regresult); }); Post["/__affiliate/requestpayment"] = HandleRequest((arg) => { if (CurrentUser.IsAnonymous) { return(400); } var registration = SiteDatabase.Query <AffiliateRegistration>() .Where(t => t.NcbUserId == CurrentUser.Id).FirstOrDefault(); if (registration == null) { return(400); } var pendingPayment = SiteDatabase.Query <AffiliateTransaction>() .Where(t => t.AffiliateCode == registration.AffiliateCode && t.IsCommissionPaid == false && t.IsPendingApprove == false) .ToList(); // using alternate rate SiteDatabase.Transaction(() => { foreach (var item in pendingPayment) { item.IsPendingApprove = true; SiteDatabase.UpsertRecord(item); } }); return(200); }); Post["/__affiliate/claimrewards"] = HandleRequest((arg) => { dynamic param = (arg.body.Value as JObject); if (param.Id == null) { return(400); } var registration = AffiliateModule.ApplyAffiliate(this.SiteDatabase, this.CurrentUser.Id); var result = AffiliateReward.ClaimReward(this.SiteDatabase, (int)param.Id, registration.Id); if (result == null) { return(403); } return(result); }); Post["/__affiliate/addtosaleorder"] = HandleRequest((arg) => { if (CurrentUser.IsAnonymous) { return(400); } var requestBody = (arg.body.Value as JObject); var saleOrderId = requestBody.Value <int>("saleOrderId"); var affiliateRewardsClaimId = requestBody.Value <int>("arcId"); if (saleOrderId != 0 && affiliateRewardsClaimId != 0) { var aRC = SiteDatabase.GetById <AffiliateRewardsClaim>(affiliateRewardsClaimId); if (aRC.IncludedInSaleOrderId != 0 || aRC.DiscountCode != null) { return(403); } aRC.IncludedInSaleOrderId = saleOrderId; SiteDatabase.UpsertRecord(aRC); return(new { AffiliateRewardsClaim = aRC }); } return(403); }); Post["/__affiliate/updateprofile"] = HandleRequest((arg) => { var requestBody = arg.body.Value; if (requestBody.Profile == null && requestBody.Registration == null) { return(400); } // Impersonation in effect int userId = this.CurrentUser.Id; if (userId != (int)requestBody.UserId) { if (userId == 1) { userId = (int)requestBody.UserId; } else { return(400); // user that is not 1 cannot save with impersonation } } if (requestBody.Profile != null) { UserManager.Current.UpdateProfile(this.SiteDatabase, userId, requestBody.Profile); } if (requestBody.Registration != null) { AffiliateRegistration registration = SiteDatabase.Query <AffiliateRegistration>() .Where(t => t.NcbUserId == CurrentUser.Id).FirstOrDefault(); registration.AffiliateName = requestBody.Registration.AffiliateName; registration.AffiliateMessage = requestBody.Registration.AffiliateMessage; SiteDatabase.UpsertRecord(registration); MemoryCache.Default.Remove("AffiliateReg-" + registration.AffiliateCode); } MemoryCache.Default.Remove("dashboard-" + CurrentUser.Id); return(200); }); Get["/" + AFFILIATE_PROGRAM_NAME + "/dashboard"] = HandleRequest((arg) => { if (this.CurrentUser.IsAnonymous) { return(this.Response.AsRedirect("/" + AFFILIATE_PROGRAM_NAME)); } var id = this.CurrentUser.Id; AffiliateRegistration registration = null; if (this.CurrentUser.HasClaim("admin") && Request.Query.code != null) // admin impersonate anyone { var code = (string)Request.Query.code; registration = SiteDatabase.Query <AffiliateRegistration>() .Where(t => t.AffiliateCode == code).FirstOrDefault(); if (registration == null) { return(404); // wrong code } } else if (this.CurrentUser.HasClaim("admin") && Request.Query.so != null) { var soId = (int)Request.Query.so; var so = SiteDatabase.GetById <SaleOrder>(soId); if (so.NcbUserId == 0) { return(404); // user cannot view squad51 because they was not registered } registration = SiteDatabase.Query <AffiliateRegistration>() .Where(t => t.NcbUserId == so.NcbUserId).FirstOrDefault(); // automatically apply owner of given so if (registration == null && (so.PaymentStatus == PaymentStatus.PaymentReceived || so.PaymentStatus == PaymentStatus.Deposit)) { registration = AffiliateModule.ApplyAffiliate(this.SiteDatabase, so.NcbUserId); } } else { if (id != 0) { registration = SiteDatabase.Query <AffiliateRegistration>() .Where(t => t.NcbUserId == id).FirstOrDefault(); } } if (registration == null) { if (id != 0) // some known user but we still can't get their registration { // no registration - try to see whether this user already a customer var saleOrder = this.SiteDatabase.Query <SaleOrder>() .Where(so => so.NcbUserId == id && (so.PaymentStatus == PaymentStatus.Deposit || so.PaymentStatus == PaymentStatus.PaymentReceived)) .FirstOrDefault(); // already customer - auto register them if (saleOrder != null) { registration = AffiliateModule.ApplyAffiliate(this.SiteDatabase, id); return(this.AffiliateDashboard(registration, arg)); } } // redirect back to application page return(this.Response.AsRedirect("/" + AFFILIATE_PROGRAM_NAME)); } return(this.AffiliateDashboard(registration, arg)); }); Get["/" + AFFILIATE_PROGRAM_NAME] = HandleRequest((arg) => { var id = this.CurrentUser.Id; AffiliateRegistration registration = SiteDatabase.Query <AffiliateRegistration>() .Where(t => t.NcbUserId == id).FirstOrDefault(); var content = ContentModule.GetPage(SiteDatabase, "/__affiliate", true); return(View["affiliate-apply", new StandardModel(this, content, new { Registration = registration })]); }); Get["/__affiliate/profileimage/{id}"] = this.HandleRequest(arg => { var response = new Response(); response.ContentType = "image/jpeg"; response.Contents = (output) => { WebClient client = new WebClient(); var data = client.DownloadData("https://graph.facebook.com/" + (string)arg.id + "/picture?type=large"); output.Write(data, 0, data.Length); }; return(response); }); Get["/__affiliate/getsharedcoupon"] = this.HandleRequest((arg) => { if (this.Request.Cookies.ContainsKey("coupon")) { var id = this.Request.Cookies["coupon"]; var coupon = this.SiteDatabase.GetById <AffiliateRewardsClaim>(int.Parse(id)); if (coupon != null) { if (coupon.IsShareEnabled == false) { return(404); } var couponProduct = this.SiteDatabase.GetById <Product>(coupon.ProductId); if (couponProduct.Url.Contains("/archive/")) { return(new { IsValid = false }); } var reg = this.SiteDatabase.GetById <AffiliateRegistration>(coupon.AffiliateRegistrationId); return(new { AffiliateId = reg.Id, AffiliateName = reg.AffiliateName, AffiliateRewardsId = coupon.AffiliateRewardsId, CouponId = coupon.Id, CouponCode = coupon.DiscountCode, CouponAttributes = coupon.CouponAttributes }); } } return(404); }); Get["/__affiliate/getreward"] = this.HandleRequest((arg) => { if (this.Request.Cookies.ContainsKey("reward")) { var id = this.Request.Cookies["reward"]; var reward = this.SiteDatabase.GetById <AffiliateReward>(int.Parse(id)); if (reward != null) { if (reward.IsDirectClaim == false) { return(404); } if (reward.IsRewardsClaimable == false) { return(new { IsValid = false }); } return(reward); } } return(404); }); Get["/__affiliate/myrewards"] = this.HandleRequest((arg) => { if (this.CurrentUser.IsAnonymous) { return(401); } return(this.SiteDatabase.Query <AffiliateRewardsClaim>() .Where(c => c.NcbUserId == this.CurrentUser.Id) .AsEnumerable()); }); }