Ë
    ”bjÖ   ã                  ó  — d Z ddlmZ ddlZddlZddlmZmZmZm	Z	 ddl
mZ ddlmZmZmZmZmZ ddlmZmZmZmZ ddlmZmZmZmZ dd	lmZ dd
lmZ  ee «      Z! eddg¬«      Z"dd„Z# G d„ de«      Z$ G d„ de«      Z%e"jM                  d«      d„ «       Z'e"jM                  d«      dd„«       Z(e"jM                  d«      d d„«       Z)e"jM                  de¬«      d!d„«       Z*e"jW                  de¬«       ee«      fd"d„«       Z,y)#uP  
routes/auth.py
POST /api/auth/captcha/challenge        â€” generate math CAPTCHA
POST /api/auth/captcha/refresh          â€” get a fresh challenge
POST /api/auth/captcha/verify           â€” verify answer
POST /api/auth/login                    â€” access key â†’ JWT
GET  /api/auth/me                       â€” current candidate info
é    )ÚannotationsN)Ú	APIRouterÚDependsÚHTTPExceptionÚstatus)Ú	BaseModel)ÚLoginRequestÚLoginResponseÚCandidateOutÚCaptchaVerifyResponseÚSuccessResponse)Úvalidate_access_keyÚcreate_tokenÚget_redirect_urlÚget_stage_name)Úcreate_challengeÚrefresh_challengeÚverify_challengeÚvalidate_captcha_token)Úget_current_candidate)Ú
get_loggerz	/api/authÚauth)ÚprefixÚtagsc                óD   — t        j                  | xs i dt        d¬«      S )z¨Return a pretty-printed JSON string safe for logging.
    ensure_ascii=False so non-Latin scripts (Hindi etc.) print
    readably instead of as \uXXXX escape sequences.é   F)ÚindentÚdefaultÚensure_ascii)ÚjsonÚdumpsÚstr©Údatas    úf/Users/priyanka/Documents/AI_Agent_Assessment/pepole_hub_candidate/people_hub_candidate/routes/auth.pyÚ_prettyr&   &   s   € ô �:‰:�d’j˜b¨´CÀeÔLÐLó    c                  ó"   — e Zd ZU ded<   ded<   y)ÚCaptchaVerifyRequestr"   Ú
session_idÚanswerN©Ú__name__Ú
__module__Ú__qualname__Ú__annotations__© r'   r%   r)   r)   /   s   … ØƒOØ„Kr'   r)   c                  ó   — e Zd ZU ded<   y)ÚCaptchaRefreshRequestr"   r*   Nr,   r1   r'   r%   r3   r3   4   s   … Ø„Or'   r3   z/captcha/challengec                 ó‚   — t         j                  d«       t        «       } t         j                  dt        | «      «       | S )zDGenerate a fresh math CAPTCHA challenge. Always called on page load.u=   POST /api/auth/captcha/challenge â†’ generating new challengeu!   captcha/challenge response â†’
%s)ÚlogÚinfor   r&   )Úresults    r%   Úcaptcha_challenger8   :   s1   € ô ‡H�HÐLÔMÜÓ€FÜ‡H�HÐ1´7¸6³?ÔCØ€Mr'   z/captcha/refreshc                óÈ   — t         j                  dt        | j                  «       «      «       t	        | j
                  «      }t         j                  dt        |«      «       |S )z6Invalidate the current challenge and return a new one.u%   POST /api/auth/captcha/refresh â†’
%su   captcha/refresh response â†’
%s)r5   r6   r&   Ú
model_dumpr   r*   ©Úbodyr7   s     r%   Úcaptcha_refreshr=   C   sE   € ô ‡H�HÐ5´w¸t¿¹Ó?PÓ7QÔRÜ˜tŸ™Ó/€FÜ‡H�HÐ/´¸³ÔAØ€Mr'   z/captcha/verifyc           	     ó  — t         j                  dt        | j                  «       «      «       t	        | j
                  | j                  «      }t         j                  dt        t        |t        «      r|n|j                  «       «      «       |S )z#Verify the candidate's math answer.u$   POST /api/auth/captcha/verify â†’
