
    xCiQ                         d dl m Z mZmZ d dlmZmZmZ d dlmZ d dl	m
Z
mZ d dlmZ d dlmZ d dlmZ d dlmZmZ d d	lmZmZmZ d d
lmZ d dlmZ d dlmZmZm Z m!Z!m"Z"  e       Z# G d d      Z$y)    )datetime	timedeltatimezone)HTTPExceptionstatusRequest)Session)UserRole)UserSession)UserRepository)UserSessionRepository)hash_passwordverify_password)create_access_tokencreate_refresh_tokendecode_token)
UserCreate)get_settings)ERR_EMAIL_REGISTEREDERR_INVALID_CREDENTIALSERR_INVALID_TOKENERR_REFRESH_TOKEN%ERR_ONLY_SUPERADMIN_CAN_CREATE_ADMINSc            	           e Zd ZdZededefd       Zededede	defd       Z
ed	edefd
       Zed	edefd       Zededefd       Zedededefd       Zy)AuthServicez2Service exposing auth-related business operations.datasessionc                 l   t        j                  || j                        }|rt        t        j
                  t              t        | j                  | j                  | j                  t        | j                        | j                  t        j                        }t        j                  ||      }ddiS )z-Create a new standard user and return tokens.status_codedetailemail
first_name	last_namehashed_passwordphonerolemessagezUser successfully created)r   get_by_emailr$   r   r   HTTP_400_BAD_REQUESTr   r
   r%   r&   r   passwordr(   r   USERScreate)r   r   existingusers       K/var/www/html/story-book/Story-Book-python-api/app/services/auth_service.pysignupzAuthService.signup   s     "..w

CF,G,GPdee**nn)$--8**
 $$Wd3677    r$   r-   requestc           
         t        j                  ||       }|rt        ||j                        st	        t
        j                  t              t        j                  ||j                         t        |j                        }t        |j                  ||j                  j                  d      |j                   r|j                   j"                  nd t%        j&                  t(        j*                        t-        t.        j0                        z         }t        j2                  ||       t5        |j                  |j6                        }||ddS )	Nr    )subz
user-agent)daysuser_idrefresh_token
user_agent
ip_address
expires_atr7   
session_idbeareraccess_tokenr;   
token_type)r   r+   r   r'   r   r   HTTP_401_UNAUTHORIZEDr   r   cleanup_user_sessionsidr   r$   r   headersgetclienthostr   nowr   utcr   settingsREFRESH_TOKEN_EXPIRE_DAYSr/   r   r@   )r$   r-   r5   r   r1   r;   user_sessionrC   s           r2   loginzAuthService.login-   s    **7E:?8T5I5IJ"88. 
 	33GTWWE,<"GG'**<8.5nnw~~**$||HLL1I8CeCe4ff
 	$$Wl;*tzzlF]F]^ )*"
 	
r4   r;   c                 x   dt         dt         fd}t        |       }|j                  d      dk7  rt        t        j
                  t              t        j                  ||       }|sh|j                  d      }t        j                  ||      }|r t        j                  ||j                         t        t        j
                  t              t        j                  ||j                        }|j                  d      |j                   k7  rt        t        j
                  t               ||j"                        }t        j$                  t&        j(                        }||z
  }	|	j+                         dk  rt        t        j
                  t              t-        |j                   |		      }
t        j.                  |||

       t1        |j                  |
|j2                  |j4                  |j"                        }t        j6                  ||       t9        |j                   |j:                        }||
ddS )Ndtreturnc                     | j                    | j                  t        j                        S | j	                  t        j                        S )N)tzinfo)rV   replacer   rM   
astimezone)rS   s    r2   ensure_utc_awarez3AuthService.refresh_token.<locals>.ensure_utc_awareN   s4    yy zzz66==..r4   typerefreshr    r7   r   )r7   expires_delta)replaced_by_tokenr9   r?   rA   rB   )r   r   rI   r   r   rE   r   r   get_by_refresh_tokenr   r+   revoke_all_for_userrG   r   	get_by_idr:   r$   r>   rL   r   rM   total_secondsr   revoker   r<   r=   r/   r   r@   )r;   r   rY   payloadrP   r7   r1   r>   rL   remaining_ttlnew_refreshnew_session
new_accesss                r2   r;   zAuthService.refresh_tokenL   s   	/ 	/h 	/ }-;;v)+"88(  -AA'=Y++e$C!..w<D%99'477K"88(  ''1E1EF;;u+F,H,HQbcc%l&=&=>
ll8<<("S(&&(A-F,H,HQbcc*tzzW$$WlkZ!GG%#..#..#..
 	$$Wk:(

"--


 '("
 	
r4   c                 f    t        j                  ||       }|rt        j                  ||       ddiS )Nr*   zLogged out successfully)r   r^   rb   )r;   r   rP   s      r2   logoutzAuthService.logout   s3    ,AA'=Y!((,?455r4   r1   c                 J    t        j                  || j                         ddiS )Nr*   zLogged out from all devices)r   r_   rG   )r1   r   s     r2   
logout_allzAuthService.logout_all   s"    11'477C899r4   current_superc                    |j                   t        j                  k7  rt        t        j
                  t              t        j                  || j                        }|rt        t        j                  t              t        | j                  | j                  | j                  t        | j                         | j"                  t        j$                        }t        j&                  ||      }|S )z
        SUPERADMIN-only: create an ADMIN user.
        'current_super' param is passed from dependency checks in routes.
        r    r#   )r)   r   
SUPERADMINr   r   HTTP_403_FORBIDDENr   r   r+   r$   r,   r   r
   r%   r&   r   r-   r(   ADMINr/   )r   r   rl   r0   admins        r2   register_adminzAuthService.register_admin   s     0F,E,ENstt!..w

CF,G,GPdee**nn)$--8**
 %%gu5r4   N)__name__
__module____qualname____doc__staticmethodr   r	   r3   strr   rQ   r;   ri   r
   rk   rr    r4   r2   r   r      s    <8Z 8' 8 8$ 
S 
C 
' 
G 
 
< 4
S 4
7 4
 4
l 6c 6G 6 6 : : : : Z ' $  r4   r   N)%r   r   r   fastapir   r   r   sqlmodelr	   app.models.userr
   r   app.models.user_sessionr   app.repositories.user_repor   "app.repositories.user_session_repor   app.core.securityr   r   app.utils.tokensr   r   r   app.schemas.userr   app.core.configr   app.core.constantsr   r   r   r   r   rN   r   ry   r4   r2   <module>r      sN    2 2 2 2  & / 5 D < T T ' (  >P Pr4   