) | Nama login user, tidak boleh ada spasi/simbol |\n| `nik` | `str` | ✅ Ya | 3-20 digit, hanya angka (`^\\d+
untitled fixed | mdview.io
) | Nomor Induk Karyawan |\n| `full_name` | `str` | ❌ Tidak | - | Nama lengkap untuk tampilan |\n| `role` | `str` | ❌ Tidak | Pilihan: `leader`, `developer`, `helpdesk`, `teknisi` | Hak akses user, default `helpdesk` |\n| `is_active` | `bool` | ❌ Tidak | - | Status aktif/nonaktif akun, default `True` |\n\n### Role yang Tersedia\n\n| Role | Level | Hak Akses |\n|------|-------|-----------|\n| `developer` | Super Admin | Akses penuh, bisa membuat akun developer lain |\n| `leader` | Admin | Kelola user, lihat semua data |\n| `helpdesk` | Operator | Default role, akses standar |\n| `teknisi` | Teknisi | Akses untuk teknisi lapangan |\n\n---\n\n## 2. UserCreate - Registrasi User\n\n```python\nclass UserCreate(UserBase):\n password: str = Field(..., min_length=8)\n```\n\n**Inherit** dari `UserBase` + menambah field password.\n\n### Field Tambahan\n\n| Field | Tipe | Wajib | Validasi | Keterangan |\n|-------|------|-------|----------|------------|\n| `password` | `str` | ✅ Ya | Minimal 8 karakter | Password plain text, akan di-hash sebelum disimpan |\n\n### Contoh Request\n\n```json\n{\n \"username\": \"john_doe\",\n \"nik\": \"12345678\",\n \"full_name\": \"John Doe\",\n \"role\": \"helpdesk\",\n \"is_active\": true,\n \"password\": \"securePassword123\"\n}\n```\n\n---\n\n## 3. UserUpdate - Update Data User\n\n```python\nclass UserUpdate(BaseModel):\n full_name: Optional[str] = None\n nik: Optional[str] = None\n role: Optional[str] = Field(None, pattern=\"^(leader|developer|helpdesk|teknisi)$\")\n is_active: Optional[bool] = None\n password: Optional[str] = Field(None, min_length=8)\n```\n\n**Tidak inherit** dari `UserBase` → semua field bersifat **Optional** (partial update).\n\n### Karakteristik\n\n- Hanya field yang diisi yang akan diupdate\n- Tidak ada field `username` → username tidak bisa diubah\n- Validasi role sama seperti `UserBase`\n\n### Contoh Request (Partial Update)\n\n```json\n{\n \"role\": \"leader\",\n \"is_active\": true\n}\n```\n\n### Validasi Khusus\n\n- Hanya user dengan role `developer` yang bisa memberikan role `developer` ke user lain\n- Validasi dilakukan di endpoint, bukan di model\n\n---\n\n## 4. UserResponse - Response API\n\n```python\nclass UserResponse(UserBase):\n id: int\n created_at: datetime\n updated_at: datetime\n\n class Config:\n from_attributes = True\n```\n\n**Inherit** dari `UserBase` + menambah field dari database.\n\n### Field Tambahan\n\n| Field | Tipe | Keterangan |\n|-------|------|------------|\n| `id` | `int` | Primary key dari database |\n| `created_at` | `datetime` | Timestamp pembuatan akun |\n| `updated_at` | `datetime` | Timestamp update terakhir |\n\n### Config: `from_attributes = True`\n\nMengizinkan konversi dari SQLAlchemy model (`UserDB`) ke Pydantic model secara otomatis.\n\n### Contoh Response\n\n```json\n{\n \"id\": 1,\n \"username\": \"john_doe\",\n \"nik\": \"12345678\",\n \"full_name\": \"John Doe\",\n \"role\": \"helpdesk\",\n \"is_active\": true,\n \"created_at\": \"2024-01-15T08:30:00\",\n \"updated_at\": \"2024-01-15T08:30:00\"\n}\n```\n\n---\n\n## 5. UserLogin - Login via JSON\n\n```python\nclass UserLogin(BaseModel):\n username: str\n password: str\n```\n\nModel sederhana untuk login dengan JSON body (alternatif dari OAuth2 form data).\n\n### Contoh Request\n\n```json\n{\n \"username\": \"john_doe\",\n \"password\": \"securePassword123\"\n}\n```\n\n---\n\n## Alur Data\n\n```\n┌─────────────┐ ┌─────────────┐ ┌─────────────┐\n│ UserCreate │ ──► │ UserDB │ ──► │UserResponse │\n│ (Input) │ │ (Database) │ │ (Output) │\n└─────────────┘ └─────────────┘ └─────────────┘\n │\n ▼\n ┌─────────────┐\n │ UserUpdate │\n │ (Update) │\n └─────────────┘\n```\n\n---\n\n## Relasi dengan File Lain\n\n| File | Relasi |\n|------|--------|\n| `backend/database.py` | `UserDB` - SQLAlchemy model untuk tabel users |\n| `backend/routers/users.py` | Endpoint CRUD user menggunakan model ini |\n| `backend/routers/auth.py` | Endpoint registrasi dan login |\n| `backend/middleware/auth_middleware.py` | Validasi role untuk akses admin |\n\n---\n\n## Catatan Penting\n\n1. **Password tidak pernah dikembalikan** di `UserResponse` untuk keamanan\n2. **Username tidak bisa diubah** setelah registrasi (tidak ada di `UserUpdate`)\n3. **Role default** untuk user baru adalah `helpdesk`\n4. **User baru via registrasi publik** selalu `is_active=False` dan perlu approval admin\n","documentId":"7c16478af57bae2d","ownerId":"user_3CEkjcnJDRJsIEvjFxjjN6hIIXD"}};