Ë
    ªÑðiÕ  ã                  ó
  — d Z ddlmZ ddlmZmZ ddlmZ ddlmZm	Z	 ddl
mZmZ ddl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 ddlmZ  ee«      Z edg¬«      Zej?                  de¬«       e	e«      f	 	 	 dd„«       Z ejC                  de¬«       e	e«      fdd„«       Z" G d„ de«      Z#d d„Z$ej?                  d«      d!d„«       Z%ejC                  de¬«      d"d„«       Z&ejC                  de¬«      d#d$d„«       Z'y)%uÖ  
routes/fraud.py â€” Fraud Detection
POST /api/fraud/event              â€” log a fraud event (JWT-authed candidate)
POST /api/fraud/event-by-key       â€” log a fraud event keyed by access_key
                                     (new external-login flow)
GET  /api/fraud/report             â€” fraud report for the authenticated candidate
GET  /api/fraud/report-by-key/{k}  â€” fraud report by access_key
GET  /api/admin/fraud/all          â€” admin: all fraud events
é    )Úannotations)ÚdatetimeÚtimezone)ÚAny)Ú	APIRouterÚDepends)Ú	BaseModelÚField)Úsettings)ÚFraudEventRequestÚFraudEventResponseÚSuccessResponse)Úfraud_service)Úget_current_candidate)Újson_db)Ú
get_loggerÚfraud)Útagsz/api/fraud/event)Úresponse_modelc           
   ƒ  ó8  K  — |j                  d«      xs |j                  d«      xs d}t        j                  |d   | j                  | j                  | j
                  | j                  i | j                  xs i ¥d|i¥¬«      ƒ d{  –—† }t        di |¤ŽS 7 Œ­w)z6Log a fraud event for the JWT-authenticated candidate.Ú
access_keyÚidÚ ©Úcandidate_idÚ
event_typeÚmessageÚ	timestampÚ	round_numÚmetadataN© )	Úgetr   Ú	log_eventr   r   r   Úroundr    r   )ÚbodyÚ	candidater   Úresults       úg/Users/priyanka/Documents/AI_Agent_Assessment/pepole_hub_candidate/people_hub_candidate/routes/fraud.pyÚlog_fraud_eventr)      sŽ   è ø€ ð —‘˜|Ó,ÒI°	·±¸dÓ0CÒIÀr€JÜ ×*Ñ*Ø˜t‘_Ø—?‘?Ø—‘Ø—.‘.Ø—*‘*ØD�T—]‘]Ò( bÐD¨<¸ÑDô÷ €Fô Ñ' Ñ'Ð'ðús   ‚BBÂBÂ	Bz/api/fraud/reportc                óF   — t        t        j                  | d   «      ¬«      S )Nr   ©Údata)r   r   Ú
get_report)r&   s    r(   Úfraud_reportr.   1   s   € ä¤× 8Ñ 8¸À4¹Ó IÔJÐJó    c                  ód   — e Zd ZU  edd¬«      Zded<   dZded<   dZd	ed
<   dZded<   dZ	ded<   y)ÚFraudEventByKeyRequest.u)   TAB_SWITCH | PASTE | MULTIPLE_FACES | â€¦)ÚdescriptionÚstrr   r   r   Nú
str | Noner   é   Úintr$   zdict[str, Any] | Noner    )
Ú__name__Ú
__module__Ú__qualname__r
   r   Ú__annotations__r   r   r$   r    r!   r/   r(   r1   r1   8   s=   … Ù"'¨Ð9dÔ"e€J�ÓeØ"$€GˆSÓ$Ø"&€IˆzÓ&Ø"#€Eˆ3Ó#Ø&*€HÐ#Ô*r/   r1   c                 ód   — t        j                  t        j                  «      j	                  «       S )N)r   Únowr   ÚutcÚ	isoformatr!   r/   r(   Ú_now_isor?   @   s   € Ü�<‰<œŸ™Ó%×/Ñ/Ó1Ð1r/   z$/api/fraud/event-by-key/{access_key}c           
   ƒ  óv  K  — | xs dj                  «       }|sdddœS |j                  xs
 t        «       }t        j                  ||j
                  |j                  ||j                  i |j                  xs i ¥d|i¥¬«      ƒ d{  –—† }	 t        j                  t        j                  «      }|rT|d   }|j                  d	«      |k(  r;|j                  d«      s*t        j                  t        j                  |d
   d|i«       ddi|¥S 7 Œ„# t        $ r }t         j#                  d|«       Y d}~Œ,d}~ww xY w­w)u›  
    Log a fraud event keyed by access_key â€” for candidates authenticated
    via the external People Hub Login API (no local JWT).

    Per spec, every event written to fraud_log.json must carry:
      â€¢ access_key
      â€¢ event type
      â€¢ timestamp

    The fraud_service in-memory counters still drive `action` (none/warn/
    disqualify), keyed off the access_key as the candidate identifier.
    r   Fzaccess_key required)ÚokÚerrorr   r   Néÿÿÿÿr   r   z0post-write access_key tag failed (non-fatal): %srA   T)Ústripr   r?   r   r#   r   r   r$   r    ÚdbÚfind_allr   ÚFRAUD_LOG_FILEr"   ÚupdateÚ	ExceptionÚlogÚdebug)r   r%   ÚkeyÚtsr'   ÚeventsÚlastÚexcs           r(   Úlog_fraud_event_by_keyrQ   D   s  è ø€ ð Ò˜×