%su   captcha/verify response â†’
%s)	r5   r6   r&   r:   r   r*   r+   Ú
isinstanceÚdictr;   s     r%   Úcaptcha_verifyrA   L   sg   € ô ‡H�HÐ4´g¸d¿o¹oÓ>OÓ6PÔQÜ˜dŸo™o¨t¯{©{Ó;€FÜ‡H�HÐ.´Ü˜V¤TÔ*‰°×0AÑ0AÓ0Có1ô ð €Mr'   z/login)Úresponse_modelc                óˆ  — t         j                  dt        | j                  «       «      «       | j                  ret        | j                  «      s;t         j                  d| j                  «       t        t        j                  d¬«      ‚t         j                  d«       	 t        | j                  «      }|s;t         j                  d	| j                  «       t        t        j"                  d
¬«      ‚t         j                  dt        |j%                  d«      |j%                  d«      |j%                  d«      |j%                  d«      |j%                  d«      dœ«      «       t'        |j%                  d«      xs d«      }t)        |d   |d   |«      }t+        |«      }t-        |«      }t         j                  d|||«       t/        |dt1        t3        |j%                  dd«      «      t3        |j%                  d«      xs d«      t3        |j%                  d«      xs d«      t3        |j%                  d«      xs d«      t5        |j%                  d«      xs g «      t3        |j%                  d«      xs d«      |j%                  d«      |j%                  d«      |t3        |j%                  d«      xs d«      ¬«
      ||¬«      }t         j                  dt        |j                  «       «      «       |S # t        j                  t        f$ r6}t         j                  d|«       t        t        j                   d¬«      ‚d}~ww xY w)uº  
    Validate access key + captcha token â†’ return JWT + redirect URL.

    Flow:
      1. (Optional) verify CAPTCHA token.
      2. Look up `participant` row in PostgreSQL by UPPER(access_key).
      3. Mint JWT carrying { sub: candidate_id, name, stage }.
      4. Compute redirect URL from current_stage:
            1 â†’ /people_hub_assessment
            2 â†’ /people_hub_role_play
            3 â†’ /people_hub_coding_assessment
    u   POST /api/auth/login â†’
%sz.login: CAPTCHA token invalid for access_key=%rz<CAPTCHA verification failed or expired. Please verify again.)Ústatus_codeÚdetailzlogin: CAPTCHA token OKu   login: DB error â†’ %szLAuthentication service is temporarily unavailable. Please try again shortly.Nz+login: no candidate found for access_key=%rz7Invalid or expired access key. Please check your email.u   login: candidate found â†’
%sÚidÚnameÚemailÚcurrent_stageÚ
access_key)rF   rG   rH   rI   rJ   é   u:   login: JWT minted â†’ stage=%d  redirect=%r  stage_name=%rÚbearerÚ Ú	CandidateÚphoneÚ	skill_setÚposition_appliedÚ
last_loginÚlast_question_attempt)
rF   rG   rH   rO   rP   rQ   rR   rS   rI   rJ   )ÚtokenÚ
token_typeÚ	candidateÚredirect_urlÚ
stage_nameu   login: response â†’
%s)r5   r6   r&   r:   Úcaptcha_tokenr   ÚwarningrJ   r   r   ÚHTTP_400_BAD_REQUESTr   Úpsycopg2ÚErrorÚRuntimeErrorÚ	exceptionÚHTTP_503_SERVICE_UNAVAILABLEÚHTTP_401_UNAUTHORIZEDÚgetÚintr   r   r   r
   r   r"   Úlist)r<   rV   ÚexcÚstagerT   ÚredirectrX   Úresponses           r%   Úloginri   Y   s©  € ô ‡H�HÐ+¬W°T·_±_Ó5FÓ-GÔHð ×ÒÜ% d×&8Ñ&8Ô9Ü�K‰KÐHÈ$Ï/É/ÔZÜÜ"×7Ñ7ØUôð ô 	�‰Ð*Ô+ð
