#P1557
GET /api/v2/tasks/categories/list
Route Info
| Method | Endpoint | Controller | Middleware |
| GET | /api/v2/tasks/categories/list | OfficialController@listTasksCategories | authWithJwt |
منطق دقیق عملکرد (Code Logic)
این متد لیست دستهبندیهای تسک را در دو بخش مجزا («دستههای من» و «دستههای دیگران») بازمیگرداند. منطق فیلتر کردن به شرح زیر است:
- بخش اول (My Categories):
- جستجو در جدول
tasks_categories. - شرط:
branchبرابر با شعبه جاری وuserبرابر باidاپراتور لاگین شده (مالکیت مستقیم). - در حلقه: تعداد تسکهای فعال هر دسته شمرده میشود. اگر پارامتر
tasksارسال شده باشد، متد داخلیgetTasksاجرا میشود.
- جستجو در جدول
- بخش دوم (Other Categories):
- جستجو در جدول
tasks_categoriesکه باtasks_itemsجوین (Join) شده است. - فیلتر JSON: از دستور
whereRawاستفاده میکند تا چک کند آیاidاپراتور جاری در ستون JSON به نامoperatorsدر جدول آیتمها وجود دارد یا خیر (یعنی کاربر در تسکهای آن دسته مشارکت دارد). - از
distinct()استفاده میشود تا از تکرار دستهبندیها جلوگیری شود. - در حلقه: مجدداً تعداد تسکهایی که کاربر در آنها نقش دارد شمرده میشود.
- جستجو در جدول
پارامترهای ورودی (Query Params)
- branch (الزامی - معمولا در هدر یا بادی): شناسه شعبه جهت فیلتر کردن دادهها.
- tasks (اختیاری - Boolean): اگر مقدار
trueیا1ارسال شود، علاوه بر اطلاعات دسته، لیست ریز تسکهای آن دسته نیز (توسط متدgetTasks) واکشی و در آرایه خروجی قرار میگیرد. در غیر این صورت مقدارfalseبرمیگردد.
خروجیها
موفق (200 OK):
{
"status": true,
"time": 1732045000,
"data": {
"my": [ // دستهبندیهایی که کاربر سازنده آنهاست
{
"id": 10,
"user": {...}, // آبجکت اطلاعات سازنده (از StaticController)
"title": "Project A",
"color": "#FF0000",
"icon": "fa-check",
"status": 1,
"created": "2023-01-01 12:00:00",
"counter": 5, // تعداد تسکهای فعال داخل این دسته
"tasks": false // یا آرایهای از تسکها اگر درخواست شده باشد
}
],
"other": [ // دستهبندیهایی که کاربر در آنها مشارکت دارد (توسط JSON Check)
{
"id": 12,
"title": "Team Work B",
...
}
]
}
}
تحلیل ریسک و پرفورمنس (Critical)
- مشکل عملکردی (N+1 Query Problem): در هر دو حلقه
foreach، به ازای هر دستهبندی پیدا شده، حداقل یک کوئریcountو یک کوئریStaticController::getOperatorsاجرا میشود. با افزایش تعداد دستهها، تعداد کوئریها به شدت زیاد شده و سرعت پاسخدهی افت میکند. - تزریق متغیر در Raw SQL: در خطی که
whereRaw("JSON_CONTAINS(..., '\"$operatorId\"')")استفاده شده، متغیرoperatorId$مستقیماً داخل رشته SQL قرار گرفته است. اگرچه این متغیر از میدلور (Token) میآید و قابل اعتماد است، اما استاندارد این است که از Binding (علامت سوال?) استفاده شود تا از هرگونه خطر احتمالی و سربار روی دیتابیس جلوگیری شود. - وابستگی داخلی نامشخص: متد
$this->getTasks()فراخوانی میشود که کد آن در کنترلر موجود نیست. هرگونه باگ یا کندی در آن متد مستقیماً روی این اندپوینت تاثیر میگذارد.