o
    B~ÉgË  ã                   @   s<  d dl mZ d dlmZ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 d dl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ej› ddZe e¡Z defdd„Z!ee!ƒeeƒfdede"defdd„Z#defdd„Z$ee!ƒfdededefdd„Z%ee#ƒfdedefdd„Z&dS )é    )Ú	Generator)ÚDependsÚHTTPExceptionÚstatusÚ	WebSocket)ÚOAuth2PasswordBearer)Újwt)ÚValidationError)ÚSessionN)Úsettings)ÚSessionLocal)ÚUser)ÚTokenPayload)ÚUserService)ÚMediaServicez/login/access-token)ÚtokenUrlÚreturnc                  c   s(    t ƒ } z
| V  W |  ¡  d S |  ¡  w )N)r   Úclose)Údb© r   ú/app/app/api/deps.pyÚget_db   s
   €r   r   Útokenc              	   C   sv   zt j|tjdgd}td
i |¤Ž}W n t jtfy'   ttj	dddid‚w t
j| |jd}|s9ttjdd	‚|S )NÚHS256©Z
algorithmsúNot authenticatedzWWW-AuthenticateÚBearer)Ústatus_codeÚdetailÚheaders©Úuser_idúUser not found©r   r   r   )r   Údecoder   Ú
SECRET_KEYr   ZJWTErrorr	   r   r   ÚHTTP_401_UNAUTHORIZEDr   Úget_userÚsubÚHTTP_404_NOT_FOUND)r   r   ÚpayloadÚ
token_dataÚuserr   r   r   Úget_current_user   s"   ýÿþr-   c                  C   s    t j} t j}t j}t j}t d| › d|› ¡ |r't|ƒdkr'|dd… d nd}|r9t|ƒdkr9d|dd…  nd}t d|› d|› ¡ t	| |||d	}|S )
u°   
    AWS S3 ë˜ëŠ” MinIO í˜¸í™˜ ìŠ¤í† ë¦¬ì§€ë¥¼ ìœ„í•œ MediaServiceë¥¼ ìƒì„±í•©ë‹ˆë‹¤.
    í™˜ê²½ ë³€ìˆ˜ì— ì„¤ì •ëœ ê°’ë“¤ì„ ê¸°ë°˜ìœ¼ë¡œ ì„œë¹„ìŠ¤ë¥¼ êµ¬ì„±í•©ë‹ˆë‹¤.
    z)Initializing MediaService with endpoint: z
, bucket: é   Nz****éüÿÿÿzUsing credentials: z / )Zs3_endpoint_urlZbucket_nameÚ
access_keyÚ
secret_key)
r   ZAWS_S3_ENDPOINT_URLZAWS_S3_BUCKETZAWS_ACCESS_KEY_IDZAWS_SECRET_ACCESS_KEYÚloggerÚinfoÚlenÚdebugr   )Zs3_endpointZbucketr0   r1   Zmasked_access_keyZmasked_secret_keyZmedia_servicer   r   r   Úget_media_service3   s   $$ür6   Ú	websocketc              
   Ã   s
  zë| j  d¡}t d|› ¡ |s't d¡ | jddI dH  ttjdd‚zEt d	t	j
dd
… › d¡ tj|t	j
dgd}t d|› ¡ tdi |¤Ž}| d¡}ddlm} | ¡  ¡ }t d|› d|› ¡ W n+ ty— } zt dt|ƒ› ¡ | jddI dH  ttjdt|ƒ› d‚d}~ww zt|jƒ}	W n  ty¿   t d|j› ¡ | jddI dH  ttjdd‚w tj||	d}
|
sát d|	› ¡ | jddI dH  ttjdd‚t d|
j› ¡ |
W S  ty } zt dt|ƒ› ¡ ‚ d}~ww )z¢
    Dependency for user authentication in WebSocket connections.
    Reads the token from query parameters, validates the JWT, and returns user information.
    r   z*[DEBUG] Received token for WS connection: z#No token provided for WS connectionið  )ÚcodeNr   r#   z([DEBUG] Decoding token with SECRET_KEY: é   z...r   r   z$[DEBUG] Token decoded successfully: Úexpr   )Údatetimez[DEBUG] JWT exp value: z, current timestamp: zToken validation error: z Could not validate credentials: zInvalid user id in token: zInvalid user idr    zUser not found for id: r"   z'WS authentication successful for user: z)Unexpected error in get_current_ws_user: r   )Úquery_paramsÚgetr2   r3   Úwarningr   r   r   ÚHTTP_403_FORBIDDENr   r%   r   r$   r   r;   ÚnowÚ	timestampÚ	ExceptionÚerrorÚstrÚintr(   Ú
ValueErrorr   r'   r)   Úid)r7   r   r   r*   r+   r:   r;   Z
current_tsÚer!   r,   r   r   r   Úget_current_ws_userN   st   €
þý
þ€ý	þýþ€þrI   Úcurrent_userc                 C   s   | j s
ttjdd‚| S )u–   
    í˜„ìž¬ ë¡œê·¸ì¸í•œ ì‚¬ìš©ìžê°€ ê´€ë¦¬ìžì¸ì§€ í™•ì¸í•©ë‹ˆë‹¤.
    ê´€ë¦¬ìžê°€ ì•„ë‹Œ ê²½ìš° 403 Forbidden ì˜¤ë¥˜ë¥¼ ë°œìƒì‹œí‚µë‹ˆë‹¤.
    z'This endpoint requires admin privilegesr#   )Zis_adminr   r   r?   )rJ   r   r   r   Úget_current_admin_user“   s   þrK   )'Útypingr   Úfastapir   r   r   r   Zfastapi.securityr   Zjoser   Úpydanticr	   Úsqlalchemy.ormr
   ÚloggingÚapp.core.configr   Úapp.db.sessionr   Úapp.models.userr   Zapp.schemas.tokenr   Zapp.services.user_servicer   Zapp.services.media_servicer   Ú
API_V1_STRZreusable_oauth2Ú	getLoggerÚ__name__r2   r   rD   r-   r6   rI   rK   r   r   r   r   Ú<module>   sT   
ÿ
þÿþ
ýþÿþ
ýFÿÿþ