# GET /v2/academy/courses/view

# Academy: View Courses

این اندپوینت لیست دوره‌های آموزشی آکادمی را با امکان فیلتر بر اساس دسته‌بندی بازمی‌گرداند. داده‌ها شامل اطلاعات کامل دوره، اطلاعات دسته‌بندی مرتبط، وضعیت کاربر در دوره (progress)، تعداد کل مراحل و وضعیت نمایش (featured) است. تنها دوره‌هایی که وضعیت آن‌ها 1 یا 3 باشد در خروجی قرار می‌گیرند.

<div class="api-docs" id="bkmrk-url%3A-%2Fv2%2Facademy%2Fcou"><div class="endpoint-info"><div>**URL:** `/v2/academy/courses/view`</div><div>**Method:** <span class="method-get">GET</span></div><div>**Controller:** AcademyController@viewCourses</div><div>**Middleware:** authWithJwt</div><div>**Auth:** JWT Required</div><div>**Filter:** `?category_id=` (optional)</div></div></div>## Query Parameters

<div class="api-docs" id="bkmrk-parameter-type-requi"><div class="table-wrapper"><table><thead><tr><th>Parameter</th><th>Type</th><th>Required</th><th>Description</th></tr></thead><tbody><tr><td>category\_id</td><td>integer</td><td>no</td><td>اگر ارسال شود فقط دوره‌های مربوط به آن دسته‌بندی نمایش داده می‌شوند</td></tr></tbody></table>

</div></div>## Controller Logic

```
// Filter: category_id (optional)
// Only show courses with status IN (1,3)
// Join with academy_categories for category details
// For each course: find progress, total steps, progress completed

$resultCourses = DB::table('academy_courses')
    ->select([...])
    ->where(function ($q) use ($request) {
        if ($request->has('category_id') && $request->get('category_id')) {
            $q->where('academy_courses.category', $request->get('category_id'));
        }
    })
    ->whereIn("academy_courses.status", [1, 3])
    ->leftJoin("academy_categories", "academy_categories.id", "academy_courses.category")
    ->get();

foreach ($resultCourses as $course) {

    $resultCompleted = DB::table('academy_course_completed')
        ->select('completed', 'current_step')
        ->where('course', $course->id)
        ->where('student', $request->get('operator')->id)
        ->first();

    if (!$resultCompleted) {
        $stepCompleted = 0;
        $currentStep = 1;
    } else {
        $stepCompleted = $resultCompleted->completed;
        $currentStep = $resultCompleted->current_step;
    }

    $courseCount = DB::table('academy_course_steps')
        ->where('course', $course->id)
        ->count();

    $courses[] = [
        "id" => $course->id,
        "slug" => $course->slug,
        "branch" => !is_null($course->branch) ? $course->branch : false,
        "price" => !is_null($course->price) ? $course->price : 'free',
        "necessary" => !is_null($course->necessary) ? json_decode($course->necessary) : false,
        "title" => [...],
        "category" => [...],
        "progress" => [
            "current_step" => (int)$currentStep,
            "completed" => (int)$stepCompleted
        ],
        "duration" => $course->duration,
        "total_steps" => $courseCount,
        "featured" => $course->featured,
        "description" => $course->description,
        "status" => $course->status,
        "created_at" => $course->created_at,
        "updated_at" => $course->updated_at
    ];
}

return [
    "status" => true,
    "time" => time(),
    "data" => $courses
];
  
```

<div class="api-docs" id="bkmrk-"></div>## Course Object Structure

<div class="api-docs" id="bkmrk-field-type-descripti"><div class="table-wrapper"><table><thead><tr><th>Field</th><th>Type</th><th>Description</th></tr></thead><tbody><tr><td>id</td><td>integer</td><td>شناسه دوره</td></tr><tr><td>slug</td><td>string</td><td>اسلاگ یکتا</td></tr><tr><td>branch</td><td>integer | false</td><td>شناسه شعبه یا false اگر مقدار نداشته باشد</td></tr><tr><td>price</td><td>integer | "free"</td><td>قیمت دوره یا "free" اگر مقدار نداشته باشد</td></tr><tr><td>necessary</td><td>array | false</td><td>پیش‌نیازهای دوره (json\_decode) یا false</td></tr><tr><td>title.fa</td><td>string</td><td>عنوان فارسی دوره</td></tr><tr><td>title.en</td><td>string</td><td>عنوان انگلیسی دوره</td></tr><tr><td>category.\*</td><td>object</td><td>اطلاعات کامل دسته‌بندی مرتبط</td></tr><tr><td>progress.current\_step</td><td>integer</td><td>مرحله فعلی کاربر در دوره</td></tr><tr><td>progress.completed</td><td>integer</td><td>تعداد مراحل تکمیل‌شده توسط کاربر</td></tr><tr><td>duration</td><td>integer</td><td>مدت زمان دوره (به واحد دقیقه)</td></tr><tr><td>total\_steps</td><td>integer</td><td>تعداد کل مراحل دوره</td></tr><tr><td>featured</td><td>integer (0/1)</td><td>وضعیت برجسته بودن دوره</td></tr><tr><td>description</td><td>string</td><td>توضیحات دوره</td></tr><tr><td>status</td><td>integer</td><td>1 یا 3 (فعال / نمایشی)</td></tr><tr><td>created\_at</td><td>datetime</td><td>تاریخ ایجاد</td></tr><tr><td>updated\_at</td><td>datetime</td><td>تاریخ به‌روزرسانی</td></tr></tbody></table>

</div></div>## Example Response

```
Status: 200 OK

{
  "status": true,
  "time": 1730000000,
  "data": [
    {
      "id": 21,
      "slug": "advanced-react",
      "branch": false,
      "price": "free",
      "necessary": false,
      "title": {
        "fa": "ری‌اکت پیشرفته",
        "en": "Advanced React"
      },
      "category": { ... },
      "progress": { "current_step": 1, "completed": 0 },
      "duration": 180,
      "total_steps": 12,
      "featured": 1,
      "description": "دوره کامل React برای توسعه‌دهندگان پیشرفته",
      "status": 1,
      "created_at": "2024-04-02 11:30:00",
      "updated_at": "2024-04-20 19:12:00"
    }
  ]
}
  
```

<div class="api-docs" id="bkmrk--1"></div>## Flowchart

<div class="api-docs" id="bkmrk-validate-jwt-%28operat"><div class="flowchart"><div class="flow-item">Validate JWT (operator loaded)</div><div class="flow-arrow">↓</div><div class="flow-item">Check optional category_id</div><div class="flow-arrow">↓</div><div class="flow-item">Query academy_courses WHERE status IN (1,3)</div><div class="flow-arrow">↓</div><div class="flow-item">LEFT JOIN academy_categories</div><div class="flow-arrow">↓</div><div class="flow-item">Loop → Fetch course progress (completed/current_step)</div><div class="flow-arrow">↓</div><div class="flow-item">Count total_steps from academy_course_steps</div><div class="flow-arrow">↓</div><div class="flow-item">Build final structured course object</div><div class="flow-arrow">↓</div><div class="flow-item">Return status=true + time + data[]</div></div></div>