Ü'¨¯©Ó8ˆ	ñ Ü�‰ÐAÀ4Ç?Á?ÔSÜÜ×4Ñ4ØLô
ð 	
ô
 ‡H�HÐ-¬wØ"Ÿ™ tÓ,Ø"Ÿ™ vÓ.Ø"Ÿ™ wÓ/Ø"Ÿ™ Ó7Ø"Ÿ™ |Ó4ñ8ó 0ô ô �	—‘˜oÓ.Ò3°!Ó4€EÜ˜ 4™¨)°FÑ*;¸UÓC€Eä Ó&€HÜ Ó&€Jä‡H�HÐIØ�H˜jô*ô ØØÜÜ�9—=‘=  rÓ*Ó+Ü�Y—]‘] 6Ó*Ò9¨kÓ:Ü�i—m‘m GÓ,Ò2°Ó3Ü�i—m‘m GÓ,Ò2°Ó3Ü˜9Ÿ=™=¨Ó5Ò;¸Ó<Ü  §¡Ð/AÓ!BÒ!HÀbÓIØ —}‘} \Ó2Ø"+§-¡-Ð0GÓ"HØÜ˜9Ÿ=™=¨Ó6Ò<¸"Ó=ô
ð Øô!€Hô& ‡H�HÐ&¬°×0CÑ0CÓ0EÓ(FÔGØ€Oøôk �N‰NœLÐ)ò 
Ü�‰Ð.°Ô4ÜÜ×;Ñ;Øaô
ð 	
ûð
ús   Â K2 Ë2MÌ1L<Ì<Mz/mec           
     óV  — t         j                  dt        | j                  d«      | j                  d«      | j                  d«      dœ«      «       | j	                  «       D ��ci c]  \  }}|dk7  sŒ||“Œ }}}t         j                  dt        |«      «       t        |¬«      S c c}}w )	z‰
    Return current candidate profile (used by HTML pages to populate
    the toolbar with the candidate name, current stage, etc.).
    u   GET /api/auth/me â†’
%srF   rG   rI   )rF   rG   rI   Ú_rawu   me: response â†’
%sr#   )r5   r6   r&   rb   Úitemsr   )rV   ÚkÚvÚsafes       r%   Úmerp   °   s“   € ô ‡H�HÐ'¬Ø"Ÿ™ tÓ,Ø"Ÿ™ vÓ.Ø"Ÿ™ Ó7ñ2ó *ô ð 'Ÿ_™_Ô.Ô>Ñ.‘T�Q˜°!°v³+ˆAˆq‰DÐ.€DÑ>Ü‡H�HÐ#¤W¨T£]Ô3Ü Ô%Ð%ùó ?s   Á$B%Á2B%)r$   zdict | NoneÚreturnr"   )r<   r3   )r<   r)   )r<   r	   )rV   r@   )-Ú__doc__Ú
__future__r   r    r\   Úfastapir   r   r   r   Úpydanticr   Úmodels.schemasr	   r
   r   r   r   Úservices.auth_servicer   r   r   r   Úservices.captcha_servicer   r   r   r   Úmiddleware.auth_middlewarer   Úutils.loggerr   r-   r5   Úrouterr&   r)   r3   Úpostr8   r=   rA   ri   rb   rp   r1   r'   r%   Ú<module>r}      s"  ðñõ #ã Û ß =Ó =Ý ÷õ ÷ó ÷ó õ =Ý #á�Ó€á	˜+¨V¨HÔ	5€ó
Mô˜9ô ô
˜Iô ð ‡�Ð!Ó"ñó #ðð ‡�ÐÓ òó !ðð ‡�ÐÓòó  ðð ‡�ˆX m€Ó4òQó 5ðQðl ‡�ˆE /€Ó2Ù Ð!6Ó7ó &ó 3ñ&r'   