P1 complete: real انطلق maps + Nabeh WhatsApp OTP + chat + ratings + cancel(both) + fraud detection

- maps: real map-saas route/geocode/reverse/places (x-api-key per country) + straight-line fallback
- auth: Redis-backed OTP + Nabeh WhatsApp send (dev mode keeps fixed 1234 bypass)
- chat: per-trip messages (participant-guarded) + socket broadcast
- ratings: post-trip rating + driver avg recompute + no double-rate
- cancel: from rider or driver + stage-based cancel fee + notify both
- fraud: cancel-abuse (soft/hard block via Redis), arrived-far-from-pickup, completed-too-fast → fraud_flags
- migration InitP1b (chat_messages, ratings, fraud_flags, trips.cancelled_by/cancel_fee)

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-16 17:12:38 +03:00
co-authored by Claude Opus 4.8
parent 00870a8cc3
commit 65a2e5e275
25 changed files with 948 additions and 53 deletions
+19
View File
@@ -45,5 +45,24 @@ export default () => ({
maps: {
tilesUrl: process.env.MAPS_TILES_URL ?? 'http://martin:3000',
provider: process.env.MAPS_PROVIDER ?? 'antlaq',
// خرائط انطلق (map-saas). مفتاح افتراضي + مفاتيح لكل دولة.
baseUrl: process.env.MAPS_BASE_URL ?? 'https://map-saas.intaleqapp.com',
apiKey: process.env.MAPS_API_KEY ?? '',
apiKeyByCountry: {
jo: process.env.MAPS_API_KEY_JO ?? process.env.MAPS_API_KEY ?? '',
sy: process.env.MAPS_API_KEY_SY ?? process.env.MAPS_API_KEY ?? '',
} as Record<string, string>,
placesApiKey: process.env.MAPS_PLACES_API_KEY ?? process.env.MAPS_API_KEY ?? '',
},
// Nabeh — إرسال OTP عبر واتساب.
nabeh: {
baseUrl: process.env.NABEH_BASE_URL ?? 'https://nabeh.intaleqapp.com',
email: process.env.NABEH_EMAIL ?? '',
password: process.env.NABEH_PASSWORD ?? '',
otpType: process.env.NABEH_OTP_TYPE ?? 'text',
},
// رموز الاتصال الدولية لكل country pack (لتنسيق الهاتف قبل الإرسال).
callingCodes: { jo: '962', sy: '963' } as Record<string, string>,
});