#P1479
PUT /settings/index/{type}
Route Info
| Method |
Endpoint |
Controller |
Middleware |
Purpose |
| PUT |
/api/v2/settings/index/{type} |
V2BaseController@settingsUpdate |
authWithJwt |
بهروزرسانی تنظیمات شاخه موردنظر (نوع مشخصشده در پارامتر {type}) و ذخیره در دیتابیس مربوطه. |
منطق عملکرد تابع
تابع
settingsUpdate با دریافت
{type} از URL مسیر، داده جدید تنظیمات شاخه (Branch) را بر اساس نوع تنظیم ذخیره میکند. منطق داخلی تابع بر پایه نوع تنظیم به سه شاخه تقسیم میشود:
- type = "application" → بروزرسانی تنظیمات UI/Theme شعبه در جدول
offices.
- type = "accounting" → ثبت دادههای مالی و محدودیتهای اعتبار در جدول
accounting_titles.
- type = "hub" → بهروزرسانی مارکاپهای سطحی در جدول
hub_markups با استفاده از متد updateOrInsert().
در آخر، دادهها پس از تغییر در DB با کلید شعبه (
branch) برمیگردند تا فرانتاند از صحت اعمال تغییرات اطمینان حاصل کند.
| نام پارامتر |
نوع داده |
منبع |
الزامی |
توضیح |
| type |
string |
URL Path |
بله |
نوع تنظیم موردنظر (application, accounting, hub). |
| branch |
integer |
JWT Payload |
بله |
شناسه شعبه فعال برای اعمال تنظیمات. |
| markups |
array |
Request Body |
اختیاری (در hub) |
آرایه دستهبندی مارکاپها در سطوح و نوعهای مختلف پرواز و اقامت. |
| theme / style / base_color |
string |
Request Body |
اختیاری (در application) |
ویژگیهای ظاهری واسط کاربری تنظیمات شعبه. |
نمونه درخواست:
PUT /api/v2/settings/index/hub
Authorization: Bearer {JWT_TOKEN}
Content-Type: application/json
{
"markups": {
"flight": [
{
"level": 1,
"markups": {
"airplus": { "type": "percent", "value": 4, "discount": { "type": "percent", "value": 1 } },
"accommodation": { "type": "currency", "value": 50000, "discount": { "type": "currency", "value": 0 } }
}
}
]
}
}
خروجی (Response)
| فیلد |
نوع داده |
توضیح |
| status |
boolean |
نتیجه موفقیت عملیات. |
| meta.timestamp |
integer |
زمان یونیکس پاسخ API. |
| updated |
object |
مقادیر تنظیمات بروزرسانیشده برای شعبه. |
نمونه پاسخ موفق:
{
"status": true,
"updated": {
"branch": 5,
"type": "hub",
"count": 4,
"meta": {
"timestamp": 1750668952
}
}
}
نکات امنیتی
- فقط کاربران شعبه میتوانند تنظیمات همان شعبه را تغییر دهند.
- پارامتر
branch باید از JWT خوانده شود نه از بدنه درخواست.
- در مسیر PUT نباید مقادیر markups خالی ارسال شود — در غیر این صورت سطوح قبلی پاک میشوند.
- متد
updateOrInsert() برای درج یا بروزرسانی رکوردهای hub_markups استفاده میشود — تعداد کوئریها به ازای هر سطح برابر با تعداد آیتمهای markups است.
- پیشنهاد: فعالسازی کش Redis برای دادههای UI شاخه (type=application).
- بهتر است TTL کش برای دادههای hub حداقل ۱۲ ساعت باشد، چون تنظیم مارکاپها کمتغییرند.
وابستگیها
- use Illuminate\Support\Facades\DB;
- use Illuminate\Support\Facades\Redis;
- use Carbon\Carbon;
- use App\Http\Controllers\CronController;
کدهای خطا
| کد |
شرح خطا |
منبع |
| 404 |
نوع تنظیم {type} نامعتبر یا دادههای ارسالی ناقص است. |
settingsUpdate() |
| 500 |
خطا در اتصال به Redis یا در عملیات DB. |
DB Facade |
| 400 |
درخواست فاقد احراز هویت JWT معتبر. |
authWithJwt Middleware |
پیشنهادهای امنیتی
- افزودن فیلتر سطح دسترسی بر اساس Role برای اپراتورها (مثلاً فقط مدیران شعبه بتوانند PUT انجام دهند).
- ثبت عملیات تغییر تنظیمات در لاگ با سطح
AdminWrite.
- رمزنگاری مقادیر حساس در تنظیمات حسابداری.
پیشنهادهای بهبود
- تفکیک endpoint برای هر نوع تنظیم به صورت مستقل (مثلاً `/settings/hub`, `/settings/application`).
- اضافه کردن Validation سمت سرور با Laravel Validation Rules برای هر بخش تنظیم.
- افزودن خروجی diff-resolved جهت بررسی تغییرات هنگام بروزرسانی.
ممیزی و لاگها
- ثبت لاگ با نوع
UpdateSettings، شامل فیلدهای operator_id، branch_id، type و مقدار diff.
- پیشنهاد سطح لاگ: Admin برای تغییرات نوع hub، Info برای application.
جمعبندی
مسیر PUT /settings/index/{type} مسئول بروزرسانی تنظیمات شاخههاست و سه نوع تنظیمات سیستم Interface، مالی، و مرکز پرواز (hub) را شامل میشود. برای محیطهای Production باید مکانیزم cache و audit دقیقی فعال شود تا عملکرد سریع و قابلردگیری تضمین گردد.