
    iz                        d 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
 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 ddlmZ ddlmZmZmZ  eddg      Zej?                  de e   d      dedede e   fd       Z!ejE                  dee
jF                  d      dedededefd       Z$dededefdZ%ej?                  ded      dedededefd       Z&ejO                  ded       dededededef
d!       Z(ejS                  dd"d#$      dedededd%fd&       Z*ejE                  d'd"d($      dedededd%fd)       Z+ejE                  d*d"d+$      dedededd%fd,       Z,y%)-u$  
頻道 API(階段 3a)。

  - GET    /api/channels                 ─ 列出我能看到的頻道
  - POST   /api/channels                 ─ 建立新頻道(自動把建立者加為成員)
  - GET    /api/channels/{id}            ─ 取得頻道詳情
  - PATCH  /api/channels/{id}            ─ 更新頻道(只有建立者或 owner)
  - DELETE /api/channels/{id}            ─ 軟刪除(只有 owner)
  - POST   /api/channels/{id}/members    ─ 加成員(我邀請別人)
  - DELETE /api/channels/{id}/members/{user_id}  ─ 移除成員
    )defaultdict)datetimetimezone)UUID)	APIRouterHTTPExceptionstatus)select)selectinload)CurrentUser	DBSession)manager)ChannelChannelMember)User)ChannelCreateRequestChannelPublicChannelUpdateRequestz/api/channelschannels)prefixtags u   列出我能看到的頻道)response_modelsummarycurrent_userdbreturnc                   K   t        t        j                        j                  t        j                  | j
                  k(        }t        |j                  |       d{   j                         j                               }t        t              j                  t        j                  j                  d            j                  t        j                  dk(  t        j
                  j                  |      z        j                  t        j                   j#                         t        j$                  j#                               }t'        |j                  |       d{   j                         j                               S 7 &7 'w)ub   列出當前使用者參與的頻道,加上所有 public 頻道(就算還沒加入也看得到)。Npublic)r
   r   
channel_idwhereuser_ididsetexecutescalarsallr   
deleted_atis_channel_typein_order_by
sort_orderasc
created_atlist)r   r   member_stmtmy_channel_idsstmts        4/volume1/homes/robertsu/coba/app/app/api/channels.pylist_channelsr5      s     112880K 

; 77@@BFFHIN 	w	w!!%%d+	,	!!X-'**..2PQ

 
'$$((*G,>,>,B,B,D	E 	 rzz$''00266899 8 (s%   AF
F D F
 F!%F
F
u   建立頻道)r   status_coder   payloadc           	        K   t        | j                  | j                  | j                  | j                  |j
                  dd      }|j                  |       |j                          d {    t        |j
                  |j
                        }|j                  |       |j                          d {    |j                  |       d {    |S 7 i7 !7 
w)NF   )nameicondescriptionr*   
created_by
is_defaultr-   r    r"   )r   r:   r;   r<   r*   r#   addflushr   commitrefresh)r7   r   r   channelmembers        r4   create_channelrF   7   s      \\\\''))??G FF7O
((* gjj,//JFFF6N
))+
**W
N  s7   A)C+C,A	C5C6CCCCCr    c                   K   t        t              j                  t        j                  | k(  t        j                  j                  d             }|j                  |       d {   j                         }|t        dd      |S 7 #w)Ni  u   找不到此頻道r6   detail)	r
   r   r!   r#   r(   r)   r%   scalar_one_or_noner   )r    r   r3   chs       r4   _get_channel_or_404rL   W   sn     '?  z!97;M;M;Q;QRV;WXD

4 
 	4	4	6B	z4HIII !s   A"B
