{"id":29064485,"url":"https://github.com/astrocoding/magang-smk-microservices","last_synced_at":"2025-06-27T09:07:33.780Z","repository":{"id":300044047,"uuid":"1005017255","full_name":"astrocoding/magang-smk-microservices","owner":"astrocoding","description":null,"archived":false,"fork":false,"pushed_at":"2025-06-19T15:48:37.000Z","size":30,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-06-19T16:19:11.300Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/astrocoding.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-06-19T14:31:56.000Z","updated_at":"2025-06-19T15:48:41.000Z","dependencies_parsed_at":"2025-06-19T16:19:12.719Z","dependency_job_id":"91a6eb0e-0761-44e1-8e10-faa8031b4f66","html_url":"https://github.com/astrocoding/magang-smk-microservices","commit_stats":null,"previous_names":["astrocoding/magang-smk-microservices"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/astrocoding/magang-smk-microservices","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astrocoding%2Fmagang-smk-microservices","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astrocoding%2Fmagang-smk-microservices/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astrocoding%2Fmagang-smk-microservices/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astrocoding%2Fmagang-smk-microservices/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/astrocoding","download_url":"https://codeload.github.com/astrocoding/magang-smk-microservices/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/astrocoding%2Fmagang-smk-microservices/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":262227893,"owners_count":23278266,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-06-27T09:07:01.884Z","updated_at":"2025-06-27T09:07:33.758Z","avatar_url":"https://github.com/astrocoding.png","language":"JavaScript","readme":"# API Test Scenarios (Postman/Manual)\n\n---\n\n## 1. AUTHENTICATION\n\n### 1.1 Register Admin\n**POST** `/auth/register/admin`\n- Deskripsi: Register akun admin baru\n- Request JSON:\n```json\n{\n  \"email\": \"admin1@example.com\",\n  \"password\": \"password123\",\n  \"role\": \"admin\",\n  \"full_name\": \"Admin Satu\",\n  \"phone_number\": \"081234567890\",\n  \"photo\": \"https://example.com/photo.jpg\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Admin berhasil didaftarkan\",\n  \"data\": {\n    \"accessToken\": \"...\",\n    \"refreshToken\": \"...\",\n    \"user\": {\n      \"id\": \"user-...\"\n    }\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Email sudah terdaftar\"\n}\n```\n- Catatan: Tidak butuh token\n\n### 1.2 Register Student\n**POST** `/auth/register/student`\n- Deskripsi: Register akun student baru\n- Request JSON:\n```json\n{\n  \"email\": \"student1@example.com\",\n  \"password\": \"password123\",\n  \"role\": \"student\",\n  \"nis\": \"2024001\",\n  \"full_name\": \"Student Satu\",\n  \"gender\": \"male\",\n  \"birth_date\": \"2005-01-15\",\n  \"phone_number\": \"081234567891\",\n  \"address\": \"Jl. Contoh No. 123\",\n  \"class\": \"XII IPA 1\",\n  \"major\": \"IPA\",\n  \"school_name\": \"SMK Negeri 1\",\n  \"photo\": \"https://example.com/photo.jpg\",\n  \"bio\": \"Siswa yang rajin dan tekun\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Student berhasil didaftarkan\",\n  \"data\": {\n    \"accessToken\": \"...\",\n    \"refreshToken\": \"...\",\n    \"user\": {\n      \"id\": \"user-...\"\n    }\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"NIS sudah terdaftar\"\n}\n```\n- Catatan: Tidak butuh token\n\n### 1.3 Register Mentor\n**POST** `/auth/register/mentor`\n- Deskripsi: Register akun mentor baru\n- Request JSON:\n```json\n{\n  \"email\": \"mentor1@example.com\",\n  \"password\": \"password123\",\n  \"role\": \"mentor\",\n  \"full_name\": \"Mentor Satu\",\n  \"position\": \"Senior Developer\",\n  \"gender\": \"female\",\n  \"phone_number\": \"081234567892\",\n  \"department\": \"IT Development\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Mentor berhasil didaftarkan\",\n  \"data\": {\n    \"accessToken\": \"...\",\n    \"refreshToken\": \"...\",\n    \"user\": {\n      \"id\": \"user-...\"\n    }\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Email sudah terdaftar\"\n}\n```\n- Catatan: Tidak butuh token\n\n### 1.4 Login\n**POST** `/auth/login`\n- Deskripsi: Login user\n- Request JSON:\n```json\n{\n  \"email\": \"admin1@example.com\",\n  \"password\": \"password123\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Login berhasil\",\n  \"data\": {\n    \"accessToken\": \"...\",\n    \"refreshToken\": \"...\",\n    \"user\": {\n      \"id\": \"user-...\"\n    }\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Email atau password salah\"\n}\n```\n- Catatan: Tidak butuh token\n\n### 1.5 Refresh Token\n**POST** `/auth/refresh`\n- Deskripsi: Refresh access token\n- Request JSON:\n```json\n{\n  \"refresh_token\": \"...\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Token berhasil diperbarui\",\n  \"data\": {\n    \"accessToken\": \"...\",\n    \"refreshToken\": \"...\",\n    \"user\": {\n      \"id\": \"user-...\"\n    }\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Refresh token tidak valid\"\n}\n```\n- Catatan: Tidak butuh token\n\n### 1.6 Logout\n**POST** `/auth/logout`\n- Deskripsi: Logout user (client-side)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Logout berhasil\"\n}\n```\n- Catatan: Tidak butuh token\n\n### 1.7 Check Email Availability\n**GET** `/auth/check-email?email=...`\n- Deskripsi: Cek ketersediaan email\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"email\": \"student1@example.com\",\n    \"available\": true,\n    \"message\": \"Email tersedia\"\n  }\n}\n```\n- Catatan: Tidak butuh token\n\n### 1.8 Check NIS Availability\n**GET** `/auth/check-nis?nis=...`\n- Deskripsi: Cek ketersediaan NIS\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"nis\": \"2024001\",\n    \"available\": true,\n    \"message\": \"NIS tersedia\"\n  }\n}\n```\n- Catatan: Tidak butuh token\n\n---\n\n## 2. USER PROFILE\n\n### 2.1 Get Profile\n**GET** `/users/profile`\n- Deskripsi: Mendapatkan profile user yang sedang login\n- Ekspektasi Response (Success, role admin):\n```json\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": \"user-...\",\n    \"email\": \"admin1@example.com\",\n    \"role\": \"admin\",\n    \"full_name\": \"Admin Satu\",\n    \"phone_number\": \"081234567890\",\n    \"photo\": \"https://example.com/photo.jpg\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Success, role student/mentor):\n```json\n{\n  \"status\": \"success\",\n  \"data\": { ... }\n}\n```\n- Catatan: Butuh token (semua role)\n\n### 2.2 Update Profile\n**PUT** `/users/profile`\n- Deskripsi: Update profile user yang sedang login\n- Request JSON (admin):\n```json\n{\n  \"full_name\": \"Admin Satu Updated\",\n  \"phone_number\": \"081234567899\",\n  \"photo\": \"https://example.com/new-photo.jpg\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Profile berhasil diupdate\",\n  \"data\": { ... }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Data tidak valid\"\n}\n```\n- Catatan: Butuh token (semua role)\n\n### 2.3 Change Password\n**PUT** `/users/password`\n- Deskripsi: Ganti password user\n- Request JSON:\n```json\n{\n  \"current_password\": \"password123\",\n  \"new_password\": \"newpassword123\",\n  \"confirm_password\": \"newpassword123\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Password berhasil diubah\"\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Password saat ini salah\"\n}\n```\n- Catatan: Butuh token\n\n---\n\n## 3. ADMIN MANAGEMENT (Admin Only)\n\n### 3.1 Create Admin\n**POST** `/api/admins`\n- Deskripsi: Membuat admin baru\n- Request JSON:\n```json\n{\n  \"email\": \"admin2@example.com\",\n  \"password\": \"password123\",\n  \"role\": \"admin\",\n  \"full_name\": \"Admin Dua\",\n  \"phone_number\": \"081234567891\",\n  \"photo\": \"https://example.com/photo2.jpg\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Admin berhasil dibuat\",\n  \"data\": { ... }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Email sudah terdaftar\"\n}\n```\n- Catatan: Butuh token admin\n\n### 3.2 Get All Admins\n**GET** `/api/admins?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc`\n- Deskripsi: Mendapatkan daftar admin\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar admin berhasil diambil\",\n  \"data\": [ ... ],\n  \"pagination\": { ... }\n}\n```\n- Catatan: Butuh token admin\n\n### 3.3 Get Admin by ID\n**GET** `/api/admins/{id}`\n- Deskripsi: Mendapatkan admin berdasarkan ID\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Admin berhasil ditemukan\",\n  \"data\": { ... }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Admin tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin\n\n### 3.4 Update Admin\n**PUT** `/api/admins/{id}`\n- Deskripsi: Update data admin\n- Request JSON:\n```json\n{\n  \"full_name\": \"Admin Dua Updated\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Admin berhasil diupdate\",\n  \"data\": { ... }\n}\n```\n- Catatan: Butuh token admin\n\n### 3.5 Delete Admin\n**DELETE** `/api/admins/{id}`\n- Deskripsi: Hapus admin\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Admin berhasil dihapus\"\n}\n```\n- Catatan: Tidak bisa hapus diri sendiri, butuh token admin\n\n---\n\n## 4. MENTOR MANAGEMENT (Admin \u0026 Company)\n\n### 4.1 Create Mentor\n**POST** `/api/mentors`\n- Deskripsi: Membuat mentor baru (admin: any mentor, company: only their mentors)\n- Request JSON:\n```json\n{\n  \"email\": \"mentor2@example.com\",\n  \"password\": \"password123\",\n  \"role\": \"mentor\",\n  \"full_name\": \"Mentor Dua\",\n  \"position\": \"Lead Developer\",\n  \"gender\": \"male\",\n  \"phone_number\": \"081234567893\",\n  \"department\": \"Software Engineering\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Mentor berhasil dibuat\",\n  \"data\": {\n    \"id\": \"mentor-...\",\n    \"email\": \"mentor2@example.com\",\n    \"role\": \"mentor\",\n    \"full_name\": \"Mentor Dua\",\n    \"position\": \"Lead Developer\",\n    \"gender\": \"male\",\n    \"phone_number\": \"081234567893\",\n    \"department\": \"Software Engineering\",\n    \"id_company\": \"company-...\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Email sudah terdaftar\"\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4.2 Get All Mentors\n**GET** `/api/mentors?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc`\n- Deskripsi: Mendapatkan daftar mentor (admin: all mentors, company: only their mentors)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar mentor berhasil diambil\",\n  \"data\": [\n    {\n      \"id\": \"mentor-...\",\n      \"email\": \"mentor2@example.com\",\n      \"role\": \"mentor\",\n      \"full_name\": \"Mentor Dua\",\n      \"position\": \"Lead Developer\",\n      \"gender\": \"male\",\n      \"phone_number\": \"081234567893\",\n      \"department\": \"Software Engineering\",\n      \"id_company\": \"company-...\",\n      \"created_at\": \"...\",\n      \"updated_at\": \"...\"\n    }\n  ],\n  \"pagination\": {\n    \"page\": 1,\n    \"limit\": 10,\n    \"total\": 15,\n    \"totalPages\": 2,\n    \"hasNext\": true,\n    \"hasPrev\": false\n  }\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4.3 Get Mentor by ID\n**GET** `/api/mentors/{id}`\n- Deskripsi: Mendapatkan mentor berdasarkan ID (admin: any mentor, company: only their mentors)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Mentor berhasil ditemukan\",\n  \"data\": {\n    \"id\": \"mentor-...\",\n    \"email\": \"mentor2@example.com\",\n    \"role\": \"mentor\",\n    \"full_name\": \"Mentor Dua\",\n    \"position\": \"Lead Developer\",\n    \"gender\": \"male\",\n    \"phone_number\": \"081234567893\",\n    \"department\": \"Software Engineering\",\n    \"id_company\": \"company-...\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Mentor tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4.4 Update Mentor\n**PUT** `/api/mentors/{id}`\n- Deskripsi: Update data mentor (admin: any mentor, company: only their mentors)\n- Request JSON:\n```json\n{\n  \"full_name\": \"Mentor Dua Updated\",\n  \"position\": \"Senior Lead Developer\",\n  \"department\": \"Advanced Software Engineering\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Mentor berhasil diupdate\",\n  \"data\": {\n    \"id\": \"mentor-...\",\n    \"email\": \"mentor2@example.com\",\n    \"role\": \"mentor\",\n    \"full_name\": \"Mentor Dua Updated\",\n    \"position\": \"Senior Lead Developer\",\n    \"gender\": \"male\",\n    \"phone_number\": \"081234567893\",\n    \"department\": \"Advanced Software Engineering\",\n    \"id_company\": \"company-...\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Anda tidak memiliki akses ke mentor ini\"\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4.5 Delete Mentor\n**DELETE** `/api/mentors/{id}`\n- Deskripsi: Hapus mentor (admin: any mentor, company: only their mentors)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Mentor berhasil dihapus\"\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Anda tidak memiliki akses ke mentor ini\"\n}\n```\n- Catatan: Butuh token admin atau company\n\n---\n\n## 5. STUDENT MANAGEMENT (Admin Only)\n\n### 5.1 Create Student\n**POST** `/api/students`\n- Deskripsi: Membuat student baru\n- Request JSON:\n```json\n{\n  \"email\": \"student2@example.com\",\n  \"password\": \"password123\",\n  \"role\": \"student\",\n  \"nis\": \"2024002\",\n  \"full_name\": \"Student Dua\",\n  \"gender\": \"female\",\n  \"birth_date\": \"2005-02-15\",\n  \"phone_number\": \"081234567894\",\n  \"address\": \"Jl. Contoh No. 456\",\n  \"class\": \"XII IPA 2\",\n  \"major\": \"IPA\",\n  \"school_name\": \"SMK Negeri 2\",\n  \"photo\": \"https://example.com/photo2.jpg\",\n  \"bio\": \"Siswa yang aktif dan kreatif\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Student berhasil dibuat\",\n  \"data\": {\n    \"id\": \"student-...\",\n    \"email\": \"student2@example.com\",\n    \"role\": \"student\",\n    \"nis\": \"2024002\",\n    \"full_name\": \"Student Dua\",\n    \"gender\": \"female\",\n    \"birth_date\": \"2005-02-15\",\n    \"phone_number\": \"081234567894\",\n    \"address\": \"Jl. Contoh No. 456\",\n    \"class\": \"XII IPA 2\",\n    \"major\": \"IPA\",\n    \"school_name\": \"SMK Negeri 2\",\n    \"photo\": \"https://example.com/photo2.jpg\",\n    \"bio\": \"Siswa yang aktif dan kreatif\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"NIS sudah terdaftar\"\n}\n```\n- Catatan: Butuh token admin\n\n### 5.2 Get All Students\n**GET** `/api/students?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc`\n- Deskripsi: Mendapatkan daftar student\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar student berhasil diambil\",\n  \"data\": [\n    {\n      \"id\": \"student-...\",\n      \"email\": \"student2@example.com\",\n      \"role\": \"student\",\n      \"nis\": \"2024002\",\n      \"full_name\": \"Student Dua\",\n      \"gender\": \"female\",\n      \"birth_date\": \"2005-02-15\",\n      \"phone_number\": \"081234567894\",\n      \"address\": \"Jl. Contoh No. 456\",\n      \"class\": \"XII IPA 2\",\n      \"major\": \"IPA\",\n      \"school_name\": \"SMK Negeri 2\",\n      \"photo\": \"https://example.com/photo2.jpg\",\n      \"bio\": \"Siswa yang aktif dan kreatif\",\n      \"created_at\": \"...\",\n      \"updated_at\": \"...\"\n    }\n  ],\n  \"pagination\": {\n    \"page\": 1,\n    \"limit\": 10,\n    \"total\": 25,\n    \"totalPages\": 3,\n    \"hasNext\": true,\n    \"hasPrev\": false\n  }\n}\n```\n- Catatan: Butuh token admin\n\n### 5.3 Get Student by ID\n**GET** `/api/students/{id}`\n- Deskripsi: Mendapatkan student berdasarkan ID\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Student berhasil ditemukan\",\n  \"data\": {\n    \"id\": \"student-...\",\n    \"email\": \"student2@example.com\",\n    \"role\": \"student\",\n    \"nis\": \"2024002\",\n    \"full_name\": \"Student Dua\",\n    \"gender\": \"female\",\n    \"birth_date\": \"2005-02-15\",\n    \"phone_number\": \"081234567894\",\n    \"address\": \"Jl. Contoh No. 456\",\n    \"class\": \"XII IPA 2\",\n    \"major\": \"IPA\",\n    \"school_name\": \"SMK Negeri 2\",\n    \"photo\": \"https://example.com/photo2.jpg\",\n    \"bio\": \"Siswa yang aktif dan kreatif\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Student tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin\n\n### 5.4 Update Student\n**PUT** `/api/students/{id}`\n- Deskripsi: Update data student\n- Request JSON:\n```json\n{\n  \"full_name\": \"Student Dua Updated\",\n  \"class\": \"XII IPA 3\",\n  \"bio\": \"Siswa yang aktif, kreatif, dan berprestasi\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Student berhasil diupdate\",\n  \"data\": {\n    \"id\": \"student-...\",\n    \"email\": \"student2@example.com\",\n    \"role\": \"student\",\n    \"nis\": \"2024002\",\n    \"full_name\": \"Student Dua Updated\",\n    \"gender\": \"female\",\n    \"birth_date\": \"2005-02-15\",\n    \"phone_number\": \"081234567894\",\n    \"address\": \"Jl. Contoh No. 456\",\n    \"class\": \"XII IPA 3\",\n    \"major\": \"IPA\",\n    \"school_name\": \"SMK Negeri 2\",\n    \"photo\": \"https://example.com/photo2.jpg\",\n    \"bio\": \"Siswa yang aktif, kreatif, dan berprestasi\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Catatan: Butuh token admin\n\n### 5.5 Delete Student\n**DELETE** `/api/students/{id}`\n- Deskripsi: Hapus student\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Student berhasil dihapus\"\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Student tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin\n\n---\n\n## 6. ASSESSMENTS MANAGEMENT (Not Yet Implemented)\n\n**Catatan:** Fitur Assessments Management belum diimplementasikan dalam API. Tabel `assessments` sudah tersedia di database dengan struktur sebagai berikut:\n\n### Struktur Tabel Assessments\n```sql\nCREATE TABLE assessments (\n  id VARCHAR(50) PRIMARY KEY,\n  id_student VARCHAR(50) NOT NULL REFERENCES students(id),\n  id_program VARCHAR(50) NOT NULL REFERENCES programs(id),\n  id_mentor VARCHAR(50) NOT NULL REFERENCES mentors(id),\n  final_grade INTEGER NOT NULL CHECK (final_grade \u003e= 0 AND final_grade \u003c= 100),\n  final_feedback TEXT NOT NULL,\n  final_status VARCHAR(20) NOT NULL DEFAULT 'not_started' CHECK (final_status IN ('finished', 'draw_back', 'not_started')),\n  mentor_feedback TEXT,\n  assessment_date DATE NOT NULL DEFAULT CURRENT_DATE,\n  created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,\n  updated_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP\n);\n```\n\n### Endpoint yang Direncanakan\n- **POST** `/api/assessments` - Create assessment (mentor/admin)\n- **GET** `/api/assessments` - Get all assessments (admin)\n- **GET** `/api/assessments/{id}` - Get assessment by ID (admin/mentor/student)\n- **PUT** `/api/assessments/{id}` - Update assessment (mentor/admin)\n- **DELETE** `/api/assessments/{id}` - Delete assessment (admin)\n- **GET** `/api/mentors/assessments` - Get assessments by mentor (mentor)\n- **GET** `/api/students/assessments` - Get assessments by student (student)\n\n### Business Rules yang Direncanakan\n- Mentor hanya bisa mengakses assessment untuk program yang mereka handle\n- Student hanya bisa melihat assessment mereka sendiri\n- Admin bisa mengakses semua assessment\n- Assessment final_status mempengaruhi kemampuan student untuk apply ulang ke program yang sama\n\n---\n\n## 7. HEALTH CHECK\n\n### 7.1 Health Check\n**GET** `/health`\n- Deskripsi: Mengecek status server\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Server is running\",\n  \"timestamp\": \"...\"\n}\n```\n\n---\n\n## 4A. COMPANY MANAGEMENT\n\n### 4A.1 Register Company\n**POST** `/auth/register/company`\n- Deskripsi: Register akun company baru (public)\n- Request JSON:\n```json\n{\n  \"email\": \"company1@example.com\",\n  \"password\": \"password123\",\n  \"role\": \"company\",\n  \"company_name\": \"PT. Inovasi Digital\",\n  \"company_address\": \"Jl. Industri No. 1, Jakarta\",\n  \"company_phone\": \"0211234567\",\n  \"company_email\": \"info@inovasi.com\",\n  \"company_website\": \"https://inovasi.com\",\n  \"company_logo\": \"https://inovasi.com/logo.png\",\n  \"company_description\": \"Perusahaan teknologi inovatif.\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Company berhasil didaftarkan\",\n  \"data\": {\n    \"accessToken\": \"...\",\n    \"refreshToken\": \"...\",\n    \"user\": {\n      \"id\": \"user-...\"\n    }\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Email sudah terdaftar\"\n}\n```\n- Catatan: Tidak butuh token\n\n### 4A.2 Create Company (Admin Only)\n**POST** `/api/companies`\n- Deskripsi: Membuat company baru oleh admin\n- Request JSON: (sama seperti register, tanpa field role)\n```json\n{\n  \"email\": \"company2@example.com\",\n  \"password\": \"password123\",\n  \"company_name\": \"PT. Solusi Cerdas\",\n  \"company_address\": \"Jl. Teknologi No. 2, Bandung\",\n  \"company_phone\": \"0221234567\",\n  \"company_email\": \"info@solusicerdas.com\",\n  \"company_website\": \"https://solusicerdas.com\",\n  \"company_logo\": \"https://solusicerdas.com/logo.png\",\n  \"company_description\": \"Solusi teknologi untuk bisnis.\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Company berhasil dibuat\",\n  \"data\": { ... }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Email sudah terdaftar\"\n}\n```\n- Catatan: Butuh token admin\n\n### 4A.3 Get All Companies (Admin Only)\n**GET** `/api/companies?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc`\n- Deskripsi: Mendapatkan daftar company\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar company berhasil diambil\",\n  \"data\": [ ... ],\n  \"pagination\": { ... }\n}\n```\n- Catatan: Butuh token admin\n\n### 4A.4 Get Company by ID (Admin Only)\n**GET** `/api/companies/{id}`\n- Deskripsi: Mendapatkan company berdasarkan ID\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Company berhasil ditemukan\",\n  \"data\": { ... }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Company tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin\n\n### 4A.5 Update Company (Admin Only)\n**PUT** `/api/companies/{id}`\n- Deskripsi: Update data company\n- Request JSON:\n```json\n{\n  \"company_name\": \"PT. Inovasi Digital Updated\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Company berhasil diupdate\",\n  \"data\": { ... }\n}\n```\n- Catatan: Butuh token admin\n\n### 4A.6 Delete Company (Admin Only)\n**DELETE** `/api/companies/{id}`\n- Deskripsi: Hapus company\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Company berhasil dihapus\"\n}\n```\n- Catatan: Butuh token admin\n\n### 4A.7 Get Current Company Profile\n**GET** `/companies/profile`\n- Deskripsi: Mendapatkan profile company yang sedang login\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"data\": {\n    \"id\": \"company-...\",\n    \"company_name\": \"PT. Inovasi Digital\",\n    \"company_address\": \"Jl. Industri No. 1, Jakarta\",\n    \"company_phone\": \"0211234567\",\n    \"company_email\": \"info@inovasi.com\",\n    \"company_website\": \"https://inovasi.com\",\n    \"company_logo\": \"https://inovasi.com/logo.png\",\n    \"company_description\": \"Perusahaan teknologi inovatif.\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Catatan: Butuh token company\n\n### 4A.8 Get Mentors by Company\n**GET** `/companies/mentors`\n- Deskripsi: Mendapatkan daftar mentor milik company yang sedang login\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar mentor berhasil diambil\",\n  \"data\": [ ... ],\n  \"pagination\": { ... }\n}\n```\n- Catatan: Butuh token company\n\n---\n\n## 4B. PROGRAM MANAGEMENT (Admin \u0026 Company)\n\n### 4B.1 Create Program\n**POST** `/api/programs`\n- Deskripsi: Membuat program baru (admin: any program, company: only their programs)\n- Request JSON:\n```json\n{\n  \"title\": \"Program Magang Software Developer\",\n  \"company_name\": \"PT. Inovasi Digital\",\n  \"description\": \"Program magang untuk mahasiswa yang ingin belajar pengembangan software dengan teknologi terkini\",\n  \"category\": \"Software Development\",\n  \"location\": \"Jakarta\",\n  \"intern_type\": \"hybrid\",\n  \"duration\": \"3 bulan\",\n  \"start_date\": \"2024-02-01\",\n  \"end_date\": \"2024-05-01\",\n  \"quota\": 10,\n  \"qualification\": \"Mahasiswa semester 6-8 jurusan Informatika/Teknik Komputer, menguasai dasar pemrograman, familiar dengan JavaScript/Java/Python\",\n  \"benefits\": \"Sertifikat magang, uang saku, pengalaman kerja nyata, networking dengan profesional IT\",\n  \"status\": \"open\",\n  \"photo\": \"https://example.com/program-photo.jpg\",\n  \"id_mentor\": \"mentor-abc123\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Program berhasil dibuat\",\n  \"data\": {\n    \"id\": \"program-...\",\n    \"title\": \"Program Magang Software Developer\",\n    \"company_name\": \"PT. Inovasi Digital\",\n    \"description\": \"Program magang untuk mahasiswa yang ingin belajar pengembangan software dengan teknologi terkini\",\n    \"category\": \"Software Development\",\n    \"location\": \"Jakarta\",\n    \"intern_type\": \"hybrid\",\n    \"duration\": \"3 bulan\",\n    \"start_date\": \"2024-02-01\",\n    \"end_date\": \"2024-05-01\",\n    \"quota\": 10,\n    \"qualification\": \"Mahasiswa semester 6-8 jurusan Informatika/Teknik Komputer, menguasai dasar pemrograman, familiar dengan JavaScript/Java/Python\",\n    \"benefits\": \"Sertifikat magang, uang saku, pengalaman kerja nyata, networking dengan profesional IT\",\n    \"status\": \"open\",\n    \"photo\": \"https://example.com/program-photo.jpg\",\n    \"id_mentor\": \"mentor-abc123\",\n    \"id_company\": \"company-...\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Mentor tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4B.2 Get All Programs\n**GET** `/api/programs?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc\u0026category=\u0026location=\u0026intern_type=\u0026status=\u0026newest=`\n- Deskripsi: Mendapatkan daftar program (admin: all programs, company: only their programs)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar program berhasil diambil\",\n  \"data\": [\n    {\n      \"id\": \"program-...\",\n      \"title\": \"Program Magang Software Developer\",\n      \"company_name\": \"PT. Inovasi Digital\",\n      \"description\": \"Program magang untuk mahasiswa...\",\n      \"category\": \"Software Development\",\n      \"location\": \"Jakarta\",\n      \"intern_type\": \"hybrid\",\n      \"duration\": \"3 bulan\",\n      \"start_date\": \"2024-02-01\",\n      \"end_date\": \"2024-05-01\",\n      \"quota\": 10,\n      \"status\": \"open\",\n      \"photo\": \"https://example.com/program-photo.jpg\",\n      \"created_at\": \"...\",\n      \"updated_at\": \"...\"\n    }\n  ],\n  \"pagination\": {\n    \"page\": 1,\n    \"limit\": 10,\n    \"total\": 25,\n    \"totalPages\": 3,\n    \"hasNext\": true,\n    \"hasPrev\": false\n  }\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4B.3 Get Available Programs for Students\n**GET** `/api/students/programs?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc\u0026category=\u0026location=\u0026intern_type=\u0026newest=`\n- Deskripsi: Mendapatkan daftar program yang tersedia untuk student (status open only)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar program tersedia berhasil diambil\",\n  \"data\": [\n    {\n      \"id\": \"program-...\",\n      \"title\": \"Program Magang Software Developer\",\n      \"company_name\": \"PT. Inovasi Digital\",\n      \"description\": \"Program magang untuk mahasiswa...\",\n      \"category\": \"Software Development\",\n      \"location\": \"Jakarta\",\n      \"intern_type\": \"hybrid\",\n      \"duration\": \"3 bulan\",\n      \"start_date\": \"2024-02-01\",\n      \"end_date\": \"2024-05-01\",\n      \"quota\": 10,\n      \"status\": \"open\",\n      \"photo\": \"https://example.com/program-photo.jpg\",\n      \"created_at\": \"...\",\n      \"updated_at\": \"...\"\n    }\n  ],\n  \"pagination\": { ... }\n}\n```\n- Catatan: Butuh token student\n\n### 4B.4 Get Program by ID\n**GET** `/api/programs/{id}`\n- Deskripsi: Mendapatkan program berdasarkan ID (admin: any program, company: only their programs)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Program berhasil ditemukan\",\n  \"data\": {\n    \"id\": \"program-...\",\n    \"title\": \"Program Magang Software Developer\",\n    \"company_name\": \"PT. Inovasi Digital\",\n    \"description\": \"Program magang untuk mahasiswa yang ingin belajar pengembangan software dengan teknologi terkini\",\n    \"category\": \"Software Development\",\n    \"location\": \"Jakarta\",\n    \"intern_type\": \"hybrid\",\n    \"duration\": \"3 bulan\",\n    \"start_date\": \"2024-02-01\",\n    \"end_date\": \"2024-05-01\",\n    \"quota\": 10,\n    \"qualification\": \"Mahasiswa semester 6-8 jurusan Informatika/Teknik Komputer, menguasai dasar pemrograman, familiar dengan JavaScript/Java/Python\",\n    \"benefits\": \"Sertifikat magang, uang saku, pengalaman kerja nyata, networking dengan profesional IT\",\n    \"status\": \"open\",\n    \"photo\": \"https://example.com/program-photo.jpg\",\n    \"id_mentor\": \"mentor-abc123\",\n    \"id_company\": \"company-...\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Program tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4B.5 Update Program\n**PUT** `/api/programs/{id}`\n- Deskripsi: Update data program (admin: any program, company: only their programs)\n- Request JSON:\n```json\n{\n  \"title\": \"Program Magang Software Developer - Updated\",\n  \"status\": \"closed\",\n  \"quota\": 5\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Program berhasil diupdate\",\n  \"data\": { ... }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Anda tidak memiliki akses ke program ini\"\n}\n```\n- Catatan: Butuh token admin atau company\n\n### 4B.6 Delete Program\n**DELETE** `/api/programs/{id}`\n- Deskripsi: Hapus program (admin: any program, company: only their programs)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Program berhasil dihapus\",\n  \"data\": {\n    \"deleted_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Anda tidak memiliki akses ke program ini\"\n}\n```\n- Catatan: Butuh token admin atau company \n\n---\n\n## 4C. APPLICATIONS (Student, Company, Admin)\n\n### 4C.1 Create Application (Student Only)\n**POST** `/api/applications`\n- Deskripsi: Student mendaftar ke program magang\n- Request JSON:\n```json\n{\n  \"id_program\": \"program-abc123\",\n  \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n  \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Aplikasi berhasil dibuat\",\n  \"data\": {\n    \"id\": \"application-...\",\n    \"id_student\": \"student-...\",\n    \"id_program\": \"program-abc123\",\n    \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n    \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n    \"apply_date\": \"2024-01-15T10:30:00Z\",\n    \"status\": \"registered\",\n    \"feedback\": null,\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Program tidak ditemukan atau tidak tersedia\"\n}\n```\n- Catatan: Butuh token student\n\n### 4C.2 Get Student Applications (Student Only)\n**GET** `/api/students/applications?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc\u0026status=\u0026newest=`\n- Deskripsi: Mendapatkan daftar aplikasi student yang sedang login\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar aplikasi berhasil diambil\",\n  \"data\": [\n    {\n      \"id\": \"application-...\",\n      \"id_student\": \"student-...\",\n      \"id_program\": \"program-abc123\",\n      \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n      \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n      \"apply_date\": \"2024-01-15T10:30:00Z\",\n      \"status\": \"registered\",\n      \"feedback\": null,\n      \"created_at\": \"...\",\n      \"updated_at\": \"...\",\n      \"program_title\": \"Program Magang Software Developer\",\n      \"company_name\": \"PT. Inovasi Digital\",\n      \"student_name\": \"John Doe\",\n      \"student_nis\": \"2024001\"\n    }\n  ],\n  \"pagination\": {\n    \"page\": 1,\n    \"limit\": 10,\n    \"total\": 5,\n    \"totalPages\": 1,\n    \"hasNext\": false,\n    \"hasPrev\": false\n  }\n}\n```\n- Catatan: Butuh token student\n\n### 4C.3 Get Student Application by ID (Student Only)\n**GET** `/api/students/applications/{id}`\n- Deskripsi: Mendapatkan detail aplikasi student berdasarkan ID\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Detail aplikasi berhasil diambil\",\n  \"data\": {\n    \"id\": \"application-...\",\n    \"id_student\": \"student-...\",\n    \"id_program\": \"program-abc123\",\n    \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n    \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n    \"apply_date\": \"2024-01-15T10:30:00Z\",\n    \"status\": \"registered\",\n    \"feedback\": null,\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\",\n    \"program_title\": \"Program Magang Software Developer\",\n    \"company_name\": \"PT. Inovasi Digital\",\n    \"student_name\": \"John Doe\",\n    \"student_nis\": \"2024001\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Aplikasi tidak ditemukan\"\n}\n```\n- Catatan: Butuh token student\n\n### 4C.4 Get Company Applications (Company Only)\n**GET** `/api/companies/applications?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc\u0026status=\u0026newest=`\n- Deskripsi: Mendapatkan daftar aplikasi untuk program milik company yang sedang login\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar aplikasi berhasil diambil\",\n  \"data\": [\n    {\n      \"id\": \"application-...\",\n      \"id_student\": \"student-...\",\n      \"id_program\": \"program-abc123\",\n      \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n      \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n      \"apply_date\": \"2024-01-15T10:30:00Z\",\n      \"status\": \"registered\",\n      \"feedback\": null,\n      \"created_at\": \"...\",\n      \"updated_at\": \"...\",\n      \"program_title\": \"Program Magang Software Developer\",\n      \"company_name\": \"PT. Inovasi Digital\",\n      \"student_name\": \"John Doe\",\n      \"student_nis\": \"2024001\"\n    }\n  ],\n  \"pagination\": { ... }\n}\n```\n- Catatan: Butuh token company\n\n### 4C.5 Get Company Application by ID (Company Only)\n**GET** `/api/companies/applications/{id}`\n- Deskripsi: Mendapatkan detail aplikasi untuk program milik company berdasarkan ID\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Detail aplikasi berhasil diambil\",\n  \"data\": {\n    \"id\": \"application-...\",\n    \"id_student\": \"student-...\",\n    \"id_program\": \"program-abc123\",\n    \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n    \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n    \"apply_date\": \"2024-01-15T10:30:00Z\",\n    \"status\": \"registered\",\n    \"feedback\": null,\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\",\n    \"program_title\": \"Program Magang Software Developer\",\n    \"company_name\": \"PT. Inovasi Digital\",\n    \"student_name\": \"John Doe\",\n    \"student_nis\": \"2024001\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Anda tidak memiliki akses ke aplikasi ini\"\n}\n```\n- Catatan: Butuh token company\n\n### 4C.6 Update Company Application (Company Only)\n**PUT** `/api/companies/applications/{id}`\n- Deskripsi: Update status dan feedback aplikasi untuk program milik company\n- Request JSON:\n```json\n{\n  \"status\": \"reviewing\",\n  \"feedback\": \"CV dan surat rekomendasi sudah diterima, sedang dalam proses review\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Aplikasi berhasil diupdate\",\n  \"data\": {\n    \"id\": \"application-...\",\n    \"id_student\": \"student-...\",\n    \"id_program\": \"program-abc123\",\n    \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n    \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n    \"apply_date\": \"2024-01-15T10:30:00Z\",\n    \"status\": \"reviewing\",\n    \"feedback\": \"CV dan surat rekomendasi sudah diterima, sedang dalam proses review\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Anda tidak memiliki akses ke aplikasi ini\"\n}\n```\n- Catatan: Butuh token company\n\n### 4C.7 Get All Applications (Admin Only)\n**GET** `/api/applications?page=1\u0026limit=10\u0026search=\u0026sort_by=created_at\u0026sort_order=desc\u0026status=\u0026newest=`\n- Deskripsi: Mendapatkan daftar semua aplikasi (admin only)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Daftar aplikasi berhasil diambil\",\n  \"data\": [\n    {\n      \"id\": \"application-...\",\n      \"id_student\": \"student-...\",\n      \"id_program\": \"program-abc123\",\n      \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n      \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n      \"apply_date\": \"2024-01-15T10:30:00Z\",\n      \"status\": \"registered\",\n      \"feedback\": null,\n      \"created_at\": \"...\",\n      \"updated_at\": \"...\",\n      \"program_title\": \"Program Magang Software Developer\",\n      \"company_name\": \"PT. Inovasi Digital\",\n      \"student_name\": \"John Doe\",\n      \"student_nis\": \"2024001\"\n    }\n  ],\n  \"pagination\": { ... }\n}\n```\n- Catatan: Butuh token admin\n\n### 4C.8 Get Application by ID (Admin Only)\n**GET** `/api/applications/{id}`\n- Deskripsi: Mendapatkan detail aplikasi berdasarkan ID (admin only)\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Detail aplikasi berhasil diambil\",\n  \"data\": {\n    \"id\": \"application-...\",\n    \"id_student\": \"student-...\",\n    \"id_program\": \"program-abc123\",\n    \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n    \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n    \"apply_date\": \"2024-01-15T10:30:00Z\",\n    \"status\": \"registered\",\n    \"feedback\": null,\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\",\n    \"program_title\": \"Program Magang Software Developer\",\n    \"company_name\": \"PT. Inovasi Digital\",\n    \"student_name\": \"John Doe\",\n    \"student_nis\": \"2024001\"\n  }\n}\n```\n- Ekspektasi Response (Error):\n```json\n{\n  \"status\": \"fail\",\n  \"message\": \"Aplikasi tidak ditemukan\"\n}\n```\n- Catatan: Butuh token admin\n\n### 4C.9 Update Application (Admin Only)\n**PUT** `/api/applications/{id}`\n- Deskripsi: Update status dan feedback aplikasi (admin only)\n- Request JSON:\n```json\n{\n  \"status\": \"accepted\",\n  \"feedback\": \"Selamat! Anda diterima untuk program magang ini. Silakan hubungi kami untuk informasi selanjutnya.\"\n}\n```\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Aplikasi berhasil diupdate\",\n  \"data\": {\n    \"id\": \"application-...\",\n    \"id_student\": \"student-...\",\n    \"id_program\": \"program-abc123\",\n    \"cv_url\": \"https://drive.google.com/file/d/1234567890/view\",\n    \"recommendation_letter_url\": \"https://drive.google.com/file/d/0987654321/view\",\n    \"apply_date\": \"2024-01-15T10:30:00Z\",\n    \"status\": \"accepted\",\n    \"feedback\": \"Selamat! Anda diterima untuk program magang ini. Silakan hubungi kami untuk informasi selanjutnya.\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\"\n  }\n}\n```\n- Catatan: Butuh token admin\n\n### 4C.10 Get Program Detail for Student\n**GET** `/api/students/programs/{id}`\n- Deskripsi: Mendapatkan detail program dengan informasi status aplikasi student\n- Ekspektasi Response (Success):\n```json\n{\n  \"status\": \"success\",\n  \"message\": \"Detail program berhasil diambil\",\n  \"data\": {\n    \"id\": \"program-abc123\",\n    \"title\": \"Program Magang Software Developer\",\n    \"company_name\": \"PT. Inovasi Digital\",\n    \"description\": \"Program magang untuk mahasiswa...\",\n    \"category\": \"Software Development\",\n    \"location\": \"Jakarta\",\n    \"intern_type\": \"hybrid\",\n    \"duration\": \"3 bulan\",\n    \"start_date\": \"2024-02-01\",\n    \"end_date\": \"2024-05-01\",\n    \"quota\": 10,\n    \"qualification\": \"Mahasiswa semester 6-8...\",\n    \"benefits\": \"Sertifikat magang, uang saku...\",\n    \"status\": \"open\",\n    \"photo\": \"https://example.com/program-photo.jpg\",\n    \"created_at\": \"...\",\n    \"updated_at\": \"...\",\n    \"application_status\": \"registered\",\n    \"can_apply\": false,\n    \"application_id\": \"application-...\"\n  }\n}\n```\n- Catatan: Butuh token student \n","funding_links":[],"categories":[],"sub_categories":[],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fastrocoding%2Fmagang-smk-microservices","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fastrocoding%2Fmagang-smk-microservices","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fastrocoding%2Fmagang-smk-microservices/lists"}