Snurlax Cosmetics API
الواجهة الخلفية لمتجر إلكتروني لعلامة تجارية في مستحضرات التجميل، طُوّرت بالتعاون مع مطوّر آخر. واجهة برمجية بـ Express وMongoDB تغطي الحسابات والمنتجات والفئات وسلة الشراء والمفضّلة والطلبات، مع مصادقة JWT وتشفير bcrypt، ودور مسؤول والتحقق عبر الهاتف، ورفع الصور عبر Multer، والبريد المعاملاتي عبر Nodemailer، والإشعارات الفورية عبر Firebase. مُحزّمة بـ Docker Compose للنشر.
- دَوري
- مطور خلفية
- الفترة
- أغسطس 2023 – أكتوبر 2023
- الحالة
- مُنجز
هذا هو الجانب الخادمي لمتجر إلكتروني لعلامة مستحضرات تجميل، طُوّر في Snurlax Digital: واجهة REST تقود المتسوّق من تصفّح الكتالوج إلى إتمام الطلب، ويستهلكها تطبيق موبايل مبني بـ Flutter طوّره زميل بالتوازي. كان هذا أول دور مهني لي في Snurlax Digital، حيث تولّيت الجانب الخلفي ضمن فريق من مطوّرَين — ما جعل كل نقطة نهاية بمثابة عقد يعتمد عليه تطبيق الموبايل.
تتمحور الواجهة حول كائنات المتجر — المستخدمون والمنتجات والتصنيفات والسلال والمفضلة والطلبات — محفوظةً كمستندات MongoDB خلف مسارات Express. أما الشؤون المشتركة فتعيش في وسائط: تحقق من JWT على المسارات المحمية، وبوابة لدور المدير على إدارة الكتالوج، وMulter على نقاط رفع الصور. يخرج البريد التعاملي عبر Nodemailer والإشعارات الفورية عبر Firebase، ويشغّل Docker Compose الواجهة وقاعدة البيانات كمنظومة واحدة قابلة لإعادة الإنتاج.
المشكلة المطلوب حلّها
على أي خادم للتجارة الإلكترونية أن يتقن الأجزاء غير اللامعة: حسابات لا يمكن اختطافها، ومسار طلب يعكس محتوى السلة فعلاً، وواجهة إدارة لا يصل إليها المتسوّقون. وهنا كان على كل ذلك — الهوية والكتالوج والشراء ورفع الوسائط والمراسلات الصادرة — أن يجتمع في خدمة واحدة تُبنى في أول دور مهني، بينما يطوّر زميل عميل Flutter على الواجهة نفسها بالتوازي؛ فكان لزاماً أن تبقى نقاط النهاية مستقرة ومتوقّعة بما يكفي لتكون عقداً بين شخصين يعملان في آن واحد.
كيف بُني
الخدمة تطبيق Express واحد، بوحدة مسارات لكل مورد وتحتها مجموعات MongoDB. يخزّن التسجيل بيانات الدخول مجزّأة بـ bcrypt، ويبادلها تسجيل الدخول برمز JWT يتحقق منه وسيط على المسارات المحمية. يحصر دور المدير إدارة الكتالوج بأصحابه، ويربط التحقق الهاتفي كل حساب برقم يمكن الوصول إليه. تصل صور المنتجات كرفع متعدد الأجزاء عبر Multer، ويخرج البريد التعاملي عبر Nodemailer، وينقل Firebase الإشعارات الفورية إلى تطبيق الموبايل.
يعرّف Docker Compose الواجهة وقاعدتها كمنظومة واحدة، فيكون الخادم الذي برمج عليه مطوّر Flutter محلياً هو نفسه الذي نُشر — يقلع بأمر واحد بدل خادم يُهيَّأ يدوياً.
ماذا يفعل
مصادقة JWT مع bcrypt
تُخزَّن كلمات المرور مجزّأة بـ bcrypt وتقوم الجلسات على رموز JWT، مع وسيط يفحص الرمز على كل مسار محمي.
التحقق الهاتفي
يؤكد كل حساب رقم هاتف كتحقق ثانٍ من الهوية إلى جانب البريد الإلكتروني وكلمة المرور.
كتالوج منتجات مصنّف
تغذي نقاط نهاية المنتجات والتصنيفات تجربة التصفح، فيما تبقى عمليات الكتابة حكراً على دور المدير.
سلة ومفضلة وطلبات
مسار الشراء كله على الخادم: يحتفظ المتسوّق بسلة وقائمة مفضلة، وتتحول السلة إلى طلب.
رفع الصور عبر Multer
تستقبل نقاط الرفع الصور كطلبات متعددة الأجزاء عبر Multer لتزويد الكتالوج بصور المنتجات.
بريد وإشعارات
يرسل Nodemailer البريد التعاملي بينما يوصل Firebase الإشعارات الفورية إلى تطبيق Flutter.
بُني باستخدام
الخلفية
يحافظ Express على خفة واجهة REST: كل نطاق — المنتجات والسلة والطلبات — موجّه مستقل، وتتراكب وسائط التحقق من JWT وبوابة المدير ومعالجة Multer أمام المعالِجات.
العبء هنا إدخال/إخراج في معظمه — قراءات من قاعدة البيانات ورفع صور وإرسال بريد وإشعارات — وهو ما تخدمه حلقة أحداث Node غير الحاجبة من بيئة تشغيل JavaScript واحدة.
البيانات
تتطابق كيانات الكتالوج والمستندات الخاصة بكل مستخدم، كالسلة والمفضلة، مباشرة مع مستندات MongoDB، وتعيدها الواجهة بنفس بنية JSON التي يستهلكها تطبيق Flutter.
يتولى Firebase Cloud Messaging إيصال الإشعارات إلى تطبيق Flutter على المنصتين، فيكتفي الخادم بإطلاق الإشعار دون إدارة اتصالات دائمة مع الأجهزة.
البنية التحتية
يصف Docker Compose الواجهة وقاعدة MongoDB كمنظومة واحدة، فيعمل المطوّران وخادم النشر على بيئة متطابقة بأمر واحد.