$B%$B
z/{channel_id}u   取得頻道詳情c                 6   K   t        | |       d {   S 7 w)N)rL   )r    r   r   s      r4   get_channelrN   _   s     $Z4444s   u   更新頻道c                   K   t        | |       d {   }|j                  dk7  r&|j                  |j                  k7  rt	        dd      |j
                  |j
                  |_        |j                  |j                  |_        |j                  |j                  |_        |j                          d {    |j                  |       d {    |S 7 7 !7 
w)Nowner  u.   只有建立者或公司 owner 能修改頻道rH   )
rL   roler=   r#   r   r:   r;   r<   rB   rC   )r    r7   r   r   rK   s        r4   update_channelrS   d   s      #:r2	2BG#(H4dee||,,||,,& ,,
))+
**R.I 
3 s4   CCB#C6C7CCCCC   u   軟刪除頻道(只有 owner))r6   r   Nc                 &  K   t        | |       d {   }|j                  rt        dd      |j                  dk7  rt        dd      t	        j
                  t        j                        |_        |j                          d {    y 7 z7 w)Ni  u   預設頻道不能刪除rH   rP   rQ   u   只有公司 owner 能刪頻道)
rL   r>   r   rR   r   nowr   utcr(   rB   )r    r   r   rK   s       r4   delete_channelrX   z   st     ":r2	2B	}}4NOOG#4UVVLL.BM
))+ 
3 s"   BBA4BBBBz/{channel_id}/mark-readu   標記頻道已讀至此刻c                 (  K   t        | |       d{   }|j                  t        t              j	                  t        j
                  | k(  t        j                  |j                  k(               d{   j                         }|D|j                  dk(  rt        dd      t        | |j                        }|j                  |       t        j                  t        j                        |_        |j#                          d{    t%        j&                  dt)        |       t)        |j                        |j*                  |j,                  d|j                   j/                         d	|j                  
       d{    y7 v7 7 7 w)u^  更新「我」在這個頻道的 last_read_at = 現在。

    LINE 風格的「已讀」就靠這個:其他人看自己訊息時,本端點會被觸發,
    伺服器記下「這個人讀到何時」,下次列訊息時就會在已讀名單裡看到他。

    冪等:如果還不是頻道成員,自動加入(只有 public 頻道允許自加)。
    NprivaterQ   +   這是私密頻道,需要邀請才能加入rH   r?   read_receipt)r#   display_name
avatar_url)typer    userlast_read_at)exclude_user_id)rL   r%   r
   r   r!   r    r"   r#   rJ   r*   r   r@   r   rV   r   rW   ra   rB   
ws_manager	broadcaststrr]   r^   	isoformat)r    r   r   rK   rE   s        r4   mark_channel_readrg      sK     #:r2	2BJJ}##$$
2!!\__4	
 
   ~??i'C8eff*looN
v",,x||4F
))+ 

"j/,//* , 9 9*55
 #//99;		
 %  ) 
3 sH   FFA!F4F5BFF	A9FFFFFFz/{channel_id}/joinu   加入頻道(自己加自己)c                   K   t        | |       d{   }|j                  dk(  rt        dd      |j                  t	        t
              j                  t
        j                  | k(  t
        j                  |j                  k(               d{   }|j                         y|j                  t        | |j                               |j                          d{    y7 7 V7 	w)uY   讓使用者加入 public 頻道。private 頻道只能透過邀請(下方 add_member)。NrZ   rQ   r[   rH   r?   )rL   r*   r   r%   r
   r   r!   r    r"   r#   rJ   r@   rB   )r    r   r   rK   existings        r4   join_channelrj      s      #:r2	2B	)#4abb ZZ}##$$
2!!\__4	
 H ""$0FF=JHI
))+ 
3
 s5   C+C%A=C+C'AC+C) C+'C+)C+)-__doc__collectionsr   r   r   uuidr   fastapir   r   r	   
sqlalchemyr
   sqlalchemy.ormr   app.core.depsr   r   app.core.ws_managerr   rc   app.models.channelr   r   app.models.userr   app.schemas.channelr   r   r   routergetr0   r5   postHTTP_201_CREATEDrF   rL   rN   patchrS   deleterX   rg   rj        r4   <module>r~      sa  
 $ '  4 4  ' 0 5 5   Y Y 
/	= BtM2<YZ::: 
']: [:.  ''	  ! 	 	4$ I '  OMCWX5$ 5k 5y 5U\ 5 Y5 om^T!  		
  U* C9XYT  ) X\  Z &CA^_,,, 	, 
	, `,^ !s<[\4 { 	 VZ  ]r}   