a
    _i                     @  s  d dl m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mZmZmZmZ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 d dlmZ d dlmZ  e
dgdZ!dZ"ee#$ j%d d Z&eeeef Z'G dd deZ(dddddZ)e!*ddd Z+e!*ddddd Z,e!*d!ddd"d#Z-e!*d$ddd%d&Z.e!*d'ddd(d)Z/e!*d*ddd+d,Z0e!*d-d.d/ Z1e!2d0ed1e"d2fdd3d4d5d6d7d8Z3e!2d9ed1e"d2fd4d5d:d;d<Z4e!2d=ed1e"d2fd4d5d:d>d?Z5d1S )@    )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                   @  sJ   e Zd ZU 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< dS )	ParticipantJoinBody strroom_idpoll_id
join_tokenline_user_iddisplay_nameN)	__name__
__module____qualname__r   __annotations__r   r    r!   r"    r'   r'   FC:\Users\jasmi\Projects\line-hihaho-voting\backend\app\routers\join.pyr      s
   
r   r   r   )namereturnc                 C  s*   t |  }| s"tdd|  dt|S )Ni  zmissing frontend file: status_codedetail)FRONTEND_DIRis_filer
   r   )r)   pathr'   r'   r(   _frontend_file_or_404    s    r1   z/joinc                     s   t dS )Nz	join.html)r1   r'   r'   r'   r(   	join_page'   s    r2   z/hostr   )requestc                   s"   | j j}td|rd| nd S )Nz/ui/host.html?r   urlqueryr   r3   qr'   r'   r(   	host_page,   s    r:   z/playerc                   s"   | j j}td|rd| nd S )Nz/ui/player.htmlr4   r   r5   r8   r'   r'   r(   player_page2   s    r;   z/displayc                   s"   | j j}td|rd| nd S )Nz/ui/display.htmlr4   r   r5   r8   r'   r'   r(   display_page8   s    r<   z/voterc                   s"   | j j}td|rd| nd S )Nz/ui/voter.htmlr4   r   r5   r8   r'   r'   r(   
voter_page>   s    r=   z/branch-debugc                   s"   | j j}td|rd| nd S )Nz/ui/branch-debug.htmlr4   r   r5   r8   r'   r'   r(   branch_debug_pageD   s    r>   z/api/config/publicc                     s   t jt jdS )N)hihaho_player_urlZdefault_room_id)r   r?   line_default_room_idr'   r'   r'   r(   public_configJ   s    rA   z/api/participants/joinN)defaultaliasr   
SessionDepzOptional[str])bodyresponsesessionr   c              
     sT  | j  }| j }d }|rvzt||I d H \}}W n6 tyl } zttjt	|dW Y d }~n
d }~0 0 |j}nD|stdddtj
||| j | j | j rdnddI d H }tj|||ddI d H }	||jd	}
| j r| j |
d
< dt|
 }| I d H  t|jI d H  |jt|	jtjddd |	j|j|jt|||dS )Nr+   i  zroom_id is requiredZjoin_page_liffZjoin_page_manual)r   r!   r"   sourcer2   )participantZexisting_session_idrH   )r   voter_idr   z/voter?Tlax)keyvaluemax_agehttponlysamesite)r   participant_idr   Zjoin_token_used	voter_urlZ
player_url)r    stripr   participants_svcZconsume_join_token
ValueErrorr
   r   HTTP_403_FORBIDDENr   Zget_or_create_participantr!   r"   Zcreate_or_reuse_sessionidr   r   commitr   
set_cookieSESSION_COOKIE_NAMEr   r   audience_session_ttl_secondsbool)rE   rF   rG   r   r    r   rI   Z	token_recexcrecZvoter_queryrR   r'   r'   r(   participant_joinR   s\    

(
r_   z#/api/participants/session/heartbeat)rG   r   c                   sB   t | |I d H }|  I d H  |s.dddS d|j|j|jdS )NFZsession_not_found)okreasonT)r`   r   rQ   r   )rT   Zget_session_recordrX   r   rQ   r   rG   r   r^   r'   r'   r(   participant_session_heartbeat   s    
rc   z$/api/participants/session/disconnectc                   sX   t | |I d H }|  I d H  |r4t|jI d H  t||rD|jnd |rP|jnd dS )N)r`   r   r   )rT   Zdelete_session_recordrX   r   r   r\   r   rb   r'   r'   r(   participant_session_disconnect   s    rd   )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   Zapp.routers.wsr   app.servicesr   rT   routerrZ   __file__resolveparentsr.   rD   r   r1   getr2   r:   r;   r<   r=   r>   rA   postr_   rc   rd   r'   r'   r'   r(   <module>   sP   $


>

