#P1481
POST /base/accommodation/rooms/delete
Route Info
| Method |
Endpoint |
Controller |
Middleware |
Purpose |
| POST |
/api/v2/base/accommodation/rooms/delete |
V2BaseController@accommodationRoomsDelete |
authWithJwt |
حذف گروهی انواع اتاقهای اقامتگاه و نگاشتهای مربوطه از جداول سیستم. |
منطق عملکرد تابع
تابع
accommodationRoomsDelete مسئول حذف تمام انواع اتاقهای وابسته به یک اقامتگاه (هتل) است. این تابع ابتدا شناسههای اتاقهای وابسته را بر اساس پارامتر ورودی
accommodation_id واکشی میکند، سپس نگاشتهای تبعی در جدول
mapping_roomtypes را پاک کرده و در نهایت خود رکوردهای اتاقهای اقامتگاه را حذف میکند.
منطق کلی:
- دریافت ورودی
accommodation_id و اختیاری service.
- ایجاد کوئری داخلی با
JOIN بین جداول accommodation_roomtypes و mapping_roomtypes.
- در صورت وجود پارامتر
service، فقط اتاقهایی حذف میشوند که دارای مقدار در آن سرویس باشند.
- پس از حذف از دو جدول، پاسخ موفق شامل وضعیت بولی
payload=true بازگردانده میشود.
| نام پارامتر |
نوع داده |
منبع |
الزامی |
توضیح |
| accommodation_id |
integer |
Body |
بله |
شناسه اقامتگاه مقصد برای حذف اتاقها. |
| service |
string |
Body |
اختیاری |
نام سرویس (مثلاً snapptrip) برای اعمال حذف محدود. |
نمونه درخواست:
POST /api/v2/base/accommodation/rooms/delete
Authorization: Bearer {JWT_TOKEN}
Content-Type: application/json
{
"accommodation_id": 1870,
"service": "snapptrip"
}
خروجی (Response)
| فیلد |
نوع داده |
توضیح |
| payload |
boolean |
نمایانگر موفقیت حذف رکوردها. |
| meta.timestamp |
integer |
زمان یونیکس ثبت پاسخ. |
نمونه پاسخ موفق:
{
"payload": true,
"meta": {
"timestamp": 1750669152
}
}
نکات امنیتی
- مسیر فقط با احراز هویت JWT معتبر قابل دستیابی است.
- تمام رکوردها فقط از شعبه مربوطه حذف میشوند در صورت اعمال کنترل مرکزی (پیشنهاد: اضافه شود).
- بدون تأیید پیششرط، حذف دادهها خطرناک است — نیاز به اعتبارسنجی نقش (Role).
- عملیات
delete() همزمان روی دو جدول انجام میگیرد، بنابراین هزینه I/O دو برابر معمول است.
- پیشنهاد میشود حذفها در تراکنش
DB::transaction() انجام گیرند تا از ناسازگاری داده جلوگیری شود.
- TTL کش مربوطه (Redis) برای کلید
accommodations:cron:services:{service}:{accommodation_id} باید پس از حذف ریست شود.
وابستگیها
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Redis;
- use Carbon\Carbon;
- use Exception;
کدهای خطا
| کد |
شرح خطا |
منبع |
| 404 |
شناسه اقامتگاه وجود ندارد یا خالی است. |
accommodationRoomsDelete() |
| 403 |
کاربر مجاز به حذف رکورد نیست. |
authWithJwt |
| 500 |
خطا در حذف رکورد از DB. |
DB Facade |
پیشنهادهای امنیتی
- افزودن ROLE "DataManager" برای کنترل سطح حذف.
- لاگگذاری حذفها در جدول audit به همراه شناسه اقامتگاه و شناسه اپراتور.
- اضافه کردن تأیید دو مرحلهای برای حذفهای گسترده.
پیشنهادهای بهبود
- استفاده از SoftDelete برای حفظ تاریخچه رکوردهای اتاق.
- ارسال پاسخ تفکیکی شامل تعداد رکوردهای حذفشده.
- امکان فیلتر حذف بر اساس وضعیت فعال یا سرویس خاص.
- اتصال حذفها به فرآیند Cron برای بهروزرسانی خدمات خارجی.
ممیزی و لاگها
- ثبت لاگ با نوع
DeleteRoomType.
- فیلدهای پیشنهادی:
operator_id، branch، accommodation_id، service.
- سطح لاگ توصیهشده: Critical.
جمعبندی
مسیر POST /base/accommodation/rooms/delete نقطه اصلی برای پاکسازی انواع اتاقهای اقامتگاه است. حذف همزمان نگاشتها و اتاقها بدون Transaction انجام میشود که باید در نسخه بعدی اصلاح گردد. پیشنهاد میشود پس از حذف، کلیدهای Redis مربوطه آزاد (evict) شوند تا وضعیت لحظهای سرویسهای اتاقدار (مانند Snapptrip) با منبع هماهنگ بماند.