#P1556
POST /api/v2/tasks/category/operation
Route Info
| Method | Endpoint | Controller | Middleware |
| POST | /api/v2/tasks/category/operation | OfficialController@operationTasksCategory | authWithJwt |
منطق دقیق عملکرد (Code Logic)
این متد بر اساس پارامتر ورودی action رفتار متفاوتی دارد. تمام عملیات مستقیماًCRUD را به صورت تجمیعی و با استفاده از Query Builder (بدوننه مدلEloquent Eloquent)Model) انجاممدیریت میکند. مراحل اجرا به ترتیب:
- استخراج دادهها: متغیر
data$از ورودیrequest->data$پر میشود (نکته: اگر این پارامتر ارسال نشود، در خطوط بعدی ارور PHP دریافت خواهید کرد). - بررسی Action: بر اساس مقدار فیلد
actionیکی از سه بلوک زیر اجرا میشود:Action =store:درجیک رکوردجدیددر جدولtasks_categories.درج میشود.فیلدهایفیلدbranch(ازریکوئست) وریکوئست،user(ازآبجکتشناسه اپراتور لاگین شده، وoperatortitle/color/iconتزریقازشده)آرایهبهdataصورت خودکار ستخوانده میشوند.- شناسه رکورد درج شده (Insert ID) گرفته میشود اما در خروجی برگردانده نمیشود.
Action =update:آپدیترکورددرجدولtasks_categoriesبر اساسکهidورودی.آن برابر باrequest->id$است آپدیت میشود.فقطهیچفیلدهایشرطtitle,دیگریcolor,(مثلبررسیiconبروزرسانیشعبه)میشوند.در کوئری وجود ندارد.
Action =delete:حذفابتدا رکورد اصلی از جدولtasks_categoriesبرحذفاساسمیشود.- سپس تمام
id. حذف آبشاری دستی (Manual Cascade):بلافاصله پس از حذف دسته، تمام رکوردهایهای جدولtasks_itemsکهمتعلقمربوط به این دسته هستند (where('category', $request->id)) استخراج میشوند.- سپس تمام رکوردهای
tasks_itemsمربوطه حذف میشوند. سپسدر نهایت تمام رکوردهای جدولtasks_notesکهمتعلقمربوط بهآنتسکهایتسکهااستخراجبودندشده هستند حذف میشوند.شوند (حذف دستی ارتباطات).
- پاسخ:
ورودیورودی بهدر صورتJSON. پارامترموفقیت آرایهای شاملdataجزئیاتوضعیتاست.و زمان سرور برمیگرداند.
پارامترهای
ساختار ورودی مورد انتظار
سیستم انتظار دارد ورودیها دقیقاً به این شکل ارسال شوند (در غیر این صورت وارد بلوک catch میشود):
POST /api/v2/tasks/category/operation
Authorization: Bearer <JWT>
{
"action": "store", // مقادیرالزامی: مجاز:store store,| update,update | delete
"id": 15,10, // فقطالزامی برای update و delete
"branch": 1001, // الزامی است(معمولا توسط کلاینت یا میدلور ست میشود)
"data": { // الزامی (حتی برای delete نیازی بهباید ارسال محتوایشود اینوگرنه آبجکتکد نیستکرش اما کلید data باید باشدمیکند)
"title": "عنوانجلسات", دسته",// الزامی برای store و update
"color": "#FF0000"#ffffff", // الزامی برای store و update
"icon": "fa-home"user" // الزامی برای store و update
}
}
خروجیهاخروجی واقعی
موفق:موفقیت آمیز:
{
"status": true,
"time": 17320365001732037000
}
در صورت بروز خطا (Exception):
شامل متن دقیق خطای PHP و Stack Trace کامل برای دیباگ.
{
"status": false,
"time": 1732036505,1732037005,
"message": "UndefinedTrying to access array keyoffset \"title\""on value of type null", // مثال خطااگر data ارسال نشود
"trace": [...]
}
تحلیلعملیات ریسکدیتابیس (Direct DB Manipulation)
این متد مستقیماً با جداول زیر درگیر است:
tasks_categories(Insert, Update, Delete)tasks_items(Select, Delete)tasks_notes(Delete)
نکات فنی و امنیتخطاهای (مهم)محتمل
آسیبپذیریوابستگیIDORبه(بسیارآرایهمهم):data: در خط اول متد$data = $request->dataاجرا میشود. اگر کلاینت پارامترdataرا نفرستد، کد متوقف نمیشود اما در خطوط بعدی (مثلا$data['title']) خطا میدهد.- حذف بدون Transaction: عملیات
حذفupdateودرdelete،۳هیچ بررسی روی اینکه آیاidارسالی متعلق بهbranchجاری استمرحله انجامنمیمیشود.کاربراگرمیتوانددردستهبندیهای سایر شعبهها رامرحله حذفیاtasks_itemsویرایشخطاییکند.رخ دهد، دستهبندی حذف شده اما نوتها باقی میمانند (Partial Delete Risk). - عدم
وجودبررسیTransaction:مالکیت (Ownership): کوئریهای Update و Delete فقطidرا چک میکنند. این یعنی کد اجازه میدهد دستهبندی متعلق به یک شعبه دیگر، توسط کاربری درعملیاتشعبهdelete،متفاوتحذفویرایشاز سه جدول جداگانه انجام میشوداما(صرفاًداخلباداشتنDB::transactionنیست. اگر در میانه کار خطا رخ دهد، دادههای ناقص (Inconsistent Data) در دیتابیس باقی میمانند. Validation:هیچ اعتبارسنجی روی وجود کلیدهای داخل آرایهdataانجام نمیشود. ارسال جیسون ناقص منجر به Crash کد میشود.ID).