
    <i                       S SK Jr  S SKJr  S SKJrJr  S SKJr  S SK	J
r
JrJrJrJrJrJr  S SKJrJr  S SKJr  S SKJr  S S	KJr  S S
KJr  S SKJr  S SKJr   \
" S/S9r!Sr"\" \#5      RI                  5       RJ                  S   S-  r&\\\" \5      4   r' " S S\5      r(S+S jr)\!RU                  S5      S 5       r+\!RU                  S5      S,S j5       r,\!RU                  S5      S,S j5       r-\!RU                  S5      S,S j5       r.\!RU                  S5      S,S j5       r/\!RU                  S5      S,S  j5       r0\!RU                  S!5      S" 5       r1\!Re                  S#5      \" S$\"S%94       S-S& jj5       r3\!Re                  S'5      \" S$\"S%94   S.S( jj5       r4\!Re                  S)5      \" S$\"S%94   S.S* jj5       r5g$)/    )annotations)Path)	AnnotatedOptional)	urlencode)	APIRouterCookieDependsHTTPExceptionRequestResponsestatus)FileResponseRedirectResponse)	BaseModel)AsyncSession)settings)get_session)broadcast_room_snapshot)participantsjoin)tags
session_id   frontendc                  \    \ rS rSr% SrS\S'   SrS\S'   SrS\S'   SrS\S'   Sr	S\S'   S	r
g
)ParticipantJoinBody    strroom_idpoll_id
join_tokenline_user_iddisplay_name N)__name__
__module____qualname____firstlineno__r!   __annotations__r"   r#   r$   r%   __static_attributes__r&       FC:\Users\jasmi\Projects\line-hihaho-voting\backend\app\routers\join.pyr   r      s4    GSGSJL#L#r-   r   c                n    [         U -  nUR                  5       (       d  [        SSU  3S9e[        U5      $ )Ni  zmissing frontend file: status_codedetail)FRONTEND_DIRis_filer   r   )namepaths     r.   _frontend_file_or_404r7       s7    $D<<>>6MdV4TUUr-   z/joinc                     #    [        S5      $ 7f)Nz	join.html)r7   r&   r-   r.   	join_pager9   '   s      --s   z/hostc                v   #    U R                   R                  n[        SU(       a  SU 3-   5      $ S-   5      $ 7f)Nz/ui/host.html?r   urlqueryr   requestqs     r.   	host_pagerB   ,   s7     AO!1#wDEEDEE   79z/playerc                v   #    U R                   R                  n[        SU(       a  SU 3-   5      $ S-   5      $ 7f)Nz/ui/player.htmlr;   r   r<   r?   s     r.   player_pagerE   2   s8     A-A1QCFGG2FGGrC   z/displayc                v   #    U R                   R                  n[        SU(       a  SU 3-   5      $ S-   5      $ 7f)Nz/ui/display.htmlr;   r   r<   r?   s     r.   display_pagerG   8   s8     A.QAaS'GHHBGHHrC   z/voterc                v   #    U R                   R                  n[        SU(       a  SU 3-   5      $ S-   5      $ 7f)Nz/ui/voter.htmlr;   r   r<   r?   s     r.   
voter_pagerI   >   s8     A,1!A3EFF"EFFrC   z/branch-debugc                v   #    U R                   R                  n[        SU(       a  SU 3-   5      $ S-   5      $ 7f)Nz/ui/branch-debug.htmlr;   r   r<   r?   s     r.   branch_debug_pagerK   D   s8     A3!1#wLMMLMMrC   z/api/config/publicc                 L   #    [         R                  [         R                  S.$ 7f)N)default_room_idhihaho_player_url)r   line_default_room_idrN   r&   r-   r.   public_configrP   J   s#      $88%77 s   "$z/api/participants/joinN)defaultaliasc                |  #    U R                   R                  5       nU R                  R                  5       nS nU(       a.   [        R                  " X$5      I S h  vN u  pvUR                  nOU(       d
  [        SSS9e[        R                  " UUU R                  R                  5       U R                  R                  5       U R                  R                  5       (       a  SOSS9I S h  vN n[        R                  " UUUSS9I S h  vN n	UUR                  S	.n
U R                  R                  5       (       a  U R                  R                  5       U
S
'   S[!        U
5      -   nUR#                  5       I S h  vN   [%        UR                  5      I S h  vN   UR'                  [(        U	R*                  [,        R.                  SSS9  U	R*                  UR                  UR                  [1        U5      UUS.$  GN! [
         a&  n[        [        R                  [        U5      S9eS nAff = f GNG GN+ N N7f)Nr0   i  zroom_id is requiredjoin_page_linejoin_page_manual)r!   r$   r%   sourcer9   )participantexisting_session_idrV   )r!   voter_idr"   z/voter?Tlax)keyvaluemax_agehttponlysamesite)r   participant_idr!   join_token_used	voter_url
player_url)r#   stripr!   participants_svcconsume_join_token
ValueErrorr   r   HTTP_403_FORBIDDENr    get_or_create_participantr$   r%   create_or_reuse_sessionidr"   r   commitr   
set_cookieSESSION_COOKIE_NAMEr   r   audience_session_ttl_secondsbool)bodyresponsesessionr   r#   r!   rW   	token_recexcrecvoter_queryrb   s               r.   participant_joinrx   R   s     &&(Jll  "GK	X+;+N+Nw+c%c"I %%C8MNN,FF**002**002'+'8'8'>'>'@'@#FX
 
 !88&	 C NNK ||!%!3!3!5IIk22I
