Ë
    � Dj^  ã                   ó*  — d 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
mZmZ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mZmZm Z   e«       Z! ee"«      Z# G d„ de«      Z$e!jK                  ded¬«       ee«      fde dedefd„«       Z&e!jK                  de¬«       ee«      fdededefd„«       Z'e!jK                  de¬«       ee«      fdededefd„«       Z(e!jS                  de¬«       ee«      fdedefd„«       Z*y)u¥  
Customer authentication endpoints for the SaaS web application.

POST /auth/register  â€” create a new customer account
POST /auth/login      â€” exchange email+password for access+refresh tokens
POST /auth/refresh    â€” exchange a refresh token for a new access token
GET  /auth/me         â€” return the logged-in customer's profile

This is intentionally a self-contained, minimal auth flow (no OAuth/SSO,
no email verification flow implemented yet â€” is_verified exists as a
field for a future email-confirmation feature but isn't enforced at
login). That scope was confirmed with the project coordinator as
sufficient for initial SaaS launch; see docs/architecture.md.
é    )Údatetime)Ú	APIRouterÚDepends)Úselect)ÚAsyncSession)ÚACCESS_TOKEN_EXPIRE_MINUTESÚcreate_access_tokenÚcreate_refresh_tokenÚdecode_tokenÚhash_passwordÚverify_password)Úget_current_user)ÚAppExceptionÚAuthenticationError)Ú
get_logger)ÚUser)Úget_db_session)ÚRefreshTokenRequestÚTokenResponseÚUserLoginRequestÚUserProfileResponseÚUserRegisterRequestc                   ó   — e Zd ZdZdZy)ÚEmailAlreadyRegisteredErrori™  ÚEMAIL_ALREADY_REGISTEREDN)Ú__name__Ú
__module__Ú__qualname__Ústatus_codeÚ
error_code© ó    úFC:\Crop_Prediction\Backend\crop-ai-system\app\api\v1\endpoints\auth.pyr   r   /   s   „ Ø€KØ+�Jr"   r   z/auth/registeréÉ   )Úresponse_modelr   ÚpayloadÚdbÚreturnc              ƒ   óô  K  — |j                  t        t        «      j                  t        j                  | j                  j                  «       k(  «      «      ƒ d {  –—† }|j                  «       �t        d¬«      ‚t        | j                  j                  «       t        | j                  «      | j                  | j                  ¬«      }|j                  |«       |j                  «       ƒ d {  –—†  |j                  «       ƒ d {  –—†  t        j!                  d|j"                  › �«       t%        t'        |j"                  |j                  «      t)        |j"                  «      t*        ¬«      S 7 �Œ7 Œ„7 Œn­w)NzBAn account with this email already exists. Try logging in instead.©Úmessage)ÚemailÚhashed_passwordÚ	full_nameÚorganizationzNew user registered: user_id=©Úaccess_tokenÚrefresh_tokenÚexpires_in_minutes)Úexecuter   r   Úwherer,   ÚlowerÚscalar_one_or_noner   r   Úpasswordr.   r/   ÚaddÚflushÚcommitÚloggerÚinfoÚidr   r	   r
   r   )r&   r'   ÚexistingÚusers       r#   ÚregisterrA   4   s  è ø€ ð
 —Z‘Z¤¤t£× 2Ñ 2´4·:±:ÀÇÁ×ATÑATÓAVÑ3VÓ WÓX×X€HØ×"Ñ"Ó$Ð0Ü)ØXô
