
تجارت الکترونیک · مهاجرت بکاند
Reniom.com — مهاجرت زنده بکاند
جایگزینی بکاند Next.js/Prisma یک فروشگاه آنلاین زنده با یک سرویس مستقل Django REST Framework روی ترافیک واقعی — فروشگاه، تسویه حساب، احراز هویت و کل پنل مدیریت اکنون روی API جدید اجرا میشوند، بدون هیچ تغییر ظاهری برای خریداران.
پشته فناوری
مهاجرت
Reniom در ابتدا روی بکاند Next.js/Prisma اجرا میشد. این بکاند بهطور کامل با یک سرویس مستقل Django به همراه Django REST Framework روی دیتابیس Postgres اختصاصی خودش در Railway جایگزین شد — مرور فروشگاه، تسویه حساب مهمان، ورود با OTP، صفحه حساب کاربری و کل پنل مدیریت اکنون همگی از طریق API جدید انجام میشوند. Prisma بهطور کامل از فرانتاند حذف شد (بدون وابستگی، بدون schema، بدون client)؛ اپلیکیشن Next.js روی Vercel به یک کلاینت خالص API تبدیل شد بدون هیچ تغییر ظاهری برای خریداران. این کار در چند فاز روی ترافیک زنده انجام شد: ساخت اسکلت و بازسازی مدلها، خواندن اطلاعات فروشگاه، سبد خرید و تسویه حساب، احراز هویت واقعی با OTP (جایگزین یک stub موقت توکن)، آپلود تصویر مخصوص کارکنان روی یک Railway Volume (جایگزین Vercel Blob)، یک اسکریپت مهاجرت داده یکباره و ایدمپوتنت از دیتابیس قدیمی Prisma، انتقال فروشگاه، CRUD مخصوص کارکنان و در نهایت تسویه حساب مهمان، تماس و پروفایل — که در همان نقطه Prisma بهطور کامل کنار گذاشته شد.
چرا UUID
هر مدل Django از یک کلید اصلی UUID بهجای عدد صحیح خودافزا استفاده میکند، دقیقاً به این دلیل که یک API عمومی در آینده هرگز شناسههای ترتیبی و قابلحدس را افشا نکند — دقیقاً مطابق با رشتههای مبهم cuid() خود Prisma، بهطوری که شکل شناسهای که یک کلاینت میبیند در طول کل مهاجرت هرگز تغییر نکرد.
مسئله slug
تسویه حساب مهمان عمداً طوری ساخته شد که بهجای شناسه دیتابیس، از slug محصول استفاده کند، چون سبدهای خریدی که پیش از انتقال در مرورگر بازدیدکننده ذخیره شده بودند، شناسههای قدیمی Prisma را داشتند که در طرح جدید UUID به هیچ چیز اشاره نمیکنند — slug تنها شناسهای است که در هر دو سیستم پایدار میماند.
بازتعریف PENDING
وضعیت سفارش PENDING عمداً بازتعریف شد تا بهجای «یک سفارش ثبتشده» (معنای قدیمی آن تحت Prisma)، به معنای «این سبد خرید زنده مشتری است» باشد، همراه با یک محدودیت دیتابیسی یک-سبد-معلق-بهازای-هر-مشتری؛ اسکریپت مهاجرت یکباره، ردیفهای PENDING با معنای قدیمی را به CONFIRMED نگاشت میکند تا تاریخچه سفارشها درست بماند.
احراز هویت مدیریت، عمداً جدا
احراز هویت مدیریت بهجای بازسازی مدل قدیمی و اختصاصی AdminUser، روی سیستم کاربری داخلی خود Django بازسازی شد، دقیقاً به این دلیل که فرآیند ورود با OTP حسابهای کاربری واقعی (غیر staff) میسازد و ورود مدیریت اکنون صراحتاً به is_staff نیاز دارد — یک تدبیر عمدی تا نشست OTP یک مشتری هرگز نتواند وارد یک نشست مدیریتی شود.