Skip to main content
#P1558

GET /api/v2/tasks/list

Route Info

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

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

این اندپوینت متد استاتیک getTasks را فراخوانی می‌کند. منطق پردازش داده‌ها به شرح زیر است:

  1. آماده‌سازی کوئری:
    • جدول tasks_items با tasks_categories جوین (Left Join) می‌شود تا نام دسته‌بندی و مالک آن استخراج شود.
    • فیلتر دسته‌بندی: اگر پارامتر category ارسال شده باشد، شرط where('tasks_items.category', ...) اعمال می‌شود.
    • فیلتر مالکیت (باگ منطقی): کد تلاش می‌کند بر اساس پارامتر goal (که مقدار 'own' ارسال شده) فیلتر کند. اما شرط اعمال فیلتر، وجود متغیر operator$ است. از آنجا که در فراخوانی این متد، شناسه اپراتور پاس داده نشده است، هیچ فیلتری روی مالکیت اعمال نمی‌شود و تمام تسک‌ها واکشی می‌شوند.
    • فیلتر وضعیت: به صورت پیش‌فرض تسک‌های با وضعیت 1 (فعال) و 3 (احتمالا در حال انجام) برگردانده می‌شوند.
  2. مرتب‌سازی: نتایج بر اساس order و سپس id مرتب می‌شوند.
  3. پردازش نتایج (Loop): روی نتایج حلقه زده می‌شود و برای هر آیتم:
    • اطلاعات کاربر سازنده از طریق StaticController::getOperators واکشی می‌شود.
    • اطلاعات اتصال (Connection) از طریق OfficialController::getConnection واکشی می‌شود.
    • لیست اپراتورهای تخصیص داده شده مجدداً از طریق StaticController::getOperators واکشی می‌شود.

پارامترهای ورودی (Query Params)

  • category (اختیاری): شناسه دسته‌بندی جهت فیلتر کردن تسک‌ها.

خروجی‌ها

موفق (200 OK):

{
  "status": true,
  "time": 1732047000,
  "data": [
    {
      "id": 105,
      "user": { ... }, // آبجکت اطلاعات کاربر سازنده
      "category": {
        "id": 12,
        "title": "General Tasks"
      },
      "title": "Fix Bugs",
      "connection": false, // یا آبجکت کانکشن
      "priority": 1,
      "order": 0,
      "description": "Details here...",
      "deadline": "2025-01-01",
      "operators": [ ... ], // آرایه اطلاعات اپراتورهای درگیر
      "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 استفاده شود.