|
|
@@ -15,6 +15,7 @@ namespace Kitty_Fall.Website.Controllers
|
|
|
{
|
|
|
public class HomeController : BaseController
|
|
|
{
|
|
|
+ private static readonly TimeSpan QuickRegisterTimeout = TimeSpan.FromSeconds(15);
|
|
|
private readonly ILogger<HomeController> _logger;
|
|
|
private readonly IConfiguration _configuration;
|
|
|
private static readonly log4net.ILog log = log4net.LogManager.GetLogger(typeof(HomeController));
|
|
|
@@ -136,6 +137,7 @@ namespace Kitty_Fall.Website.Controllers
|
|
|
[HttpPost]
|
|
|
public async Task<IActionResult> RegisterQAction(string? productName)
|
|
|
{
|
|
|
+ var startedAt = Stopwatch.StartNew();
|
|
|
var msisdn = HttpContext.Session.GetComplexData<string>("msisdn") ?? "";
|
|
|
if (string.IsNullOrWhiteSpace(msisdn))
|
|
|
{
|
|
|
@@ -151,24 +153,25 @@ namespace Kitty_Fall.Website.Controllers
|
|
|
var packageName = string.IsNullOrWhiteSpace(productName)
|
|
|
? GetParameter("productName")
|
|
|
: productName.Trim();
|
|
|
-
|
|
|
- if (string.IsNullOrWhiteSpace(packageName))
|
|
|
+ try
|
|
|
{
|
|
|
- var packages = await PackagesCacheHelper.GetOrLoadAsync(log, HttpContext.Session, baseUrl, GetCurrentLanguage());
|
|
|
- packageName = packages.FirstOrDefault() is { } firstPackage
|
|
|
- ? ReadPackageString(firstPackage, "productName")
|
|
|
- : "";
|
|
|
- }
|
|
|
+ if (string.IsNullOrWhiteSpace(packageName))
|
|
|
+ {
|
|
|
+ var packages = await PackagesCacheHelper
|
|
|
+ .GetOrLoadAsync(log, HttpContext.Session, baseUrl, GetCurrentLanguage())
|
|
|
+ .WaitAsync(GetQuickRegisterRemainingTime(startedAt));
|
|
|
+ packageName = packages.FirstOrDefault() is { } firstPackage
|
|
|
+ ? ReadPackageString(firstPackage, "productName")
|
|
|
+ : "";
|
|
|
+ }
|
|
|
|
|
|
- if (string.IsNullOrWhiteSpace(packageName))
|
|
|
- {
|
|
|
- return Json(new { errorCode = CommonErrorCode.Error, message = "Package is not configured." });
|
|
|
- }
|
|
|
+ if (string.IsNullOrWhiteSpace(packageName))
|
|
|
+ {
|
|
|
+ return Json(new { errorCode = CommonErrorCode.Error, message = "Package is not configured." });
|
|
|
+ }
|
|
|
|
|
|
- try
|
|
|
- {
|
|
|
var language = GetCurrentLanguage();
|
|
|
- var res = await DotnetLib.Rest.RestHandler.SendPostAsync(
|
|
|
+ var registerTask = DotnetLib.Rest.RestHandler.SendPostAsync(
|
|
|
log,
|
|
|
baseUrl + UrlConstant.UserRegisterSubQuickUrl,
|
|
|
new UserRegisterReq
|
|
|
@@ -177,8 +180,8 @@ namespace Kitty_Fall.Website.Controllers
|
|
|
packageName = packageName,
|
|
|
language = language
|
|
|
},
|
|
|
- language
|
|
|
- );
|
|
|
+ language);
|
|
|
+ var res = await registerTask.WaitAsync(GetQuickRegisterRemainingTime(startedAt));
|
|
|
|
|
|
if (res?.data == null)
|
|
|
{
|
|
|
@@ -198,7 +201,16 @@ namespace Kitty_Fall.Website.Controllers
|
|
|
|
|
|
// VAS da cong luot dong bo; tai lai profile de trang Play khong
|
|
|
// tiep tuc doc totalTurn cu trong session.
|
|
|
- await LoadHomeDataAsync();
|
|
|
+ try
|
|
|
+ {
|
|
|
+ await LoadHomeDataAsync().WaitAsync(GetQuickRegisterRemainingTime(startedAt));
|
|
|
+ }
|
|
|
+ catch (TimeoutException)
|
|
|
+ {
|
|
|
+ // Registration already succeeded. Do not turn a successful charge into
|
|
|
+ // a timeout just because refreshing the Home data took too long.
|
|
|
+ log.Warn($"Quick register profile refresh timed out; continuing to Home. msisdn={msisdn}, packageName={packageName}, elapsedMs={startedAt.ElapsedMilliseconds}");
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
return Json(new
|
|
|
@@ -210,6 +222,17 @@ namespace Kitty_Fall.Website.Controllers
|
|
|
totalPoint = HttpContext.Session.GetComplexData<long?>("totalPoint") ?? 0
|
|
|
});
|
|
|
}
|
|
|
+ catch (TimeoutException ex)
|
|
|
+ {
|
|
|
+ log.Warn($"Quick register timed out after {QuickRegisterTimeout.TotalSeconds:0}s; continuing to Home. msisdn={msisdn}, packageName={packageName}, elapsedMs={startedAt.ElapsedMilliseconds}", ex);
|
|
|
+ return Json(new
|
|
|
+ {
|
|
|
+ errorCode = CommonErrorCode.Error,
|
|
|
+ timedOut = true,
|
|
|
+ redirectUrl = Url.Action("Index", "Home") ?? "/",
|
|
|
+ message = "Registration is taking longer than expected. Please check your package status later."
|
|
|
+ });
|
|
|
+ }
|
|
|
catch (Exception ex)
|
|
|
{
|
|
|
log.Error("RegisterQAction error: ", ex);
|
|
|
@@ -217,6 +240,17 @@ namespace Kitty_Fall.Website.Controllers
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ private static TimeSpan GetQuickRegisterRemainingTime(Stopwatch stopwatch)
|
|
|
+ {
|
|
|
+ var remaining = QuickRegisterTimeout - stopwatch.Elapsed;
|
|
|
+ if (remaining <= TimeSpan.Zero)
|
|
|
+ {
|
|
|
+ throw new TimeoutException("Quick register exceeded its 15-second time limit.");
|
|
|
+ }
|
|
|
+
|
|
|
+ return remaining;
|
|
|
+ }
|
|
|
+
|
|
|
[HttpPost]
|
|
|
public async Task<IActionResult> CancelPackage(string? packageName)
|
|
|
{
|