# Mengimpor modul Any dari typing untuk penentuan type hint variabel di Python from typing import Any # Mengimpor tipe data kolom SQLAlchemy: Column (kolom), Integer (angka bulat), String (karakter teks), Boolean (true/false), DateTime (waktu) from sqlalchemy import Column, Integer, String, Boolean, DateTime # Mengimpor func untuk fungsi SQL bawaan (misal mengambil waktu server database) from sqlalchemy.sql import func # Mengimpor kelas basis declarative Base dari model base from app.models.base import Base # Mendefinisikan model ORM untuk tabel pengguna sistem (Admin / Kaprodi) class User(Base): # Menentukan nama tabel fisik pada database MySQL __tablename__ = "users" # Kolom ID pengguna sebagai Primary Key unik bertipe integer dengan pengindeksan aktif id: Any = Column(Integer, primary_key=True, index=True) # Kolom username untuk otentikasi login, maksimal 100 karakter, harus unik (unique=True), dan wajib diisi (nullable=False) username: Any = Column(String(100), unique=True, index=True, nullable=False) # Kolom nama lengkap pengguna / pejabat prodi, maksimal 150 karakter, bersifat opsional (nullable=True) nama: Any = Column(String(150), nullable=True) # Kolom alamat email pengguna, harus unik dan terindeks untuk reset password serta komunikasi email: Any = Column(String(150), unique=True, index=True, nullable=False) # Kolom hash password hasil enkripsi algoritma Bcrypt (bukan plaintext demi keamanan data) hashed_password: Any = Column(String(255), nullable=False) # Kolom hak akses (role) pengguna dalam sistem, nilai default adalah 'admin', opsi: 'admin' atau 'kaprodi' role: Any = Column(String(50), default="admin", nullable=False) # 'admin' | 'kaprodi' # Kolom kode program studi binaan (khusus jika role adalah 'kaprodi' seperti '55301' MIF, '57401' TIF) kode_prodi: Any = Column(String(20), nullable=True) # '55301', '57401', '56401', etc. # Kolom status keaktifan akun pengguna (True = aktif dapat login, False = dinonaktifkan/diblokir) is_active: Any = Column(Boolean, default=True) # Kolom pencatatan waktu registrasi atau pembuatan akun pengguna created_at = Column(DateTime(timezone=True), server_default=func.now()) # Kolom pencatatan waktu pembaruan profil atau password pengguna updated_at = Column( DateTime(timezone=True), server_default=func.now(), onupdate=func.now() )