
    wi                     J   d 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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%dedededee   fd       Zej3                  deej4                  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dedefdZej?                  ded      dededededef
d        Z ejC                  dejD                  d!"      dedededd#fd$       Z#y#)&u|  
專案 API。

階段 2a 提供:
  - GET    /api/projects        ─ 列出所有非 archived 專案
  - POST   /api/projects        ─ 建立新專案(建立者自動成為 owner)
  - GET    /api/projects/{id}   ─ 取得單一專案(含任務數統計)
  - PATCH  /api/projects/{id}   ─ 更新專案(只有專案 owner 或公司 owner 能改)
  - DELETE /api/projects/{id}   ─ 軟刪除專案(只有 owner 能刪)

設計重點:
  1. 軟刪除:deleted_at 有值代表刪除,前端永遠看不到
  2. 權限:目前只區分「公司 owner」「專案 owner」「其他人」,
     階段 3 之後若要更細的權限再擴充
    )datetimetimezone)UUID)	APIRouterHTTPExceptionstatus)select)CurrentUser	DBSession)Project)ProjectCreateRequestProjectPublicProjectUpdateRequestz/api/projectsprojects)prefixtags u   列出所有專案)response_modelsummarycurrent_userdbinclude_archivedreturnc                   K   t        t              j                  t        j                  j	                  d            }|s"|j                  t        j
                  dk(        }|j                  t        j                  j                               }|j                  |       d{   }t        |j                         j                               S 7 +w)u|   列出所有非軟刪除的專案。

    預設不含已歸檔(archived)專案,加 ?include_archived=true 看全部。
    Nactive)r	   r   where
deleted_atis_r   order_by
created_atdescexecutelistscalarsall)r   r   r   stmtresults        4/volume1/homes/robertsu/coba/app/app/api/projects.pylist_projectsr)      s      '?  !3!3!7!7!=>Dzz'..H45==++0023D::d##F $$&'' $s   B!C#C$,Cu   建立新專案)r   status_coder   payloadc                 
  K   t        | j                  | j                  | j                  |j                  d      }|j                  |       |j                          d {    |j                  |       d {    |S 7 7 w)Nr   )namedescriptioncolorowner_idr   )r   r-   r.   r/   idaddcommitrefresh)r+   r   r   projects       r(   create_projectr6   2   so      \\''mmG FF7O
))+
**W
N s$   ABA? B8B9BB
project_idc                 4  K   t        t              j                  t        j                  | k(  t        j                  j                  d            }|j                  |       d{   j                         }|t        t        j                  d      |S 7 1w)u3   共用查單一專案的 helper(過濾軟刪除)。Nu   找不到此專案r*   detail)r	   r   r   r1   r   r   r"   scalar_one_or_noner   r   HTTP_404_NOT_FOUND)r7   r   r&   r5   s       r(   _get_project_or_404r=   J   st     '?  z!97;M;M;Q;QRV;WXDZZ%%99;G(A(AJ^__N &s   A"B$B%2Bz/{project_id}u   取得單一專案c                 6   K   t        | |       d {   S 7 w)N)r=   )r7   r   r   s      r(   get_projectr?   S   s      %Z4444s   r5   c                 V    | j                   dk(  xs |j                  | j                  k(  S )u9   誰能改/刪這個專案?專案 owner 或公司 owner。owner)roler0   r1   )userr5   s     r(   _can_edit_projectrD   \   s%    99>7#3#3tww#>>    u   更新專案c                   K   t        | |       d {   }t        ||      st        t        j                  d      |j
                  |j
                  |_        |j                  |j                  |_        |j                  |j                  |_        |j                  |j                  |_        |j                          d {    |j                  |       d {    |S 7 7 !7 
w)Nu,   只有專案 owner 或公司 owner 能修改r9   )
r=   rD   r   r   HTTP_403_FORBIDDENr-   r.   r/   r3   r4   )r7   r+   r   r   r5   s        r(   update_projectrH   a   s      (
B77G\7311A
 	

 ||||&%11}} ~~! 
))+
**W
N% 8  s4   C+C%B2C+C'C+C)C+'C+)C+u   軟刪除專案)r*   r   Nc                 
  K   t        | |       d {   }t        ||      st        t        j                  d      t        j                  t        j                        |_	        |j                          d {    y 7 l7 w)Nu,   只有專案 owner 或公司 owner 能刪除r9   )r=   rD   r   r   rG   r   nowr   utcr   r3   )r7   r   r   r5   s       r(   delete_projectrL   }   sk      (
B77G\7311A
 	
 "hll3G
))+ 8 s"   BA?A&B9B:BB)F)$__doc__r   r   uuidr   fastapir   r   r   
sqlalchemyr	   app.core.depsr
   r   app.models.taskr   app.schemas.taskr   r   r   routergetr#   boolr)   postHTTP_201_CREATEDr6   r=   r?   rD   patchrH   deleteHTTP_204_NO_CONTENTrL    rE   r(   <module>r]      s    (  4 4  0 # V V 
/	= BtM2<PQ #((( ( 
']	( R($  ''	  ! 	 	$$ I '  OMCWX555 	5 	5 Y5?W ? ?
 om^T!  		
  U6 **  
 	 
	
rE   