chore: أرشفة باك إند NestJS إلى backend-archive

قرار المالك 2026-07-27: الباك إند المعتمد صار باك إند سيرو PHP، ويُنقل
إلى هذا المستودع كنسخة جديدة باسم «انطلق» على api.intaleqapp.com.

backend/ → backend-archive/ (305 ملفاً، إعادة تسمية بلا تعديل محتوى)
+ README-ARCHIVE.md يوضّح سبب الأرشفة وسبب عدم الحذف: scripts/e2e-test.mjs
  هو أدق توثيق سلوكي لدورة الرحلة كاملة، ويبقى مرجعاً عند بناء الوحدات
  الناقصة في باك إند PHP (المحفظتان · الاستحقاقات · محرّك التسعير · الوحدات).

مسارات backend/ في docs/*.md لم تُعدَّل عمداً — سجلّ تاريخي.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Hamza-Ayed
2026-07-27 04:54:35 +03:00
co-authored by Claude Opus 5
parent 75b80bd299
commit fff76c949f
307 changed files with 47 additions and 0 deletions
@@ -0,0 +1,31 @@
/**
* مزوّد إرسال OTP واحد (docs/17 — D5؛ نمط سيرو auth/otp/providers.php).
*
* كل مزوّد يرسل رمزاً **نولّده نحن** (لا يولّده المزوّد) — فالرمز يبقى مصدره
* السيرفر ومخزَّناً في Redis، والمزوّد قناة توصيل فقط. هذا يختلف عن مزوّد
* Intaleq عند سيرو الذي يولّد الرمز بنفسه ويرجعه — استبعدناه عمداً حفاظاً على
* مصدر واحد للرمز.
*/
export interface OtpSendContext {
/** دولة المستأجر (jo | sy | eg) — تحدّد المزوّد. */
countryPack: string;
/** passenger | driver | admin | service — لتخصيص نصّ الرسالة. */
userType?: string;
}
export interface OtpProvider {
/** اسم قصير للتشخيص واللوغ. */
readonly name: string;
/** الدول التي يخدمها هذا المزوّد (رموز countryPack). */
supports(countryPack: string): boolean;
/**
* يرسل الرمز. يرجع `true` عند النجاح المؤكَّد فقط — أي فشل أو استجابة
* غامضة = `false` كي يجرّب المُوزِّع المزوّد التالي في السلسلة.
* **لا يرمي**: الرمي يقطع سلسلة الـfailover.
*/
send(phone: string, code: string, ctx: OtpSendContext): Promise<boolean>;
}
export const OTP_PROVIDERS = Symbol('OTP_PROVIDERS');