
    $uai                     8    d Z ddlZddlmZ  G d d          ZdS )u   
app/models/user.py
==================
User model per autenticazione multi-tenant.

Responsabilità:
- Hashing password con bcrypt
- Validazione password
- Serializzazione user per JWT token
    N)datetimec                   x    e Zd ZdZ	 	 ddZededefd            ZdedefdZ	dd
Z
d Zed             Zd ZdS )Usera  
    Modello User per gestione autenticazione.
    
    Attributi:
        id (int): ID univoco dell'utente
        id_tenant (int): Tenant a cui appartiene
        email (str): Email univoca per tenant
        nome (str): Nome completo
        password_hash (str): Hash bcrypt della password
        ruolo (str): 'admin_tenant', 'manager', 'operatore', 'visualizzazione'
        permessi (dict): JSON permessi specifici
        data_creazione (datetime): Timestamp creazione
        ultimo_accesso (datetime): Timestamp ultimo login
    	operatoreNc
                     || _         || _        || _        || _        || _        || _        |pi | _        |pt          j                    | _	        |	| _
        d S )N)id	id_tenantemailnomepassword_hashruolopermessir   utcnowdata_creazioneultimo_accesso)
selfr   r	   r
   r   r   r   r   r   r   s
             </var/www/enigma.pooltech.it/enigma_inventario/models_user.py__init__zUser.__init__    s[    "
	*
 B,A0A0A,    passwordreturnc                     t          j        d          }t          j        |                     d          |                              d          S )ub  
        Hash password con bcrypt.
        
        Args:
            password (str): Password in chiaro
            
        Returns:
            str: Hash bcrypt della password
            
        Esempio:
            >>> pwd_hash = User.hash_password("miaPassword123")
            >>> # pwd_hash è una stringa sicura da salvare nel database
           )roundsutf-8)bcryptgensalthashpwencodedecode)r   salts     r   hash_passwordzUser.hash_password,   sB     ~R(((}X__W55t<<CCGLLLr   c                     	 t          j        |                    d          | j                            d                    S # t          $ r Y dS w xY w)a  
        Verifica password in chiaro contro l'hash salvato.
        
        Args:
            password (str): Password in chiaro da verificare
            
        Returns:
            bool: True se password corretta, False altrimenti
            
        Esempio:
            >>> user = User(..., password_hash=hash)
            >>> if user.verify_password("miaPassword123"):
            ...     print("Login OK")
        r   F)r   checkpwr   r   	Exception)r   r   s     r   verify_passwordzUser.verify_password>   sY    	>(//'":":D<N<U<UV]<^<^___ 	 	 	55	s   ?A 
AAFc           	          | j         | j        | j        | j        | j        | j        | j        r| j                                        nd| j        r| j                                        ndd}|r
| j	        |d<   |S )a  
        Serializza user a dict (per API response).
        
        Args:
            include_password (bool): Se includere password_hash (default: False per sicurezza)
            
        Returns:
            dict: Dati user serializzati
            
        Esempio:
            >>> user.to_dict()
            {
                'id': 1,
                'email': 'operatore@studium.it',
                'nome': 'Operatore Demo',
                'ruolo': 'operatore',
                'id_tenant': 1
            }
        N)r   r
   r   r   r	   r   r   r   r   )
r   r
   r   r   r	   r   r   	isoformatr   r   )r   include_passworddatas      r   to_dictzUser.to_dictR   s    * 'ZIZAEAT^d1;;===Z^AEAT^d1;;===Z^	
 	
  	7$($6D!r   c                 D    | j         | j        | j        | j        | j        dS )a  
        Crea payload per JWT token (cosa mettiamo dentro il token).

        Returns:
            dict: Payload con dati essenziali per validazione

        Nota: JWT deve essere leggero, quindi includiamo solo dati critici:
        - user_id: per identificare l'utente
        - email: per log/audit
        - tenant_id: CRITICO per isolamento multi-tenant
        - ruolo: per autorizzazione (admin vs operatore)
        )user_idr
   	tenant_idr   r   )r   r
   r	   r   r   r   s    r   to_jwt_payloadzUser.to_jwt_payloadv   s,     wZZ
 
 	
r   c                    t          |                     d          |                     d          |                     d          |                     d          |                     d          |                     dd          |                     di           |                     d	          |                     d
          	  	        S )z
        Factory method: crea User da dict (es. da database).

        Args:
            data (dict): Dict con campi user

        Returns:
            User: Istanza User
        r   r	   r
   r   r   r   r   r   r   r   )	r   r	   r
   r   r   r   r   r   r   )r   get)r*   s    r   	from_dictzUser.from_dict   s     xx~~hh{++((7##&!!((?33((7K00XXj"--88$45588$455

 

 

 
	
r   c                 8    d| j          d| j         d| j         dS )Nz<User z	 (tenant=z, ruolo=z)>)r
   r	   r   r/   s    r   __repr__zUser.__repr__   s)    S
SST^SSTZSSSSr   )r   NNN)F)__name__
__module____qualname____doc__r   staticmethodstrr"   boolr&   r+   r0   r3   r5    r   r   r   r      s          ITDH
- 
- 
- 
- M M M M M \M"     (" " " "H
 
 
* 
 
 \
,T T T T Tr   r   )r9   r   r   r   r=   r   r   <module>r>      sr   	 	       ST ST ST ST ST ST ST ST ST STr   