#P1558
GET /api/v2/tasks/list
Route Info
| Method | Endpoint | Controller | Middleware |
| GET | /api/v2/tasks/list | OfficialController@listTasks | authWithJwt |
معماری و منطق دقیق عملکردپردازش (CodeProcessing Logic)Logic & Architecture)
این اندپوینت متدبه استاتیکعنوان نقطه ورود (Entry Point) برای واکشی لیست وظایف عمل کرده و فرآیند استخراج دادهها را getTasksفراخوانیطی میکند.یک منطقمکانیزم پردازشچندمرحلهای دادهها(Multi-Stage Retrieval) به شرح زیر است:مدیریت میکند:
- مقداردهی و آمادهسازی
کوئری:کوئری (Query Initialization):- به متد داخلی
getTasksارجاع داده میشود. در این مرحله، یک نمونه از Query Builder روی جدولtasks_itemsایجاد شده و جهت استخراج متادیتای دستهبندیها، عملیاتLEFT JOINبا جدولtasks_categoriesجوین (Left Join)صورت میشودپذیرد.تا نام دستهبندی و مالک آن استخراج شود. فیلترفیلترینگدستهبندی:و اعمال شرایط (Conditional Filtering):اگرسیستم بر اساس پارامترهای ورودی، دامنه جستجو را محدود میکند. در صورتی که پارامتر
categoryارسالدرشدهبدنه درخواست موجود باشد، شرط انطباق (Exact Match) روی ستوناعمال میwhere('tasks_items.category', ...)categoryشود.گردد. فیلترهمچنینمالکیتفیلترهای پایه برای وضعیتهای فعال (باگActiveمنطقی):Status)کد تلاش میکند بر اساس پارامترgoal(که مقدار 'own' ارسال شده) فیلتر کند. اما شرط اعمال فیلتر، وجود متغیرoperator$است. از آنجا که در فراخوانی این متد، شناسه اپراتور پاس داده نشده است،هیچ فیلتری روی مالکیت اعمال نمیشودو تمام تسکها واکشی میشوند.فیلتر وضعیت:بهبهصورت پیشفرضتسکهایرویباکوئریوضعیت1(فعال) و3(احتمالا در حال انجام) برگرداندهلحاظ میشوند.
درخواست
- به متد داخلی
- مرتب
سازی:سازی دادهها (Sorting Strategy):نتایج خروجی بر اساس اولویت نمایشی (
order) و سپس ترتیب زمانی ایجاد (id)مرتبمرتبسازی میشوند.شوند تا ساختار سلسلهمراتبی بصری حفظ گردد. - غنیسازی دادهها و نگاشت روابط (Data Hydration & Relation Mapping):
پس از اجرای کوئری اولیه، سیستم وارد فاز پردازش ثانویه (Post-Processing) میشود. در این مرحله، روی مجموعه نتایج (
Loop):ResultرویSet)نتایجپیمایشحلقهصورتزده میشودگرفته و برای هرآیتم:موجودیت (Entity)، دادههای وابسته زیر به صورت بلادرنگ (Real-time) بارگذاری و به آبجکت اصلی ملحق (Hydrate) میشوند:اطلاعاتUser Resolution: واکشی مشخصات کامل کاربر سازنده از طریق متدStaticController::getOperatorsواکشی میشود..- Connection Context: بررسی و استخراج اطلاعات اتصال (Connection) مرتبط با تسک از طریق متد
OfficialController::getConnectionواکشی میشود.. - Assignee Aggregation: بازیابی لیست کامل اپراتورهای
تخصیصتخصیصیافتهدادهبهشدهتسکمجدداًوازجزئیاتطریقپروفایلآنهاStaticController::getOperatorsواکشیجهتمیشود.نمایش در رابط کاربری.
پارامترهای ورودی (Query Params)Parameters)
categoryنام پارامتر نوع داده ( اختیاری):Type)وضعیت (Requirement) توضیحات فنی category Integer Optional شناسه یکتای دستهبندی (Foreign Key) جهت فیلتر کردن اسکوپ نمایش تسکها.
خروجیهاساختار پاسخ (Response Structure)
موفقخروجی نهایی به صورت یک آبجکت JSON استاندارد شامل وضعیت درخواست، برچسب زمانی سرور و آرایهای از آبجکتهای غنیشده (200Enriched OK):Objects) بازگردانده میشود:
{
"status": true,
"time": 1732047000,
"data": [
{
"id": 105,
"user": { ...// Object: Creator Profile
"id": 50,
"name": "System Admin",
"role": "Manager"
}, // آبجکت اطلاعات کاربر سازنده
"category": { // Object: Category Metadata
"id": 12,
"title": "General Tasks"Development"
},
"title": "FixRefactor Bugs"API Logic",
"connection": false, // یاBoolean/Object: آبجکتConnection کانکشنContext
"priority": 1,
"order": 0,
"description": "DetailsAnalyze here.and document the trade controller...",
"deadline": "2025-01-01",
"operators": [ ...// Array: Assigned Operators
{ "id": 51, "name": "Developer 1" },
{ "id": 52, "name": "Developer 2" }
], // آرایه اطلاعات اپراتورهای درگیر
"status": 1,
"created": "2024-12-01 10:00:00"
}
]
}
تحلیل ریسک و امنیت (Critical)
نشت اطلاعات (Critical Security Bug):در متدlistTasks، تابعgetTasksبه صورتgetTasks('own', $cat)فراخوانی میشود. آرگومان سوم (`operator$`) ارسال نمیشود و مقدار پیشفرضfalseمیگیرد. در کدgetTasks، بلوک فیلتر کردن (`if ($operator)`) اجرا نمیشود. نتیجه این است که پارامتر'own'بی اثر شده و کاربر میتواندتمام تسکهای سیستم(حتی تسکهای دیگران) را ببیند.مشکل N+1 Query:در حلقهforeachخروجی، سه تابعgetOperators(دوبار) وgetConnectionبرایهر رکورداجرا میشوند. اگر ۵۰ تسک وجود داشته باشد، حدود ۱۵۱ کوئری به دیتابیس زده میشود که پرفورمنس را نابود میکند.SQL Injection احتمالی:استفاده ازwhereRawبا قرار دادن مستقیم متغیر `$operator` در رشته کوئری (`JSON_CONTAINS(..., '\"$operator\"')`) ناامن است و باید از Binding استفاده شود.