Skip to main content
#P1558

GET /api/v2/tasks/list

Route Info

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

معماری و منطق دقیق عملکردپردازش (CodeProcessing Logic)Logic & Architecture)

این اندپوینت متدبه استاتیکعنوان getTasksنقطه ورود (Entry Point) برای واکشی لیست وظایف عمل کرده و فرآیند استخراج داده‌ها را فراخوانیطی می‌کند.یک منطقمکانیزم پردازشچندمرحله‌ای داده‌ها(Multi-Stage Retrieval) به شرح زیر است:مدیریت می‌کند:

  1. مقداردهی و آماده‌سازی کوئری:کوئری (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 (احتمالا در حال انجام) برگرداندهلحاظ می‌شوند.

  2. مرتب‌سازی:سازی داده‌ها (Sorting Strategy):

    نتایج خروجی بر اساس اولویت نمایشی (order) و سپس ترتیب زمانی ایجاد (id) مرتبمرتب‌سازی می‌شوند.شوند تا ساختار سلسله‌مراتبی بصری حفظ گردد.

  3. غنی‌سازی داده‌ها و نگاشت روابط (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)توضیحات فنی
    categoryIntegerOptionalشناسه یکتای دسته‌بندی (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 استفاده شود.