# POST /v2/core/accommodation/store

# Core Accommodation Store

این اندپوینت یک اقامتگاه جدید (Hotel / Accommodation) را در سیستم ثبت می‌کند. داده‌ها از کلید `data` در بدنه درخواست دریافت شده و به‌صورت کامل روی جدول `hotels` درج می‌شوند. سپس عملیات‌های جانبی شامل ذخیره لوگو و گالری رسانه، ثبت Mapping در جدول `mapping_accommodations`، و اجرای سه Job (UpdateRedis، SystemLog و RunCron) در صف انجام می‌شود.

<div class="api-docs" id="bkmrk-"></div>## Request Overview

<div class="api-docs" id="bkmrk-url%3A-%2Fv2%2Fcore%2Faccomm"><div class="endpoint-info"><div>**URL:** `/v2/core/accommodation/store`</div><div>**Method:** <span class="method-post">POST</span></div><div>**Controller:** CoreController@storeAccommodation</div><div>**Middleware Stack:** authWithJwt → core</div></div></div>## Access Control

دسترسی فقط در صورتی مجاز است که:

<div class="api-docs" id="bkmrk-jwt-%D9%85%D8%B9%D8%AA%D8%A8%D8%B1-%D8%A8%D8%A7%D8%B4%D8%AF-%28midd">- **JWT معتبر باشد** (middleware: authWithJwt)
- **operator.branch == "\[0\]"** باشد (middleware: core)

</div>## Request Body Schema

تمام ورودی‌ها داخل کلید `data` ارسال می‌شوند.

<div class="api-docs" id="bkmrk-field-type-required-"><table class="schema-table"><thead><tr><th>Field</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>type</td><td>string</td><td>yes</td><td>نوع اقامتگاه (hotel, hostel, …)</td></tr><tr><td>title\_fa</td><td>string</td><td>yes</td><td>نام فارسی</td></tr><tr><td>title\_en</td><td>string</td><td>yes</td><td>نام انگلیسی</td></tr><tr><td>rate</td><td>integer</td><td>no</td><td>تعداد ستاره — اگر مقدار نداشته باشد 0 ذخیره می‌شود</td></tr><tr><td>country</td><td>integer</td><td>yes</td><td>ID کشور</td></tr><tr><td>state</td><td>integer</td><td>yes</td><td>ID استان</td></tr><tr><td>city</td><td>integer</td><td>yes</td><td>ID شهر</td></tr><tr><td>location</td><td>string</td><td>no</td><td>لوکیشن جغرافیایی (latitude,longitude)</td></tr><tr><td>address</td><td>string</td><td>yes</td><td>آدرس کامل</td></tr><tr><td>description</td><td>string</td><td>no</td><td>شرح</td></tr><tr><td>board</td><td>array</td><td>no</td><td>مثلاً: \["BB","HB","FB"\] — در صورت خالی null</td></tr><tr><td>possibilities</td><td>array</td><td>no</td><td>امکانات — در صورت خالی null</td></tr><tr><td>details</td><td>object</td><td>yes</td><td>جزئیات کامل (json\_encode ذخیره می‌شود)</td></tr><tr><td>site</td><td>string</td><td>no</td><td>وب‌سایت</td></tr><tr><td>email</td><td>string</td><td>no</td><td>ایمیل</td></tr><tr><td>mobile</td><td>string</td><td>no</td><td>موبایل مدیر/هتل</td></tr><tr><td>phone</td><td>string</td><td>no</td><td>تلفن ثابت</td></tr><tr><td>leader\_name</td><td>string</td><td>no</td><td>نام مسئول</td></tr><tr><td>leader\_mobile</td><td>string</td><td>no</td><td>موبایل مسئول</td></tr><tr><td>confirm\_status</td><td>integer</td><td>yes</td><td>وضعیت تأیید (0/1)</td></tr><tr><td>priority</td><td>integer</td><td>yes</td><td>اولویت در نمایش</td></tr><tr><td>logo</td><td>string|null</td><td>no</td><td>مسیر عکس لوگو — اگر null باشد ذخیره نمی‌شود</td></tr><tr><td>media</td><td>array</td><td>no</td><td>لیست تصاویر گالری — هر مورد path است</td></tr><tr><td>mapping</td><td>object</td><td>no</td><td>اتصال به سرویس‌های بیرونی (tport, sepehr, snapptrip, ...)</td></tr></tbody></table>