"Ñ
"Ó
$€CÙØÐ&;Ñ<Ð<à	�‰Ò	%œ8›:€BÜ ×*Ñ*ØØ—?‘?Ø—‘ØØ—*‘*Ø=�T—]‘]Ò( bÐ=¨<¸Ñ=ô÷ €FðKÜ—‘œX×4Ñ4Ó5ˆÙØ˜"‘:ˆDØ�x‰x˜Ó'¨3Ò.°t·x±xÀÔ7MÜ—	‘	œ(×1Ñ1°4¸±:ÀÈcÐ?RÔSð �$Ð!˜&Ð!Ð!ð+ùô$ ò KÜ�	‰	ÐDÀc×JÑJûðKüs=   ‚BD9ÂDÂD9ÂA9D ÄD9Ä	D6ÄD1Ä,D9Ä1D6Ä6D9z%/api/fraud/report-by-key/{access_key}c                ó„   — | xs dj                  «       }|st        i ¬«      S t        t        j                  |«      ¬«      S )Nr   r+   )rD   r   r   r-   )r   rL   s     r(   Úfraud_report_by_keyrS   o   s9   € àÒ˜×
"Ñ
"Ó
$€CÙÜ BÔ'Ð'Ü¤× 8Ñ 8¸Ó =Ô>Ð>r/   z/api/admin/fraud/allNc                ó   — |r&t        j                  t        j                  |¬«      }nK| r&t        j                  t        j                  | ¬«      }n#t        j                  t        j                  «      }t        |¬«      S )zƒ
    Admin: get all fraud events, optionally filtered by candidate_id or
    access_key. Protect with admin JWT in production.
    )r   )r   r+   )rE   Ú	find_manyr   rG   rF   r   )r   r   rN   s      r(   Úall_fraud_eventsrV   y   sU   € ñ Ü—‘œh×5Ñ5À*ÔM‰Ù	Ü—‘œh×5Ñ5ÀLÔQ‰ä—‘œX×4Ñ4Ó5ˆÜ Ô'Ð'r/   )r%   r   r&   Údict)r&   rW   )Úreturnr3   )r   r3   r%   r1   )r   r3   )NN)r   r4   r   r4   )(Ú__doc__Ú
__future__r   r   r   Útypingr   Úfastapir   r   Úpydanticr	   r
   Úconfigr   Úmodels.schemasr   r   r   Úservices.fraud_servicer   Úmiddleware.auth_middlewarer   Úutilsr   rE   Úutils.loggerr   r7   rJ   ÚrouterÚpostr)   r"   r.   r1   r?   rQ   rS   rV   r!   r/   r(   Ú<module>rf      s)  ðñõ #ç 'Ý ç &ß %å ß QÑ QÝ 0Ý <Ý Ý #á�Ó€Ù	˜˜	Ô	"€ð
 ‡�ÐÐ0B€ÓCñ Ð3Ó4ð(Ø
ð(àò(ó Dð(ð" ‡�Ð°€Ó@Ù#*Ð+@Ó#Aó Kó AðKô+˜Yô +ó2ð ‡�Ð3Ó4ò'"ó 5ð'"ðT ‡�Ð3ÀO€ÓTò?ó Uð?ð ‡�Ð"°?€ÓCó(ó Dñ(r/   