..

!+"5"5
666nn55   nn%..&&
+ Q &d 	XF,E,EcRUhWW	X
 6s   >H<G? G<G? !B
H<+H2,H<
H5A0H<;H8<H<H:A#H<<G? ?
H/	!H**H//H<5H<8H<:H<z#/api/participants/session/heartbeatc                   #    [         R                  " X5      I S h  vN nU R                  5       I S h  vN   U(       d  SSS.$ SUR                  UR                  UR
                  S.$  NM N77f)NFsession_not_found)okreasonT)r{   r   r`   r!   )re   get_session_recordrl   r   r`   r!   rs   r   rv   s      r.   participant_session_heartbeatr      sf     
 !33GH
HC
..
':;;nn,,;;	 	 Is   A.A*A.A,6A.,A.z$/api/participants/session/disconnectc                8  #    [         R                  " X5      I S h  vN nU R                  5       I S h  vN   U(       a  [        UR                  5      I S h  vN   [        U5      U(       a  UR                  OS U(       a  UR                  S.$ S S.$  Nw Na N?7f)N)r{   r   r!   )re   delete_session_recordrl   r   r!   rp   r   r~   s      r.   participant_session_disconnectr      s     
 !66wK
KC
..

%ckk2223i(+cnn"%3;;  ,0 	 L2s1   BBBB#BB<BBB)r5   r    returnr   )r@   r   )rq   r   rr   r   rs   
SessionDepr   Optional[str])rs   r   r   r   )6
__future__r   pathlibr   typingr   r   urllib.parser   fastapir   r	   r
   r   r   r   r   fastapi.responsesr   r   pydanticr   sqlmodel.ext.asyncio.sessionr   
app.configr   app.dbr   app.routers.wsr   app.servicesr   re   routerrn   __file__resolveparentsr3   r   r   r7   getr9   rB   rE   rG   rI   rK   rP   postrx   r   r   r&   r-   r.   <module>r      s$   "  & " X X X <  5   2 9		!" H~%%'//2Z?|W[%99:
)  G. . GF F
 IH H
 JI I
 HG G
 ON N
  ! " %&
 !'t;N O	;
;; ; 	; ';| 23 !'t;N O 4  34 !'t;N O 5r-   