</div>## Core Database Insertion Logic

عملیات اصلی درج:

<div class="api-docs" id="bkmrk-insertgetid-%D8%B1%D9%88%DB%8C-%D8%AC%D8%AF%D9%88%D9%84">- insertGetId روی جدول `hotels`
- json\_encode برای: board، possibilities، details
- پر کردن created\_at و updated\_at با Carbon::now()
- اگر لوگو وجود داشته باشد → درج در Media
- اگر media آرایه داشته باشد → درج تک‌تک در Media
- اگر mapping موجود باشد → درج در mapping\_accommodations

</div>```
id = DB::table('hotels')->insertGetId([...])
  
```

<div class="api-docs" id="bkmrk--1"></div>## Media Insertion Rules

هر فایل مسیر مانند

```
"uploads/hotels/abc.jpg"
```

به شکل زیر پردازش می‌شود:

<div class="api-docs" id="bkmrk-%D8%A7%D8%B3%D8%AA%D8%AE%D8%B1%D8%A7%D8%AC-extension-%D8%A8%D8%B1">- استخراج extension بر اساس آخرین "."
- نوع برای لوگو: `logo`
- نوع برای گالری: `image`

</div>## Mapping Insertion

شیء `mapping` می‌تواند شامل کلیدهای زیر باشد. هر مقدار خالی (null / "") → در DB مقدار null ذخیره می‌شود.

<div class="api-docs" id="bkmrk-tport-sepehr-snapptr">- tport
- sepehr
- snapptrip
- alibaba
- eghamat24
- iranhotelonline

</div>در جدول `mapping_accommodations` فیلد accommodation = ID درج شده ذخیره می‌شود.

<div class="api-docs" id="bkmrk--2"></div>## Background Jobs

در ادامه سه Job اجرا می‌شود:

<div class="api-docs" id="bkmrk-job-queue-delay-desc"><table class="schema-table"><thead><tr><th>Job</th><th>Queue</th><th>Delay</th><th>Description</th></tr></thead><tbody><tr><td>UpdateRedis</td><td>fastJob</td><td>+1 min</td><td>آپدیت کش Redis برای hotels و hotels\_details</td></tr><tr><td>SystemLog</td><td>snailJob</td><td>+10 min</td><td>ثبت عملیات StoreAccommodation با user-agent و IP</td></tr><tr><td>RunCron</td><td>fastJob</td><td>+1 min</td><td>اجرای فرآیند بروزرسانی اقامتگاه</td></tr></tbody></table>

</div>## Response (Success)

```
{
  "status": true,
  "time": 1710000000,
  "message": "1391 | Accommodation added!"
}
  
```

<div class="api-docs" id="bkmrk--3"></div>## Response (Error)

```
{
  "status": false,
  "code": "1003",
  "message": "SQLSTATE... (error message)",
  "trace": [ ... ]
}
  
```

<div class="api-docs" id="bkmrk--4"></div>## Flowchart

<div class="api-docs" id="bkmrk-authwithjwt-%E2%86%92-valida"><div class="flowchart"><div class="flow-item">AuthWithJWT → Validate Token</div><div class="flow-arrow">↓</div><div class="flow-item">CoreAccess → operator.branch == "[0]"</div><div class="flow-arrow">↓</div><div class="flow-item">Extract data[] From Request</div><div class="flow-arrow">↓</div><div class="flow-item">Insert Main Record Into hotels</div><div class="flow-arrow">↓</div><div class="flow-item">If logo → Insert Into Media</div><div class="flow-arrow">↓</div><div class="flow-item">If media[] → Insert Each Into Media</div><div class="flow-arrow">↓</div><div class="flow-item">If mapping → Insert Into mapping_accommodations</div><div class="flow-arrow">↓</div><div class="flow-item">Dispatch 3 Background Jobs</div><div class="flow-arrow">↓</div><div class="flow-item">Return Success JSON</div></div></div>