این پروژه بکاند پلتفرم توراپ سامانه رزرو و مدیریت تورهای طبیعتگردی است. مسافران تور را پیدا میکنند، ثبتنام میکنند و همراهان خود را اضافه میکنند، و با کیف پول یا درگاه پرداخت هزینه را میدهند. لیدرهای تور و گروهها، باشگاه و امتیازها، نظرسنجی، اعلانها و تیکت پشتیبانی هم در همین سامانهاند. اپلیکیشن موبایل از طریق API با این بکاند کار میکند.
نسخه قدیمی بکاند را از ابتدا بازنویسی کردم و روی Laravel 12، Filament 5 و PostgreSQL آوردم. شرط اصلی این بود که اپلیکیشنهای موجود بدون هیچ تغییری به کار خود ادامه بدهند.
تکنولوژیها: Laravel 12، Filament 5، PostgreSQL، PHP 8.2+، Pest، Docker، CI
نحوه انتقال
۱. تحلیل و مستندسازی قبل از کد. ابتدا کد قدیمی را کامل بررسی کردم و برای هر اندپوینت یک سند قرارداد نوشتم (مسیر، ورودی، خروجی و نمونه پاسخ). یک فایل OpenAPI هم از همه اندپوینتها ساختم.
۲. قرارداد API منجمد. مسیر، متد، ورودی و خروجی هر اندپوینت عیناً مثل قبل ماند، تا کلاینتهای موجود به هیچ تغییری نیاز نداشته باشند.
۳. طراحی مجدد دیتابیس. دیتابیس از MySQL به PostgreSQL رفت. ERD از نو و با نامگذاری یکدست طراحی شد: ستونهای صریح و typeدار، وضعیتها با enum، تاریخها به UTC و مبالغ به تومان.
۴. جایگزینی API مدیریتی با پنل Filament. دو پنل مدیریتی ساخته شد، یکی برای ادمین و یکی برای لیدر تور.
۵. انتقال داده. دادههای دیتابیس قدیمی با یک دستور Artisan به ساختار جدید منتقل شد و صحت انتقال با تستهای خودکار بررسی شد.
۶. تضمین کیفیت. حدود ۱۶۵۰ تست خودکار با Pest روی PostgreSQL واقعی اجرا میشود. هر اندپوینت یک تست قرارداد دارد و خروجی ۵۱ اندپوینت قدیمی با نمونههای اصلی مقایسه شد. تحلیل ایستا (Larastan) و بررسی استایل (Pint) هم در CI اجرا میشوند.
۷. استقرار. سند عملیاتی جداگانهای برای سوییچ نهایی از سیستم قدیمی به جدید نوشتم.
نتیجه
- ۷۲ مسیر API: ۵۱ اندپوینت موروث با قرارداد کاملاً منجمد، ۷ اندپوینت تیکتینگ جدید و چند اندپوینت و کالبک پرداخت.
- حدود ۱۶۵۰ تست خودکار سبز.
- ۲۵ تصمیم معماری مستند (ADR).
- امکانات جدید پس از تحویل: درگاههای پرداخت چندگانه، مقاصد طبیعتگردی، برچسب گروه، برنامه معرفی (کد معرف) و بکآپ از پنل ادمین.
درسها
- مستندسازی قبل از کد، هزینه بازنویسی را بهشدت پایین میآورد.
- در بازنویسی با قرارداد منجمد، حفظ رفتار قبلی از «بهتر کردن» آن مهمتر است.