Merge branch 'kub-stage' into production
Build and Deploy to Production / build-and-deploy (push) Successful in 8m56s
Build and Deploy to Production / build-and-deploy (push) Successful in 8m56s
This commit is contained in:
@@ -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": {
|
||||||
|
|||||||
+3
@@ -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
-18
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user