
    i-!                        d Z ddl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mZ ddlmZ d	d
dddgZ ej"                  d      Z ej&                  ej(                  d       ddZddZddZddZddZddZedk(  r e        yy)u  
資料庫初始化(Seed)腳本。

執行時機:Docker 容器啟動時自動跑(見 Dockerfile CMD)。
功能:確保資料庫裡至少有一個 owner 帳號,讓使用者第一次啟動可以直接登入。

行為:
  1. 連到資料庫
  2. 看 SEED_OWNER_EMAIL 是否已存在
     - 不存在 → 建立 owner
     - 已存在 → 什麼都不做(避免覆蓋使用者後來改的密碼)
  3. 結束

可獨立執行:`python -m app.core.seed`
    N)select)settings)hash_password)AsyncSessionLocal)ChannelChannelMember)User   團隊對話   💬L   全公司一起的對話空間。任何事丟進來,庫柏會自動分類。
   )nameicondescription
sort_orderz	coba.seedz"%(asctime)s [%(name)s] %(message)s)levelformatc                  D  K   t               4 d{   } t        t              j                  t        j                  t
        j                  j                         k(        }| j                  |       d{   }|j                         }|=t        j                  d|j                  |j                         	 ddd      d{    yt        t
        j                  j                         t        t
        j                        t
        j                  dd      }| j!                  |       | j#                          d{    t        j                  d|j                  |j$                         ddd      d{    y7 n7 7 7 H7 # 1 d{  7  sw Y   yxY ww)u7   確保 SEED_OWNER_EMAIL 對應的 owner 帳號存在。Nu.   Owner 帳號已存在,跳過 seed:%s (role=%s)ownerT)emailpassword_hashdisplay_namerole	is_activeu-   已建立第一個 owner:%s (display_name=%s))r   r   r	   wherer   r   SEED_OWNER_EMAILlowerexecutescalar_one_or_noneloggerinfor   r   SEED_OWNER_PASSWORDSEED_OWNER_DISPLAY_NAMEaddcommitr   )dbstmtresultexistingr   s        1/volume1/homes/robertsu/coba/app/app/core/seed.pyseed_first_ownerr+   -   s2     ""bd|!!$**0I0I0O0O0Q"QRzz$'',,.KK@
  #"" ++113'(D(DE!99
 	uiik;KK	
/ #"" ( #, 	- #"""s   F E?F A F5F6AF8F FF 	A5F>F?/F.F 9F	:F FF F	F FFFF c           	        K   ddl m }m} ddlm}m} t        |      j                  |j                  j                  d      |j                  j                  d      |j                  j                  g d            }t        | j                  |       d{   j                         j                               }|syt        |      j                  |j                  dk(  |j                  j                  d            }| j                  |       d{   j!                         }|7 |ddd	d
dd      }| j#                  |       | j%                          d{    ddlm}	 d}
|D ]  }| j                   |	|      j                  |j*                  |j,                  k(  |j                  j                  d            j/                  |j,                               d{   }|
|j0                  xs dz  }
|j3                  |j4                        |_	         | j7                          d{    t8        j;                  dt=        |      |
       y7 7 C7 7 z7 /w)u  階段 3e 一次性遷移:把舊的 6 個分類頻道整併成單一「團隊對話」頻道。

    流程:
      1. 找出所有 is_default=True 但「不是團隊對話」的舊頻道
      2. 找(或建立)「團隊對話」keeper 頻道
      3. 把舊頻道的訊息全部搬到 keeper
      4. 軟刪除舊頻道(deleted_at=now)
    冪等:沒有舊頻道就什麼都不做。
    r   )datetimetimezoner   MessageTN)   公告u   靈感與分享u   求助u   會議紀錄u   庫柏動態u   閒聊r
   r   r   publicr   r   r   r   channel_type
is_defaultr   )update)
channel_iduB   已合併 %d 個舊頻道,搬移 %d 則訊息到「團隊對話」)r-   r.   app.models.channelr   r0   r   r   r5   is_
deleted_atr   in_listr   scalarsallr   r$   flush
sqlalchemyr6   r7   idvaluesrowcountnowutcr%   r    r!   len)r&   r-   r.   r   r0   old_stmtold_channelskeeper_stmtkeeper
sql_updatemoved_totalchr(   s                r*   _consolidate_to_single_channelrN   M   s     ,3 g$$t$t$jkH
 rzz(33<<>BBDEL /''(FHZHZH^H^_cHdeKJJ{++??AF~f!
 	vhhj 0KzzwU7%%.0B0B0F0Ft0LMVvyyV)
 

 	v+!+ X\\2  ))+
KKTVYZfVgitu? 4 , 	
 s^   BIIA<IIAIIBII AI,I-&IIIIIc                    K   t               4 d{   } t        |        d{    | j                  t        t              j                  t        j                  j                  d                   d{   j                         j                         }|D ch c]  }|j                   }}d}t        D ];  }|d   |v r| j                  t	        |d   |d   |d   dd|d   	             |d
