o
    ^g]$                     @   sZ  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mZ d dlmZmZmZ d dlmZ d dlmZ d d	lZd d
lmZ d dlmZmZmZ d dlmZmZ e ZedefddZ ee g dZg dZ!ej"ee!ddgdgd G dd deZ#G dd deZ$G dd deZ%G dd deZ&G dd deZ'G dd  d eZ(G d!d" d"eZ)G d#d$ d$eZ*d%e+d&efd'd(Z,e-d)d*d+ Z.ej/d,e)d-d.e(fd/d0Z0ej/d1e'd-d2e&fd3d2Z1ej-d4e*d-d5efd6d7Z2ej/d8e$d-d9e#fd:d;Z3ej-d<ed-d%e+fd=d>Z4ej-d?ee5 d-d@dA Z6ej/d?dBdCdDe%fdEdFZ7d	S )G    )FastAPIHTTPExceptionDepends)CORSMiddleware)asynccontextmanager)PydanticObjectId)ListOptional)	BaseModelFieldEmailStr)UUID)DBRefNinit)UserBooth
ScanRecord)MissionStatus	BoothScanappc                 C  s   t  I d H  d V  d S )Nr   )r    r   %/home/ubuntu/booths_qr_events/main.pylifespan   s   
r   )r   
middleware)*z<http://ec2-3-36-108-191.ap-northeast-2.compute.amazonaws.comzAhttp://ec2-3-38-108-191.ap-northeast-2.compute.amazonaws.com:8000zAhttp://ec2-3-38-108-191.ap-northeast-2.compute.amazonaws.com:8001Tr   )allow_originsallow_credentialsallow_methodsallow_headersc                   @   s4   e Zd ZU eddddZeed< dZee	 ed< dS )ScanRequest.^\d{10,15}$Tpatternuniquephone_numberNbooth_id)
__name__
__module____qualname__r   r%   str__annotations__r&   r	   r   r   r   r   r   r    /   s   
 r    c                   @   s>   e Zd ZU eed< dZee ed< dZee ed< e	ed< dS )ScanResponsesuccessNmessagedetailmission_status)
r'   r(   r)   boolr+   r.   r	   r*   r/   r   r   r   r   r   r,   3   s
   
 r,   c                   @   s   e Zd ZU eed< eed< dS )BoothCreatenameqr_codeN)r'   r(   r)   r*   r+   r   r   r   r   r2   9      
 r2   c                   @   s   e Zd ZU eed< eed< dS )LoginRequestr3   emailN)r'   r(   r)   r*   r+   r   r   r   r   r   r6   =   r5   r6   c                   @   &   e Zd ZU eed< eed< eed< dS )LoginResponser.   user_idr%   Nr'   r(   r)   r*   r+   r   r   r   r   r   r9   A      
 r9   c                   @   sT   e Zd ZU eed< eed< dZee ed< dZee ed< e	dddd	Z
eed
< dS )RegisterRequestr3   r7   Ncompanyposition.r!   Tr"   r%   )r'   r(   r)   r*   r+   r   r>   r	   r?   r   r%   r   r   r   r   r=   F   s   
 r=   c                   @   r8   )RegisterResponser.   r:   r%   Nr;   r   r   r   r   r@   M   r<   r@   c                   @   sN   e Zd ZU eed< eed< eed< dZee ed< dZ	ee ed< eed< dS )UserResponseidr3   r7   Nr>   r?   r%   )
r'   r(   r)   r   r+   r*   r   r>   r	   r?   r   r   r   r   rA   R   s   
 rA   r%   returnc                    s8   t t j| kI d H }|st | d}| I d H  |S )N)r%   )r   find_oner%   insert)r%   userr   r   r   get_or_create_user\   s   
