أنماط API للتطبيقات
آخر تحديث: أغسطس 2026 الحالة: تدقيق مكتمل - يتطلب إجراء
ملخص تنفيذي
| التطبيق | الامتثال | المشاكل الحرجة |
|---|---|---|
| تطبيق العميل | ~75% | عمليات الدفع تتجاوز REST API |
| تطبيق السائق | ~20% | جميع العمليات تستخدم Supabase مباشرة |
البنية الموصى بها
┌─────────────────────────────────────────────────────────────────┐
│ تطبيق الموبايل │
├─────────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ المصادقة │ │ العمليات │ │ الوقت │ │
│ │ │ │ التجارية │ │ الحقيقي │ │
│ └──────┬───────┘ └──────┬───────┘ └──────┬───────┘ │
└─────────┼───────────────────┼───────────────────┼────────────────┘
│ │ │
▼ ▼ ▼
┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐
│ Supabase Auth │ │ REST API │ │ Supabase │
│ (مباشر) │ │ (Next.js) │ │ Subscriptions │
└─────────────────┘ └────────┬────────┘ └─────────────────┘
│
▼
┌─────────────────┐
│ Supabase │
│ (PostgreSQL) │
└─────────────────┘
قنوات الاتصال
| القناة | الاستخدام | السبب |
|---|---|---|
| Supabase Auth | تسجيل الدخول، OTP، الجلسات | مصمم لهذا الغرض |
| REST API | جميع العمليات التجارية | منطق مركزي، معاملات |
| Supabase Subscriptions | تحديثات حية (اختياري) | دعم مدمج |
عقد الاستجابة في تطبيق العميل
تتحقق ApiService من جسم الاستجابة قبل إعادته إلى طبقة الميزات. العقد العام هو Map<String, dynamic>، والاستجابة الناجحة الفارغة تصبح {}، أما JSON من نوع مصفوفة أو قيمة أولية فينتج خطأ INVALID_RESPONSE. يمنع ذلك انتشار dynamic والأخطاء المتأخرة في الشاشات، ويجب الحفاظ على هذا العقد عند إضافة endpoint جديد.
تنسق الخدمة أيضاً تحديث رمز الجلسة عبر عملية واحدة مشتركة بين الطلبات المتزامنة، وتعيد المحاولة فقط لأخطاء الشبكة والمهلات و5xx. لا تُعد إعادة المحاولة بديلاً عن idempotency في عمليات الكتابة.
حالة الامتثال
✅ ممتثل - يستخدم REST API
| الفئة | العمليات |
|---|---|
| المصادقة | sendOtp(), verifyOtp(), logout() |
| المدن والمسارات | getCities(), getPopularRoutes() |
| الرحلات | searchTrips(), getTripById(), getTripSeats() |
| الحجوزات | createBookingWithSeats(), getBookings(), cancelBooking() |
| الملف الشخصي | getProfile(), updateProfile() |
| الدعم | getTickets(), createTicket() |
❌ غير ممتثل - Supabase مباشر
1. عمليات الدفع (حرج)
| العملية | المشكلة |
|---|---|
createPayment() | استدعاء Edge Function مباشر |
getPayment() | استعلام قاعدة بيانات مباشر |
cancelPayment() | تحديث قاعدة بيانات مباشر |
التوصية: إنشاء endpoints REST:
POST /api/payments
GET /api/payments/[id]
PATCH /api/payments/[id]/cancel
2. توليد رمز QR
| العملية | المشكلة |
|---|---|
getBookingQRData() | استخدام RPC مباشر |
التوصية:
GET /api/bookings/[id]/qr
عناصر العمل
الأولوية 1: حرج (أمان الدفع)
- إنشاء endpoints REST للدفع
- تحديث التطبيق لاستخدام REST
- إزالة طرق الدفع من
SupabaseService
الأولوية 2: عالي (الاتساق)
- إنشاء endpoint QR
- إزالة
getBookingQRData()منSupabaseService
الأولوية 3: متوسط (تنظيف)
- إزالة الطرق المكررة غير المستخدمة
ملخص
| الفئة | ممتثل | غير ممتثل |
|---|---|---|
| المصادقة | ✅ | - |
| الرحلات | ✅ | - |
| الحجوزات | ✅ | - |
| المدفوعات | - | ❌ 7 طرق |
| الملف الشخصي | ✅ | ❌ 2 طريقة |
الامتثال الكلي: ~75%
تطبيق السائق
❌ مشكلة رئيسية: لا يوجد طبقة REST API
تطبيق السائق لا يحتوي على ApiService. جميع العمليات تستخدم Supabase مباشرة.
النمط الحالي (غير ممتثل)
تطبيق السائق → Supabase مباشر (جميع العمليات)
يجب أن يكون
تطبيق السائق → REST API (عمليات الأعمال) → Supabase
→ Supabase Auth (المصادقة فقط)
التوصيات
- إنشاء
DriverApiService - إنشاء endpoints
/api/driver/* - تحديث
SyncServiceلاستخدام REST API
آخر تحديث: أغسطس 2026