ð 	
ô Ø�m‰m×!Ñ!Ó#Ü% g×&6Ñ&6Ó7Ø×#Ñ#Ø×)Ñ)ô	€Dð ‡F�Fˆ4„LØ
�(‰(‹*×ÐØ
�)‰)‹+×Ðä
‡K�KÐ/°·±¨yÐ9Ô:äÜ(¨¯©°$·*±*Ó=Ü*¨4¯7©7Ó3Ü6ôð ð% Yùð øØús8   ‚AE8ÁE1ÁBE8Ã/E4Ã0E8ÄE6ÄA*E8Å4E8Å6E8z/auth/login)r%   c              ƒ   ób  K  — |j                  t        t        «      j                  t        j                  | j                  j                  «       k(  «      «      ƒ d {  –—† }|j                  «       }|� t        | j                  |j                  «      st        d¬«      ‚|j                  st        d¬«      ‚t        j                  «       |_        |j                  «       ƒ d {  –—†  t!        t#        |j$                  |j                  «      t'        |j$                  «      t(        ¬«      S 7 ŒÎ7 ŒI­w)NzIncorrect email or passwordr*   z3This account has been deactivated. Contact support.r0   )r4   r   r   r5   r,   r6   r7   r   r8   r-   r   Ú	is_activer   ÚutcnowÚlast_login_atr;   r   r	   r>   r
   r   )r&   r'   Úresultr@   s       r#   ÚloginrG   R   sá   è ø€ ð
 —:‘:œf¤T›l×0Ñ0´·±¸w¿}¹}×?RÑ?RÓ?TÑ1TÓUÓV×V€FØ×$Ñ$Ó&€Dð €|œ?¨7×+;Ñ+;¸T×=QÑ=QÔRÜ!Ð*GÔHÐHà�>Š>Ü!Ð*_Ô`Ð`ô "Ÿ™Ó*€DÔØ
�)‰)‹+×ÐäÜ(¨¯©°$·*±*Ó=Ü*¨4¯7©7Ó3Ü6ôð ð Wøð ús&   ‚AD/ÁD+ÁBD/Ã#D-Ã$AD/Ä-D/z/auth/refreshc              ƒ   óÄ  K  — t        | j                  d¬«      }|j                  d«      }|j                  t	        t
        «      j                  t
        j                  |k(  «      «      ƒ d {  –—† }|j                  «       }|�|j                  st        d¬«      ‚t        t        |j                  |j                  «      t        |j                  «      t        ¬«      S 7 Œq­w)NÚrefresh)Úexpected_typeÚsubz-Account no longer valid. Please log in again.r*   r0   )r   r2   Úgetr4   r   r   r5   r>   r7   rC   r   r   r	   r,   r
   r   )r&   r'   ÚdecodedÚuser_idrF   r@   s         r#   r2   r2   m   sª   è ø€ ô
 ˜7×0Ñ0À	ÔJ€GØ�k‰k˜%Ó €Gà—:‘:œf¤T›l×0Ñ0´·±¸GÑ1CÓDÓE×E€FØ×$Ñ$Ó&€Dà€|˜4Ÿ>š>Ü!Ð*YÔZÐZäÜ(¨¯©°$·*±*Ó=Ü*¨4¯7©7Ó3Ü6ôð ð Fús   ‚A*C Á,CÁ-A2C z/auth/meÚcurrent_userc           	   ƒ   óÀ   K  — t        | j                  | j                  | j                  | j                  | j
                  | j                  j                  «       ¬«      S ­w)N)r>   r,   r.   r/   Úis_verifiedÚ
created_at)r   r>   r,   r.   r/   rQ   rR   Ú	isoformat)rO   s    r#   Úget_profilerT   ‚   sP   è ø€ äØ�?‰?Ø× Ñ Ø×(Ñ(Ø!×.Ñ.Ø ×,Ñ,Ø×*Ñ*×4Ñ4Ó6ôð ùs   ‚AAN)+Ú__doc__r   Úfastapir   r   Ú
sqlalchemyr   Úsqlalchemy.ext.asyncior   Úapp.core.auth_tokensr   r	   r
   r   r   r   Úapp.core.current_userr   Úapp.core.exceptionsr   r   Úapp.core.logging_configr   Úapp.db.modelsr   Úapp.db.sessionr   Úapp.schemas.authr   r   r   r   r   Úrouterr   r<   r   ÚpostrA   rG   r2   rL   rT   r!   r"   r#   ú<module>rb      si  ðñõ ç &Ý Ý /÷÷ õ 3ß AÝ .Ý Ý )÷õ ñ 
‹€Ù	�HÓ	€ô, ,ô ,ð
 ‡�Ð¨mÈ€ÓMñ ˜~Ó.ñØ ðàðð òó Nðð: ‡�ˆ]¨=€Ó9ñ ˜~Ó.ñØðàðð òó :ðð4 ‡�ˆ_¨]€Ó;ñ ˜~Ó.ñØ ðàðð òó <ðð( ‡�ˆJÐ':€Ó;Ù+2Ð3CÓ+Dñ  Dð ÐI\ò ó <ñr"   