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 }