z  }= |r.| j                          d{    t        j                  d|       | j                  t        t               j                  t         j                  j                  d      t         j"                  j                  d                   d{   j                         j                         }| j                  t        t              j                  t        j$                  dk(  t        j                  j                  d                   d{   j                         j                         }d}|D ]  }	|D ]  }| j                  t        t&              j                  t&        j(                  |j*                  k(  t&        j,                  |	j*                  k(               d{   j/                         }
|
| j                  t'        |j*                  |	j*                               |d
z  }  |r.| j                          d{    t        j                  d|       ddd      d{    y7 $7 7 c c}w 7 87 7 87 7 D7  # 1 d{  7  sw Y   yxY ww)u  確保預設頻道存在,並把所有使用者自動加為成員。

    階段 3e 變更:
      - 從原本的 6 個分類頻道改為單一「團隊對話」
      - 啟動時自動把舊頻道訊息合併過來
      - Coba 用 tag 取代頻道分類
    冪等。
    Nr   r   r   r   r2   Tr   r3      u   已建立 %d 個預設頻道)r7   user_idu&   已補上 %d 筆 channel_member 關聯)r   rN   r   r   r   r   r:   r9   r=   r>   r   DEFAULT_CHANNELSr$   r%   r    r!   r	   r   r4   r   r7   rA   rQ   r   )r&   r)   rM   existing_namescreated_countspecuserspublic_channelsmember_addeduserexisting_members              r*   seed_default_channelsr[      s     !""b,R000 **VG_%:%:7;M;M;Q;QRV;W%XYYbbdhhj,45Hb"''H5 $DF|~-FF7&\&\ /%-  QM % ))+KK6F zz4Lt2248$..:L:LT:RS
 
79SSU 	 "$7O!!$$0""&&t,"
 

 79SSU 	 D%)+=)//%00BEE9%--8* $
 &%'   #*FF=BEE477KL A%L &  ))+KK@,Oi #""0 Z5" 

$ g #"""s   M'L5M'ML8AM6L;7$ML>.AMMBMMA?MM	BM%M
&M;AM	M
M$M'/M0M'8M;M>MM	MMMM'M$MM$ M'c            	      V  K   ddl m} m} t               4 d{   }|j	                  t        |       j                  | j                  dk(  | j                  j                  d                   d{   j                         }|	 ddd      d{    y|j	                  t        |      j                  |j                  |j                  k(        j                  d             d{   j                         j                         }|	 ddd      d{    y ||j                  ddd	      }|j!                  |       |j#                          d{    t$        j'                  d
       ddd      d{    y7 k7 7 7 7 t7 67 # 1 d{  7  sw Y   yxY ww)uK   在「公告」頻道發一則庫柏的歡迎訊息(只發一次,冪等)。r   r/   Nr1   TrP   u
  嗨,我是庫柏(Coba)——你們的 AI 同事。

我會默默讀群組裡的訊息,在你 @ 我時回應。
我也會每天 9:00 產生簡報、會議錄音轉摘要、自動關聯過去討論。

把我當成「會記得每個人的特助級同事」就對了。text)r7   rQ   contentmessage_typeu   已 seed 庫柏歡迎訊息)r8   r   r0   r   r   r   r   r   r5   r9   r   r7   rA   limitr=   firstr$   r%   r    r!   )r   r0   r&   announcer)   welcomes         r*   seed_coba_welcomerd      sb    3 ""b**7O!!',,(":G<N<N<R<RSW<XY
 
 	  #"" **7O!!'"4"4"CDJJ1M
 
79UUW 	  #"" {{U
  

 	wiik127 #""
 #
 #4 	5 #"""s   F)FF)AF1F2FF)F
F)AF*F+#FF)FF):FFF3F)>F?F)F
F)FF)FF)F&FF&"F)c                     K   t                d{    t                d{    t                d{    y7 )7 7 	w)u   串連所有 seed 任務。N)r+   r[   rd        r*   seed_allrh      s7     



!!!

 !s*   A :A <A >A A A c                  >    t        j                  t                      y )N)asynciorunrh   rf   rg   r*   mainrl      s    KK
rg   __main__)returnN)__doc__rj   loggingr@   r   
app.configr   app.core.securityr   app.databaser   r8   r   r   app.models.userr	   rR   	getLoggerr    basicConfigINFOr+   rN   r[   rd   rh   rl   __name__rf   rg   r*   <module>ry      s         + * 5   e	  
		;	'   ',,/S T
@2vj=P@3D zF rg   