Skip to main content
#P1557

GET /api/v2/tasks/categories/list

Route Info

Method Endpoint Controller Middleware
GET /api/v2/tasks/categories/list OfficialController@listTasksCategories authWithJwt

منطق دقیق عملکرد (Code Logic)

این متد لیست دسته‌بندی‌های تسک را در دو بخش مجزا («دسته‌های من» و «دسته‌های دیگران») بازمی‌گرداند. منطق فیلتر کردن به شرح زیر است:

  1. بخش اول (My Categories):
    • جستجو در جدول tasks_categories.
    • شرط: branch برابر با شعبه جاری و user برابر با id اپراتور لاگین شده (مالکیت مستقیم).
    • در حلقه: تعداد تسک‌های فعال هر دسته شمرده می‌شود. اگر پارامتر tasks ارسال شده باشد، متد داخلی getTasks اجرا می‌شود.
  2. بخش دوم (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() فراخوانی می‌شود که کد آن در کنترلر موجود نیست. هرگونه باگ یا کندی در آن متد مستقیماً روی این اندپوینت تاثیر می‌گذارد.