# GET /v2/academy/course/steps/view

# Academy: View Course Steps

این اندپوینت اطلاعات کامل یک دوره آموزشی به‌همراه تمام مراحل (steps) آن را برمی‌گرداند. همچنین وضعیت پیشرفت کاربر (current\_step و completed) را به‌روزرسانی و بازگردانی می‌کند. منطق این API بر اساس آخرین مرحله (آخرین رکورد step) داده دریافت شده بنا شده است و اطلاعات دوره نیز عمداً از همان آخرین step استخراج می‌شود (طبق رفتار فعلی سیستم).

<div class="api-docs" id="bkmrk-url%3A-%2Fv2%2Facademy%2Fcou"><div class="endpoint-info"><div>**URL:** `/v2/academy/course/steps/view`</div><div>**Method:** <span class="method-get">GET</span></div><div>**Controller:** AcademyController@viewStepsCourse</div><div>**Middleware:** authWithJwt</div><div>**Auth:** JWT Required</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>course\_id</td><td>integer</td><td>yes</td><td>شناسه دوره‌ای که می‌خواهید مراحل آن را مشاهده کنید</td></tr><tr><td>step\_id</td><td>integer</td><td>no</td><td>اگر ارسال شود فقط یک مرحله خاص فیلتر می‌شود</td></tr><tr><td>current\_step</td><td>integer</td><td>no</td><td>مرحله جدیدی که کاربر به آن رسیده؛ اگر برابر total\_steps باشد → مقدار completed یک افزایش می‌یابد</td></tr></tbody></table>

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

```
// 1. Fetch all steps of this course (optional filtering by step_id)
// 2. LEFT JOIN course + category info inside each step row
// 3. Load or create progress record in academy_course_completed
// 4. Update progress (completed / current_step)
// 5. Build steps[]
// 6. Build final course object based on the LAST step (intentional behavior)

$resultCourseSteps = DB::table('academy_course_steps')
    ->select([... course + step + category fields ...])
    ->where('academy_course_steps.course', $request->get('course_id'))
    ->where(function ($q) {
        if ($request->has('step_id')) $q->where('academy_course_steps.id', $request->get('step_id'));
    })
    ->leftJoin("academy_courses", ...)
    ->leftJoin("academy_categories", ...)
    ->orderBy('order')->orderBy('id')
    ->get();

$resultStep = DB::table('academy_course_completed')
    ->where('course', $request->get('course_id'))
    ->where('student', $request->get('operator')->id)
    ->first();

$courseCount = total number of steps in academy_course_steps;

// Progress Update Logic
if (!$resultStep) create new record with defaults;
else update based on current_step rules;

// Build steps[]
foreach (... each step ...) { ... }

// IMPORTANT: course info is taken from LAST step (as user confirmed)
$return = [
   "id" => $step->course_id,
   ...
   "steps" => $steps
];

return [...];
  
```

<div class="api-docs" id="bkmrk-"></div>## Step 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>title.fa</td><td>string</td><td>عنوان فارسی مرحله</td></tr><tr><td>title.en</td><td>string</td><td>عنوان انگلیسی مرحله</td></tr><tr><td>subtitle.fa</td><td>string</td><td>زیرعنوان فارسی</td></tr><tr><td>subtitle.en</td><td>string</td><td>زیرعنوان انگلیسی</td></tr><tr><td>content</td><td>string</td><td>محتوای مرحله (HTML / Markdown)</td></tr><tr><td>order</td><td>integer</td><td>ترتیب نمایش مرحله</td></tr><tr><td>status</td><td>integer</td><td>وضعیت فعال/غیرفعال</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>## Course Object Structure (Extracted From Last Step)

<div class="api-docs" id="bkmrk-field-type-descripti-1"><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>شناسه دوره (از آخرین step)</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>قیمت دوره</td></tr><tr><td>necessary</td><td>array | false</td><td>پیش‌نیازها</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</td><td>1 اگر دوره ویژه است</td></tr><tr><td>created\_at</td><td>datetime</td><td>تاریخ ساخت</td></tr><tr><td>updated\_at</td><td>datetime</td><td>آخرین تغییر</td></tr><tr><td>steps</td><td>array</td><td>آرایه‌ی تمام مراحل</td></tr></tbody></table>

</div></div>## Important Note

اطلاعات دوره از \*\*آخرین step\*\* استخراج می‌شود. این رفتار در کد وجود دارد و توسط کاربر (علیرضا) تأیید شده‌است. اگر steps خالی باشد، `$step` undefined شده و سیستم خطا خواهد داد.

<div class="api-docs" id="bkmrk--1"></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": {
      "id": 3,
      "flag": "frontend",
      "title": { "fa": "فرانت‌اند", "en": "Frontend" }
    },
    "progress": { "current_step": 2, "completed": 1 },
    "total_steps": 12,
    "duration": 180,
    "featured": 1,
    "created_at": "2024-04-02 11:30:00",
    "updated_at": "2024-04-20 19:12:00",
    "status": 1,
    "steps": [
      {
        "id": 10,
        "title": { "fa": "آشنایی", "en": "Introduction" },
        "subtitle": { "fa": "مقدمه", "en": "Intro" },
        "content": "...",
        "order": 1,
        "status": 1,
        "created_at": "2024-04-02 11:30:00",
        "updated_at": "2024-04-02 11:30:00"
      },
      ...
    ]
  }
}
  
```

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

<div class="api-docs" id="bkmrk-validate-jwt-%28operat"><div class="flowchart"><div class="flow-item">Validate JWT (operator)</div><div class="flow-arrow">↓</div><div class="flow-item">Fetch steps (JOIN course + category)</div><div class="flow-arrow">↓</div><div class="flow-item">Load or create progress record</div><div class="flow-arrow">↓</div><div class="flow-item">Update current_step / completed</div><div class="flow-arrow">↓</div><div class="flow-item">Build steps[]</div><div class="flow-arrow">↓</div><div class="flow-item">Extract course info from LAST step</div><div class="flow-arrow">↓</div><div class="flow-item">Return final structured course object</div></div></div>