from pydantic import BaseModel, EmailStr, Field, ConfigDict from datetime import datetime from typing import Optional class UserBase(BaseModel): username: str = Field(..., min_length=3, max_length=50, description="Username untuk login") nama: Optional[str] = Field(None, max_length=150, description="Nama lengkap pemilik akun") email: EmailStr = Field(..., description="Alamat email valid") role: Optional[str] = Field("admin", description="Role akun: admin atau kaprodi") kode_prodi: Optional[str] = Field(None, description="Kode prodi jika role kaprodi") class UserCreate(UserBase): password: str = Field(..., min_length=6, description="Password minimal 6 karakter") class UserUpdate(BaseModel): nama: Optional[str] = None email: Optional[EmailStr] = None role: Optional[str] = None kode_prodi: Optional[str] = None password: Optional[str] = None is_active: Optional[bool] = None class UserLogin(BaseModel): username: str = Field(..., description="Username untuk login") password: str = Field(..., description="Password user") class UserResponse(UserBase): id: int is_active: bool created_at: Optional[datetime] = None updated_at: Optional[datetime] = None model_config = ConfigDict(from_attributes=True) class Token(BaseModel): access_token: str token_type: str username: Optional[str] = None nama: Optional[str] = None role: Optional[str] = None kode_prodi: Optional[str] = None class TokenData(BaseModel): username: Optional[str] = None