rG   /c                      s   dS )N   r   r   r   r   r   healthcheckd   s   rJ   z	/register)response_modelrF   c                    s   t t j| jkI d H }|rtdddt t j| jkI d H }|r)tdddt | j| j| j| j| jd}| I d H  t	d|j
|jdS )N  u$   이미 등록된 이메일입니다.status_coder/   u'   이미 등록된 전화번호입니다.)r3   r7   r>   r?   r%   u0   등록이 성공적으로 완료되었습니다.r.   r:   r%   )r   rD   r7   r   r%   r3   r>   r?   rE   r@   rB   )rF   existing_user_emailexisting_user_phonenew_userr   r   r   registeri   s    rS   z/loginloginc                    sT   t t j| jkI d H }|stddd|j| jkr!tdddtd|j|jdS )NrL   u'   등록되지 않은 이메일입니다.rM   u$   이름이 일치하지 않습니다.u3   로그인이 성공적으로 완료되었습니다.rO   )r   rD   r7   r   r3   r9   rB   r%   )rT   rF   r   r   r   rT      s   z/user/{user_id}r:   c                    sB   t | I d H }|stdddt|j|j|j|j|j|j	dS )NrL   u'   등록되지 않은 사용자입니다.rM   )rB   r3   r7   r>   r?   r%   )
r   getr   rA   rB   r3   r7   r>   r?   r%   )r:   rF   r   r   r   get_user_info   s   rV   z/scanscanc                    s  t | jI d H }| jst| jI d H }tdd|dS ttj| jkI d H }t| |s<t| jI d H }tdd|dS t	d|j}t	d|j}t
||d	I d H }t| |rlt| jI d H }t| tdd
|dS t
||d	}| I d H  t| jI d H }tdd|dS )NTu$   스캔 기록을 조회했습니다.)r-   r.   r0   Fu"   부스를 찾을 수 없습니다.)r-   r/   r0   usersbooths)r:   r&   zBooth already scannedzBooth scanned successfully)rG   r%   r&   get_mission_statusr,   r   rD   rB   printr   r   rE   )rW   rF   r0   boothuser_ref	booth_refexisting_scannew_scanr   r   r   scan_qr   sR   ra   z/mission/{phone_number}c           	   	      s   t d| stdddttj| kI d H }|s(tdt 	 I d H g dS t
| t 	 I d H }ttjj|jk I d H }t|}||k}g }|D ]}|j I d H }|rk|t|j|j|j|jd qPt|||dS )Nr!   rL   zInvalid phone number formatrM   F)achievedtotal_boothsscanned_booths)r&   r3   r4   
scanned_at)rematchr   r   rD   r%   r   r   findcountr[   r   r:   rB   to_listlenr&   fetchappendr   r3   r4   	timestamp)	r%   rF   rc   scan_records
user_scansrb   rd   recordr\   r   r   r   rZ      sB   	rZ   z/boothsc                     s"   t   I d H } dd | D S )Nc                 S   s"   g | ]}t |j|j|jd qS )rB   r3   r4   )r*   rB   r3   r4   ).0r\   r   r   r   
<listcomp>  s   " zget_booths.<locals>.<listcomp>)r   find_allrj   )rY   r   r   r   
get_booths  s   rv      )rN   r\   c                    s   t t j| jkI d H }|rtdddt t j| jkI d H }|r)tdddt | j| jd}| I d H  t|j|j|jdS )NrL   z$Booth with given name already existsrM   z'Booth with given QR code already exists)r3   r4   rr   )r   rD   r3   r   r4   rE   r*   rB   )r\   existing_booth_nameexisting_booth_qr	new_boothr   r   r   create_booth  s   r{   )8fastapir   r   r   fastapi.middleware.corsr   
contextlibr   beanier   typingr   r	   pydanticr
   r   r   uuidr   
bson.dbrefr   rf   databaser   modelsr   r   r   mission_modelsr   r   r   r   originsadd_middlewarer    r,   r2   r6   r9   r=   r@   rA   r*   rG   rU   rJ   postrS   rT   rV   ra   rZ   dictrv   r{   r   r   r   r   <module>   sb   		


<*
