2823fb45f5
Phone+OTP auth, staged onboarding, admin approval workflow, and a full discovery/swipe/match/chat system with photo upload and approximate distance (haversine) based on user location. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
42 lines
2.1 KiB
Go
42 lines
2.1 KiB
Go
package service
|
|
|
|
import "log"
|
|
|
|
// OTPSender اینترفیس ارسال پیامک کد تایید.
|
|
// برای اتصال به یک گیتوی واقعی (کاوهنگار، ملیپیامک و ...) کافیه یک
|
|
// پیادهسازی جدید از این اینترفیس بسازی و در main.go جایگزین mock کنی؛
|
|
// بقیهی کد (UserService و...) نیازی به تغییر ندارد.
|
|
//
|
|
// نکتهی مهم: پیادهسازی واقعی باید SYNC باشه (منتظر پاسخ گیتوی بمونه)
|
|
// و نتیجهی واقعی ارسال رو برگردونه؛ اگه async/بیخیال از نتیجه باشه،
|
|
// کاربر حتی در صورت شکست واقعی ارسال، پیام «با موفقیت ارسال شد» میگیره
|
|
// و منتظر کدی میمونه که هیچوقت نمیرسه.
|
|
type OTPSender interface {
|
|
// Send کد OTP را برای شمارهی دادهشده ارسال میکند.
|
|
// خروجی true یعنی گیتوی ارسال را با موفقیت تایید کرده است.
|
|
Send(phone string, otp string) bool
|
|
}
|
|
|
|
// MockOTPSender پیادهسازی توسعه/تست: بهجای ارسال واقعی پیامک،
|
|
// کد را در لاگ سرور چاپ میکند. برای پروداکشن باید با یک گیتوی واقعی
|
|
// جایگزین شود.
|
|
type MockOTPSender struct {
|
|
// Debug اگر true باشد، کد OTP در لاگ چاپ میشود (فقط برای dev/staging).
|
|
Debug bool
|
|
}
|
|
|
|
func NewMockOTPSender(debug bool) *MockOTPSender {
|
|
return &MockOTPSender{Debug: debug}
|
|
}
|
|
|
|
func (s *MockOTPSender) Send(phone string, otp string) bool {
|
|
if s.Debug {
|
|
log.Printf("[MOCK-SMS] کد OTP برای %s: %s", phone, otp)
|
|
} else {
|
|
log.Printf("[MOCK-SMS] یک کد OTP برای %s ارسال شد", phone)
|
|
}
|
|
// mock همیشه موفق فرض میشود؛ برای شبیهسازی خطای گیتوی میتونی
|
|
// این مقدار رو شرطی کنی (مثلاً بر اساس یک فلگ تستی).
|
|
return true
|
|
}
|