# **Horus Entry Exam: Fullstack Programmer Internship**
-----
### **🗃️ 1. Desain dan Implementasi Database**
Tugas Anda adalah merancang dan membuat database untuk menyimpan data pengguna.
* **Nama Database**: `horus_[NamaPanggilanAnda]_db`.
* **DBMS**: Bebas (MySQL, PostgreSQL, dsb.).
* **Tabel**: Buat sebuah tabel bernama `users` dengan struktur sebagai berikut:
| Nama Kolom | Tipe Data | Keterangan |
| :--- | :--- | :--- |
| `id` | `INT` / `BIGINT` | Primary Key, Auto Increment |
| `username` | `VARCHAR(50)` | Wajib diisi, Unik (tidak boleh ada duplikasi) |
| `password` | `VARCHAR(255)` | Wajib diisi (simpan dalam bentuk *hash*) |
| `email` | `VARCHAR(100)` | Wajib diisi, Unik |
| `nama` | `VARCHAR(100)` | Wajib diisi |
| `created_at` | `TIMESTAMP` | Default: Waktu saat ini |
-----
### **🌐 2. Pengembangan REST API**
Buatlah serangkaian *endpoint* API untuk mengelola data pada tabel `users`. Bahasa pemrograman bebas, namun **sangat disarankan menggunakan Python dengan framework Flask**.
* **`POST /users/register`**
* **Fungsi**: Mendaftarkan pengguna baru.
* **Request Body**: `{ "username": "...", "password": "...", "email": "...", "nama": "..." }`
* **Respon Sukses (201 Created)**: `{ "message": "Registrasi berhasil" }`
* **`POST /users/login`**
* **Fungsi**: Mengautentikasi pengguna.
* **Request Body**: `{ "username": "...", "password": "..." }`
* **Respon Sukses (200 OK)**: `{ "message": "Login berhasil", "token": "..." }` (opsional).
* **`GET /users`**
* **Fungsi**: Mendapatkan semua data pengguna (tanpa *password*).
* **Respon Sukses (200 OK)**: `[ { "id": 1, "username": "...", "email": "...", "nama": "..." }, ... ]`
* **`PUT /users/{id}`**
* **Fungsi**: Memperbarui data pengguna berdasarkan ID.
* **Request Body**: `{ "username": "...", "email": "...", "nama": "..." }`
* **Respon Sukses (200 OK)**: `{ "message": "Data user berhasil diperbarui" }`
* **`DELETE /users/{id}`**
* **Fungsi**: Menghapus data pengguna berdasarkan ID.
* **Respon Sukses (200 OK)**: `{ "message": "User berhasil dihapus" }`
-----
### **🖥️ 3. Implementasi Tampilan Web (Frontend)**
Buat antarmuka pengguna yang terhubung dengan API yang telah dibuat. Framework web bebas, namun **sangat disarankan menggunakan Vue.js**.
#### **a. Halaman Login**
* **Deskripsi**: Halaman awal untuk pengguna masuk ke dalam sistem.
* **Alur & Validasi**:
* Pengguna memasukkan `username` dan `password`.
* Jika berhasil, arahkan ke halaman Dashboard.
* Jika gagal, tampilkan pesan error yang jelas (misal: "Username atau password salah").
* Tombol **Registrasi** mengarahkan ke halaman Registrasi.
* **Mockup**:
```
+-------------------------------------------+
| |
| LOGIN |
| |
| Username: [___________________________] |
| |
| Password: [___________________________] |
| |
| ( Login ) ( Registrasi ) |
| |
+-------------------------------------------+
```
#### **b. Halaman Registrasi**
* **Deskripsi**: Halaman untuk pengguna baru membuat akun.
* **Alur & Validasi**:
* Semua *input field* wajib diisi. Lakukan validasi dasar di sisi klien (misal: format email).
* Setelah menekan tombol **Registrasi**, kirim data ke API.
* Jika registrasi berhasil, tampilkan notifikasi sukses dan arahkan pengguna kembali ke halaman Login.
* Jika gagal (misal: username sudah ada), tampilkan pesan error.
* **Mockup**:
```
+-------------------------------------------+
| |
| REGISTRASI AKUN |
| |
| Nama Lengkap: [_______________________] |
| Email: [_______________________] |
| Username: [_______________________] |
| Password: [_______________________] |
| |
| ( Registrasi ) |
| |
+-------------------------------------------+
```
#### **c. Halaman Dashboard**
* **Deskripsi**: Halaman utama setelah login, menampilkan daftar semua pengguna. Halaman ini harus terproteksi (tidak bisa diakses sebelum login).
* **Alur & Fungsionalitas**:
* Tampilkan semua data pengguna dalam format tabel yang mudah dibaca.
* Sediakan fitur **pencarian** (*search*) untuk memfilter data berdasarkan nama atau username.
* Tombol **Update** pada setiap baris akan mengarahkan ke halaman *Update User* dengan membawa data user tersebut.
* Tombol **Delete** akan menghapus data setelah konfirmasi (misal: muncul *pop-up* "Apakah Anda yakin?").
* **Mockup**:
```
+----------------------------------------------------------------------+
| DASHBOARD PENGGUNA |
| |
| Cari Pengguna: [_________________] ( Cari ) |
| |
| | ID | Username | Nama Lengkap | Email | Aksi |
| |----|------------|-------------------|---------------------|--------|
| | 1 | andi_dev | Andi Wijaya | andi@email.com | [U][H] |
| | 2 | budi_s | Budi Santoso | budi@email.com | [U][H] |
| | 3 | citra_p | Citra Permata | citra@email.com | [U][H] |
| |
+----------------------------------------------------------------------+
```
#### **d. Halaman Update User**
* **Deskripsi**: Halaman untuk mengubah informasi pengguna yang sudah ada.
* **Alur & Validasi**:
* *Input field* sudah terisi otomatis dengan data pengguna yang dipilih dari halaman Dashboard.
* Pengguna dapat mengubah data dan menyimpannya dengan menekan tombol **Update**.
* Setelah berhasil, arahkan kembali ke halaman Dashboard dengan data yang sudah diperbarui.
* Tombol **Kembali** akan mengarahkan pengguna ke halaman Dashboard tanpa menyimpan perubahan.
* **Mockup**:
```
+-------------------------------------------+
| |
| UPDATE USER |
| |
| Nama Lengkap: [Budi Santoso___________] |
| Email: [budi@email.com_________] |
| Username: [budi_s_________________] |
| |
| ( Update ) ( Kembali ) |
| |
+-------------------------------------------+
```
-----
### ✅ 4. Deliverables
**Source Code**
Satu repository **publik** di GitHub yang berisi dua folder utama:
```
horus-[nama-panggilan]-exam/
├── backend/
│ ├── app/
│ │ ├── __init__.py
│ │ ├── config.py
│ │ ├── extensions.py # db, migrate, jwt, cors
│ │ ├── models/
│ │ │ ├── __init__.py
│ │ │ └── user.py
│ │ ├── routes/
│ │ │ ├── __init__.py
│ │ │ └── users.py
│ │ ├── services/
│ │ │ ├── __init__.py
│ │ │ └── user_service.py
│ │ └── utils/
│ │ ├── __init__.py
│ │ └── validators.py
│ ├── migrations/ # hasil flask db init
│ ├── .env.example
│ ├── requirements.txt
│ └── run.py # entry point: `python run.py`
│
├── frontend/
│ ├── src/
│ │ ├── assets/
│ │ ├── components/
│ │ │ ├── UserTable.vue
│ │ │ └── SearchBar.vue
│ │ ├── views/
│ │ │ ├── Login.vue
│ │ │ ├── Register.vue
│ │ │ ├── Dashboard.vue
│ │ │ └── UpdateUser.vue
│ │ ├── router/
│ │ │ └── index.js
│ │ ├── store/
│ │ │ └── auth.js
│ │ ├── services/
│ │ │ └── api.js # axios instance
│ │ ├── App.vue
│ │ └── main.js
│ ├── public/
│ │ └── index.html
│ ├── .env.example
│ └── package.json
│
└── README.md
```
> Struktur di atas langsung menjadi **bagian wajib dari deliverable**, sehingga penilai dapat dengan cepat menavigasi kode Anda dan mengecek modularitas, clean-code, serta best-practice yang diterapkan.
### **🏆 5. Kriteria Penilaian (Total 100 Poin)**
| Kriteria | Bobot |
| :--- | :---: |
| **Fungsionalitas Backend & API** | 35 |
| **Fungsionalitas Frontend** | 30 |
| **Kualitas Kode & Struktur** | 20 |
| **Desain Database** | 10 |
| **Dokumentasi (README.md)** | 5 |
**Selamat Mengerjakan\!** Hasil pekerjaan akan menjadi bahan diskusi pada tahap wawancara teknis.