#P1652
POST /v2/core/accommodation/store
Core Accommodation Store
این اندپوینت یک اقامتگاه جدید (Hotel / Accommodation) را در سیستم ثبت میکند. دادهها از کلید data در بدنه درخواست دریافت شده و بهصورت کامل روی جدول hotels درج میشوند. سپس عملیاتهای جانبی شامل ذخیره لوگو و گالری رسانه، ثبت Mapping در جدول mapping_accommodations، و اجرای سه Job (UpdateRedis، SystemLog و RunCron) در صف انجام میشود.
Request Overview
URL:
/v2/core/accommodation/storeMethod: POST
Controller: CoreController@storeAccommodation
Middleware Stack: authWithJwt → core
Access Control
دسترسی فقط در صورتی مجاز است که:
- JWT معتبر باشد (middleware: authWithJwt)
- operator.branch == "[0]" باشد (middleware: core)
Request Body Schema
تمام ورودیها داخل کلید data ارسال میشوند.
| Field | Type | Required | Description |
|---|---|---|---|
| type | string | yes | نوع اقامتگاه (hotel, hostel, …) |
| title_fa | string | yes | نام فارسی |
| title_en | string | yes | نام انگلیسی |
| rate | integer | no | تعداد ستاره — اگر مقدار نداشته باشد 0 ذخیره میشود |
| country | integer | yes | ID کشور |
| state | integer | yes | ID استان |
| city | integer | yes | ID شهر |
| location | string | no | لوکیشن جغرافیایی (latitude,longitude) |
| address | string | yes | آدرس کامل |
| description | string | no | شرح |
| board | array | no | مثلاً: ["BB","HB","FB"] — در صورت خالی null |
| possibilities | array | no | امکانات — در صورت خالی null |
| details | object | yes | جزئیات کامل (json_encode ذخیره میشود) |
| site | string | no | وبسایت |
| string | no | ایمیل | |
| mobile | string | no | موبایل مدیر/هتل |
| phone | string | no | تلفن ثابت |
| leader_name | string | no | نام مسئول |
| leader_mobile | string | no | موبایل مسئول |
| confirm_status | integer | yes | وضعیت تأیید (0/1) |
| priority | integer | yes | اولویت در نمایش |
| logo | string|null | no | مسیر عکس لوگو — اگر null باشد ذخیره نمیشود |
| media | array | no | لیست تصاویر گالری — هر مورد path است |
| mapping | object | no | اتصال به سرویسهای بیرونی (tport, sepehr, snapptrip, ...) |
Core Database Insertion Logic
عملیات اصلی درج:
- insertGetId روی جدول
hotels - json_encode برای: board، possibilities، details
- پر کردن created_at و updated_at با Carbon::now()
- اگر لوگو وجود داشته باشد → درج در Media
- اگر media آرایه داشته باشد → درج تکتک در Media
- اگر mapping موجود باشد → درج در mapping_accommodations
id = DB::table('hotels')->insertGetId([...])
Media Insertion Rules
هر فایل مسیر مانند
"uploads/hotels/abc.jpg"
به شکل زیر پردازش میشود:
- استخراج extension بر اساس آخرین "."
- نوع برای لوگو:
logo - نوع برای گالری:
image
Mapping Insertion
شیء mapping میتواند شامل کلیدهای زیر باشد. هر مقدار خالی (null / "") → در DB مقدار null ذخیره میشود.
- tport
- sepehr
- snapptrip
- alibaba
- eghamat24
- iranhotelonline
در جدول mapping_accommodations فیلد accommodation = ID درج شده ذخیره میشود.
Background Jobs
در ادامه سه Job اجرا میشود:
| Job | Queue | Delay | Description |
|---|---|---|---|
| UpdateRedis | fastJob | +1 min | آپدیت کش Redis برای hotels و hotels_details |
| SystemLog | snailJob | +10 min | ثبت عملیات StoreAccommodation با user-agent و IP |
| RunCron | fastJob | +1 min | اجرای فرآیند بروزرسانی اقامتگاه |
Response (Success)
{
"status": true,
"time": 1710000000,
"message": "1391 | Accommodation added!"
}
Response (Error)
{
"status": false,
"code": "1003",
"message": "SQLSTATE... (error message)",
"trace": [ ... ]
}
Flowchart
AuthWithJWT → Validate Token
↓
CoreAccess → operator.branch == "[0]"
↓
Extract data[] From Request
↓
Insert Main Record Into hotels
↓
If logo → Insert Into Media
↓
If media[] → Insert Each Into Media
↓
If mapping → Insert Into mapping_accommodations
↓
Dispatch 3 Background Jobs
↓
Return Success JSON