
    zi
                        d Z ddlmZ ddl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mZ ddlmZ dd	lmZ  e	d
      Zdeedz   ee      f   dee ee      f   defdZee ee      f   Zee ee      f   Zy)u"  
FastAPI dependency injection 共用元件。

最常用的是 `get_current_user`:
任何需要登入才能存取的 endpoint,只要在參數加 `current_user: User = Depends(get_current_user)`
就會自動驗證 Authorization header 的 access token、查資料庫拿到使用者物件。
    )	Annotated)DependsHTTPExceptionstatus)HTTPAuthorizationCredentials
HTTPBearer)select)AsyncSession)
TokenErrordecode_token)get_db)UserF)
auto_errorcredentialsNdbreturnc                   K   | | j                   st        t        j                  dddi      	 t	        | j                   d      }t        t              j                  t        j                  |k(  t        j                  j                  d            }|j                  |       d{   }|j                         }|t        t        j                  dddi      |j                  st        t        j                   d	
      |S # t
        $ r-}t        t        j                  t        |      ddi      |d}~ww xY w7 w)u\  從 Authorization header 解出當前使用者。

    流程:
      1. 確認有帶 Bearer token
      2. 驗證並解析 token,拿到 user_id
      3. 從資料庫撈 User
      4. 確認帳號還在(沒被軟刪、沒被停用)
      5. 都 OK,回傳 User 物件

    任何一步失敗都丟 401 Unauthorized,前端應該導回登入頁。
    Nu   缺少授權 tokenzWWW-AuthenticateBearer)status_codedetailheadersaccess)expected_typeu   使用者不存在或已刪除u"   帳號已停用,請聯絡管理員)r   r   )r   r   r   HTTP_401_UNAUTHORIZEDr   r   strr	   r   whereid
deleted_atis_executescalar_one_or_none	is_activeHTTP_403_FORBIDDEN)r   r   user_idestmtresultusers          1/volume1/homes/robertsu/coba/app/app/core/deps.pyget_current_userr*      s-     +"9"944''2
 	
{66hO $<dgg0$//2E2Ed2KLD::d##F$$&D|443'2
 	
 >>117
 	

 K3  44q6'2
 		 $s6   -ED A!E(D?)AE	D<(D77D<<E)__doc__typingr   fastapir   r   r   fastapi.securityr   r   
sqlalchemyr	   sqlalchemy.ext.asyncior
   app.core.securityr   r   app.databaser   app.models.userr   _bearer_schemer*   CurrentUser	DBSession     r)   <module>r9      s     2 2 E  / 6   
 u-17$>@WWX1,/01 
1l g&6778lGFO34	r8   