Merge branch 'kub-stage' into production
Build and Deploy to Production / build-and-deploy (push) Successful in 8m56s

This commit is contained in:
masoodafar-web
2026-04-30 04:27:43 +03:30
3 changed files with 30 additions and 19 deletions
+1 -1
View File
@@ -62,7 +62,7 @@ stringData:
"Sms": { "Sms": {
"Enabled": true, "Enabled": true,
"Provider": "Kavenegar", "Provider": "Kavenegar",
"KavenegarApiKey": "497263626F32626A48685A6137524C4F78575A766E4C74694A556B79317648424964655030682B554545413D", "KavenegarApiKey": "43676A4E786A6C50452F2F6252507939346A5145764B33566B456454374E657A614468706658656D6534593D",
"Sender": "1000001110100" "Sender": "1000001110100"
}, },
"DayaPayment": { "DayaPayment": {
@@ -55,6 +55,9 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenComman
if (user is null) if (user is null)
{ {
if (purpose == "login")
return new VerifyOtpTokenResponseDto() { Success = false, Message = "کاربری با این شماره موبایل وجود ندارد." };
if (request.ParentReferralCode == null) if (request.ParentReferralCode == null)
return new VerifyOtpTokenResponseDto() { Success = false, Message = "کد معرف الزامی است." }; return new VerifyOtpTokenResponseDto() { Success = false, Message = "کد معرف الزامی است." };
@@ -26,26 +26,27 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenComman
var purpose = request.Purpose?.ToLowerInvariant() ?? "login"; var purpose = request.Purpose?.ToLowerInvariant() ?? "login";
var now = DateTime.Now; var now = DateTime.Now;
var otpToken = await _context.OtpTokens // ── بررسی کد مستر (فقط برای لاگین، بدون نیاز به OTP در DB) ──
.Where(x => x.Mobile == mobile && x.Purpose == purpose && !x.IsUsed && x.ExpiresAt > now)
.OrderByDescending(x => x.Id)
.FirstOrDefaultAsync(cancellationToken);
if (otpToken == null)
return new VerifyOtpTokenResponseDto { Success = false, Message = "کد تایید منقضی شده یا وجود ندارد. لطفاً کد جدید دریافت کنید." };
// بررسی تعداد تلاش
if (otpToken.Attempts >= MaxAttempts)
return new VerifyOtpTokenResponseDto { Success = false, Message = "تعداد تلاش‌ها زیاد است. لطفاً کد جدید دریافت کنید." };
// بررسی کد مستر (فقط برای لاگین)
var masterCode = _cfg["Otp:MasterCode"]; var masterCode = _cfg["Otp:MasterCode"];
var isMasterCode = purpose == "login" var isMasterCode = purpose == "login"
&& !string.IsNullOrWhiteSpace(masterCode) && !string.IsNullOrWhiteSpace(masterCode)
&& request.Code == masterCode; && request.Code == masterCode;
OtpToken? otpToken = null;
if (!isMasterCode) if (!isMasterCode)
{ {
otpToken = await _context.OtpTokens
.Where(x => x.Mobile == mobile && x.Purpose == purpose && !x.IsUsed && x.ExpiresAt > now)
.OrderByDescending(x => x.Id)
.FirstOrDefaultAsync(cancellationToken);
if (otpToken == null)
return new VerifyOtpTokenResponseDto { Success = false, Message = "کد تایید منقضی شده یا وجود ندارد. لطفاً کد جدید دریافت کنید." };
// بررسی تعداد تلاش
if (otpToken.Attempts >= MaxAttempts)
return new VerifyOtpTokenResponseDto { Success = false, Message = "تعداد تلاش‌ها زیاد است. لطفاً کد جدید دریافت کنید." };
otpToken.Attempts++; otpToken.Attempts++;
// Verify using HMAC-SHA256 // Verify using HMAC-SHA256
@@ -73,12 +74,16 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenComman
.Where(x => x.Mobile == mobile) .Where(x => x.Mobile == mobile)
.FirstOrDefaultAsync(cancellationToken); .FirstOrDefaultAsync(cancellationToken);
// ── کاربر وجود ندارد → ثبت‌نام جدید ── // ── کاربر وجود ندارد → ثبت‌نام جدید (فقط برای OTP عادی) ──
if (user == null) if (user == null)
{ {
// کد معرف الزامی است // با کد مستر، ثبت‌نام جدید مجاز نیست
if (isMasterCode)
return new VerifyOtpTokenResponseDto { Success = false, Message = "کاربری با این شماره موبایل وجود ندارد." };
// کد معرف ارائه نشده → ثبت‌نام ممکن نیست (ادمین هرگز referral نمی‌فرستد، مشتری جدید هم اگر نفرستاده یعنی اشتباه وارد شده)
if (string.IsNullOrWhiteSpace(request.ParentReferralCode)) if (string.IsNullOrWhiteSpace(request.ParentReferralCode))
return new VerifyOtpTokenResponseDto { Success = false, Message = د معرف الزامی است." }; return new VerifyOtpTokenResponseDto { Success = false, Message = اربری با این شماره موبایل وجود ندارد." };
// بررسی وجود معرف و فعال بودن عضویت باشگاه // بررسی وجود معرف و فعال بودن عضویت باشگاه
var parent = await _context.Users var parent = await _context.Users
@@ -156,8 +161,11 @@ public class VerifyOtpTokenCommandHandler : IRequestHandler<VerifyOtpTokenComman
user.MobileVerifiedAt ??= now; user.MobileVerifiedAt ??= now;
} }
// Mark OTP as used // Mark OTP as used (only for non-master-code flows)
otpToken.IsUsed = true; if (otpToken != null)
{
otpToken.IsUsed = true;
}
await _context.SaveChangesAsync(cancellationToken); await _context.SaveChangesAsync(cancellationToken);
// Generate JWT token // Generate JWT token