تجارت الکترونیک سفارشی روی Firebase

من یک سایت تجارت الکترونیک سفارشی را از صفر ساختم. از پلتفرم‌های آماده استفاده نکردم؛ در عوض، از Firebase Realtime Database و Netlify استفاده کردم.

مشتری به یک ساختار خاص نیاز داشت. آن‌ها کاتالوگ محصول با انواع قیمت‌گذاری و یک پنل مدیریت می‌خواستند. همچنین تیم فروش آن‌ها نیاز داشت که سفارش‌ها را مستقیماً از طریق سایت ثبت کنند.

در اینجا نحوه حل چالش‌های فنی اصلی را توضیح می‌دهم.

جداسازی داده‌ها

من پایگاه داده تجارت الکترونیک را از پایگاه داده مدیریت داخلی جدا نگه داشتم. این کار از ترکیب داده‌های تجاری با فایل‌های حساس مانند حقوق کارکنان یا بودجه‌ها جلوگیری می‌کند.

مدل‌سازی داده‌ها برای قیمت‌گذاری

طرح‌های قیمت‌گذاری اغلب در محصولات مختلف تکرار می‌شوند. اگر داده‌های طرح را در هر محصول کپی کنید، به‌روزرسانی‌ها به یک کابوس تبدیل می‌شوند.

  • من یک آرشیو جهانی برای تمام طرح‌ها ایجاد کردم.
  • هر محصول فقط شامل آرایه‌ای از شناسه (ID) طرح‌ها است.
  • این کار به‌روزرسانی‌ها را سریع کرده و از خطاهای داده‌ای جلوگیری می‌کند.

شماره‌گذاری اتمیک سفارش‌ها

وقتی چندین نفر همزمان سفارش ثبت می‌کنند، با مشکل race condition (شرایط رقابتی) مواجه می‌شوید. اگر دو کاربر آخرین شماره سفارش را یکسان بخوانند، یکی از سفارش‌ها جایگزین دیگری می‌شود.

  • من از Firebase transactions برای حل این مشکل استفاده کردم.
  • تابع runTransaction تضمین می‌کند که شماره حتی با وجود کاربران همزمان زیاد، به درستی افزایش یابد.
  • این کار تضمین می‌کند که هر سفارش شماره منحصربه‌فردی داشته باشد.

دسترسی امن مدیریت

نمی‌خواستم رمز عبورها را در کد منبع ذخیره کنم. همچنین از هش‌های ساده مانند MD5 پرهیز کردم.

  • من از PBKDF2 از طریق Web Crypto API استفاده کردم.
  • این روش هزاران تکرار را روی هش اعمال می‌کند.
  • این کار حملات brute-force را برای هکرها بسیار پرهزینه می‌کند.
  • من فقط salt و hash را در کد ذخیره می‌کنم.

اصلاح باگ «صفر»

متوجه باگی شدم که در آن محصولاتی با قیمت 0 به عنوان "قیمت باید تعیین شود" نمایش داده می‌شدند.

  • این اتفاق به این دلیل رخ می‌داد که JavaScript عدد 0 را به عنوان "falsy" در نظر می‌گیرد.
  • من با تغییر منطق خود این مشکل را حل کردم.
  • به جای استفاده از "price || null"، از "price != null" استفاده کردم.
  • این کار تضمین می‌کند که سیستم، عدد 0 را به عنوان یک عدد معتبر تشخیص دهد.

پیکربندی CSP

Firebase از زیردامنه (subdomain)های پویا استفاده می‌کند. یک تگ HTML استاندارد meta برای Content Security Policy (CSP) نمی‌تواند این wildcardها را مدیریت کند.

  • من CSP را از HTML به هدرهای HTTP در Netlify منتقل کردم.
  • این کار به من اجازه داد تا از wildcardها استفاده کنم تا سرویس‌های Firebase به درستی کار کنند.

ساخت سیستم‌های سفارشی چیزی فراتر از صرفاً کدنویسی است. این کار مستلزم انتخاب‌های معماری است که از شکست در محیط تولید (production) جلوگیری کند.

منبع: https://dev.to/androve2k/custom-e-commerce-on-firebase-catalog-atomic-orders-and-admin-panel-42ec