
    c3i`                       d Z ddlmZ ddlZddlZddlZddlmZmZm	Z	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mZmZ  ej.                  d	      Z ed
g      Z	 	 	 	 d(dZej7                  dej8                  d       edd      f	 	 	 d(d       Zej7                  dej8                  d       edd      f	 	 	 d(d       Z G d de      Zej7                  dd      d)d       Z ejC                  dd      d        Z"ej7                  dd       d*d!       Z#ejC                  d"d#      d+d$       Z$ejK                  d%d&      d*d'       Z&y),u  
LINE Messaging API webhook 端點(階段 6)。

LINE 把使用者 OA / 群組 / 1對1 的事件 POST 到這裡。我們:
  1. 用 X-Line-Signature 驗請求是不是真的來自 LINE(否則一律拒絕)
  2. 把每個 event 拋進背景 task,馬上回 200(LINE 規定要 5 秒內回)

routes:
  POST /webhook/line                      ─ LINE 推事件進來
  POST /api/line/push                     ─ 內部測試用:手動推一則文字到指定 to
  GET  /api/line/health                   ─ 設定狀態
    )annotationsN)	APIRouterHeaderHTTPExceptionRequeststatus)	BaseModel)settings)CurrentUser	DBSession)line_bindingline_bridgeline_clientzcoba.line.webhookline)tagsc                  K   | j                          d {   }t        j                  ||      s"t        j	                  d       t        dd      	 t        j                  |j                  d            }|j                  dg       xs g }|D ]*  }t        j                  t        j                  |             , d	t        |      d
S 7 # t        $ r t        dd      w xY ww)Nu   LINE webhook 簽章驗證失敗i  zinvalid signaturestatus_codedetailzutf-8i  zinvalid jsoneventsT)okr   )bodyr   verify_signatureloggerwarningr   jsonloadsdecode	Exceptiongetasynciocreate_taskr   handle_eventlen)requestx_line_signaturer   payloadr   events         8/volume1/homes/robertsu/coba/app/app/api/line_webhook.py_process_line_webhookr*       s      D''.>?894GHHD**T[[12 [[2&,"FK44U;< #f+..    DNCCDs(   C'C<C'$C 8AC'C$$C'z/webhook/lineu   LINE Messaging API 入口(主))r   summaryzX-Line-Signature)defaultaliasc                6   K   t        | |       d{   S 7 w)u3   LINE webhook 主入口。LINE 5 秒內要回 200。Nr*   r%   r&   s     r)   line_webhookr1   6   s      'w0@AAAA   z/api/line/webhooku&   LINE webhook alias(舊 Console 設定)c                6   K   t        | |       d{   S 7 w)u   alias:舊版 LINE Developer Console 把 webhook URL 設成 /api/line/webhook,
    為避免 Robert 進 Console 改設定,server 兩條 path 都收。Nr/   r0   s     r)   line_webhook_aliasr4   ?   s      'w0@AAAAr2   c                  "    e Zd ZU ded<   ded<   y)_LinePushRequeststrtotextN)__name__
__module____qualname____annotations__     r)   r6   r6   O   s    G
Ir?   r6   z/api/line/pushu(   (管理員)主動推一則文字到 LINE)r+   c                   K   |j                   dk7  rt        dd      t        j                  | j                  | j
                         d{   }d|iS 7 w)u0   測試 / 緊急通知用。owner 才能呼叫。owneri  u"   只有 owner 能用這個 endpointr   Nr   )roler   r   	push_textr8   r9   )r'   current_userr   s      r)   manual_pushrE   T   sP      G#4XYY$$WZZ>	>B": 
?s   A
AA	Az/api/line/healthu   LINE 整合健康檢查c                    K   t        t        j                        t        t        j                        t        t        j                        dS w)uM   看 LINE 的三個密鑰有沒有設好(不洩露具體值,只回 boolean)。)channel_id_setchannel_secret_setaccess_token_set)boolr
   LINE_CHANNEL_IDLINE_CHANNEL_SECRETLINE_CHANNEL_ACCESS_TOKENr>   r?   r)   line_healthrN   ]   s<      x778"8#?#?@ !C!CD s   AAz/api/line/binding/codeu&   產生 LINE 綁定碼(10 分鐘有效)c                \  K   t        j                  || j                         d{   }|j                          d{    |j                  |j
                  j                         t        |j
                  |j                  z
  j                               d|j                   ddS 7 7 kw)u   登入後呼叫。回傳 6 位數綁定碼,使用者去 LINE 對 Cooper 講「綁定 482593」。

    注意:同一個 user 可重複呼叫,既有 unused/未過期碼仍有效。
    Nu!   在 LINE 對 Cooper 傳「綁定 u   」即可完成綁定。)code
expires_atexpires_in_secondsinstruction)
r   generate_codeidcommitrP   rQ   	isoformatint
created_attotal_seconds)rD   dbrecs      r)   issue_binding_coder]   l   s      **2|?
?C
))+nn..0!3>>CNN#B"Q"Q"ST:388*D\]	  @s    $B,B(B,B*A*B,*B,z/api/line/binding/statusu!   看自己當前 LINE 綁定狀態c                z   K   t        | j                        | j                  r| j                  dd dz   dS ddS w)u&   回傳當前 user 是否已綁 LINE。N   u   …)boundline_user_id_partial)rJ   line_user_id)rD   s    r)   binding_statusrc   |   sJ      l//0KWKdKd!:!:2A!>!F jn s   9;z/api/line/bindingu   解除自己的 LINE 綁定c                   K   t        j                  || j                         d{   }|j                          d{    d|iS 7  7 
w)u	  解綁後,自己的 Cooper 帳號 line_user_id 會被清掉。
    日後同一個 LINE userId 再傳訊息進來,會被當成新人,系統會自動建影子帳號。
    若想重新綁回原帳號,需要再走一次「產綁定碼 → LINE 傳碼」流程。
    Nunbound)r   unbindrU   rV   )rD   r[   r   s      r)   unbind_linerg      sC      ""2|7	7B
))+r? 
8s   $AAAA		A	A)r%   r   r&   z
str | None)r'   r6   rD   r   )rD   r   r[   r   )rD   r   )'__doc__
__future__r   r!   r   loggingfastapir   r   r   r   r   pydanticr	   
app.configr
   app.core.depsr   r   app.servicesr   r   r   	getLoggerr   routerr*   postHTTP_200_OKr1   r4   r6   rE   r    rN   r]   rc   deleterg   r>   r?   r)   <module>ru      s   #    E E   0 ? ? 
		.	/		!// /, _&*<*<Ffg $*$>P#QBB B hB  f.@.@>  @ $*$>P#QBB B@By 
 'QR S (AB C %/WX Y &0ST U ",IJ Kr?   