Files
tripz-llc/backend
Hamza-AyedandClaude Opus 4.8 1605754722 feat: باقي المجموعة I — أمان السحب (OTP + بصمة + HMAC + تدقيق)
I4 — OTP على السحب عبر نبيه. تدفّق خطوتين، وقاعدته: **لا يتحرك مال قبل
إثبات الهوية**:
- POST /payouts/request → يرسل رمزاً، حالة pending_otp، **بلا خصم**
- POST /payouts/:id/confirm → يتحقق ثم يحجز ذرّياً (خصم I1)
- حدّ 5 محاولات (رمز 4 خانات يُخمَّن في دقائق بلا حدّ)، الرمز يُستهلك مرة
- complete يرفض طلباً بلا otp_verified_at (حارس ضد تخطّي التأكيد)
- fail لا يردّ مالاً لطلب pending_otp — لم يُخصم منه شيء، وردّه يخلق مالاً

I5 — biometric_method/at + device_id + request_ip على السحب. أثرٌ للتحقيق
لا مصادقة: العميل يستطيع ادّعاءها، والمصادقة الحقيقية JWT + رمز واتساب.

I6 — HMAC **مبنيّ ومطفأ** (PAYMENTS_REQUIRE_SIGNATURE=false) حتى يوقّع
فلاتر؛ تفعيله الآن يقطع كل سحب. مفتاح **لكل جلسة** يُصدره الدخول لا سرّ
ثابت في التطبيق (الثابت يُستخرج بالهندسة العكسية فيصير التوقيع مسرحية).
يوقّع timestamp.METHOD.path.body بنافذة 5 دقائق؛ rawBody مفعّل في main.

I7 — tripz_audit_log append-only: من·ماذا·متى·أي IP وجهاز. لا يرمي أبداً —
فشل التدقيق يجب ألّا يُسقط عمليةً مالية نجحت.

I2 أُلغيت الحاجة إليها: إيراد المنصة = الشحن، و credit_txns دفتره فعلاً؛
محفظة ثانية = دفتر مزدوج يحتاج مطابقة. الباقي تقرير لا محفظة.
I3/I8 مؤجَّلتان بوعي (توثيق في docs/17).

wallet-race-test.mjs حُدِّث: السباق انتقل من request إلى confirm، وأُضيف
محكّ أن الطلب وحده لا يمسّ الرصيد.

هجرة: PayoutSecurityAndAudit (تعتبر السحوبات القائمة مُتحقَّقة وإلا رفض
complete صرفها للأبد).

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-07-17 16:22:00 +03:00
..

Tripz Backend — NestJS (Docker فقط)

لا تثبيت محلي على الماك. الكود يُكتب محلياً، والبناء والتشغيل والهجرات كلها داخل Docker على السيرفر.

التشغيل على السيرفر

cd backend
cp .env.example .env          # ثم عدّل كلمات المرور والأسرار
docker compose up -d --build  # يبني ويشغّل: postgres/postgis, redis, martin, api, worker

الهجرات (داخل حاوية الـ api)

docker compose exec api npm run migration:run

الهجرات تعمل على النسخة المترجمة dist/config/data-source.js (صورة الإنتاج بلا ts-node). لو ما رفعت آخر نسخة بعد، شغّل مباشرة: docker compose exec api node_modules/.bin/typeorm migration:run -d dist/config/data-source.js

فحص سريع

curl http://<server>:4010/api/health           # {"status":"ok",...}
# توثيق Swagger: http://<server>:4010/api/docs

العزل على السيرفر المشترك (راجع docs/14)

  • Postgres: قاعدة tripz، بادئة جداول tripz_ (مثال: tripz_tenants).
  • Redis: DB رقم 3 غير الافتراضي + بادئة مفاتيح tripz:.
  • منافذ مضيف غير قياسية (API 4010، Postgres 55432) لتفادي التصادم.
  • أسماء حاويات/شبكة/فوليوم ببادئة tripz-.

البنية الحالية (P0)

src/
├── main.ts                 # bootstrap API (+ Swagger)
├── worker.ts               # نقطة دخول BullMQ (هيكل)
├── app.module.ts           # ConfigModule + TypeORM(entityPrefix) + Throttler + TenantMiddleware
├── config/                 # configuration.ts + data-source.ts (هجرات)
├── common/
│   ├── tenant/             # context (AsyncLocalStorage) + middleware + @Tenant()
│   └── usage/              # UsageInterceptor (أساس الفوترة)
├── database/
│   ├── entities/           # tenant.entity.ts
│   └── migrations/         # InitTenants
└── modules/
    ├── health/             # GET /api/health
    └── tenants/            # GET /api/tenant/config/:slug ، admin/tenants

التالي (P1)

users · auth(OTP) · drivers · trips(★ آلة حالة) · matching(Redis GEO) · tariff · realtime(Socket.IO) · maps(وكيل انطلق).