
    ]7jA                        d Z ddlZddlZddlZddlmZ ddlmZmZ ddl	m
Z
  eddg      Z ee      j                         j                  j                  j                  d	z  Z ej                   d
      ZdedefdZdefdZdeddfdZ G d de
      Z G d de
      Z G d de
      Z G d de
      Z G d de
      Zh dZh dZd Zej=                  d      defd       ZejA                  d       ded!efd"       Z!ejA                  d#      ded!efd$       Z"ejA                  d%      ded!efd&       Z#ejA                  d'      ded!efd(       Z$ejA                  d)      ded!efd*       Z%y)+u  
個人儀表板（rdash）任務編輯 API — 蘇煥誠私人用，獨立、token 控管。

設計原則：
  - 完全不碰團隊資料（不進 DB、不用 auth deps），只讀寫
    static/<token>/rdash_tasks.json 這一個檔。
  - token 同時是 static 資料夾名稱（祕密、難猜），等同通行證；
    路徑帶錯 token 一律 404。
  - MVP：列出 / 改名 / 刪除任務。新增、改狀態之後再加。
  - 寫檔用 temp + os.replace 原子寫入，避免半寫壞檔。

掛載：app/main.py 內 `from app.api import rdash as rdash_routes`
      + `app.include_router(rdash_routes.router)`。
出問題只要移除那兩行 + 砍此檔即可完全還原，不影響 Cooper。
    N)Path)	APIRouterHTTPException)	BaseModelz
/api/rdashrdash)prefixtagsstaticz^rdash-[A-Za-z0-9_-]{8,}$tokenreturnc                     t         j                  |       st        dd      t        | z  }|j	                         st        dd      |dz  S )u@   驗證 token 並回傳該使用者的 rdash_tasks.json 路徑。  z	not foundstatus_codedetailzrdash_tasks.json)	_TOKEN_REmatchr   _STATIC_DIRis_dir)r   folders     1/volume1/homes/robertsu/coba/app/app/api/rdash.py_storer      sG    ??5!K@@5 F==?K@@&&&    pc                     | j                         sg S 	 t        j                  | j                  d            }t	        |t
              r|S g S # t        $ r g cY S w xY w)Nutf-8encoding)existsjsonloads	read_text
isinstancelist	Exception)r   datas     r   _loadr'   )   sV    88:	zz!++w+78!$-t525 	s   6A A AAc                     | j                  d      }|j                  t        j                  |dd      d       t	        j
                  ||        y )Nz.tmpF   )ensure_asciiindentr   r   )with_suffix
write_textr    dumpsosreplace)r   r&   tmps      r   _saver2   3   s;    
--
CNN4::dqAGNTJJsAr   c                   "    e Zd ZU eed<   eed<   y)
RenameBodyidtitleN__name__
__module____qualname__str__annotations__ r   r   r4   r4   9   s    GJr   r4   c                       e Zd ZU eed<   y)
DeleteBodyr5   Nr7   r=   r   r   r?   r?   >   s    Gr   r?   c                   6    e Zd ZU eed<   eed<   dZedz  ed<   y)
StatusBodyr5   statusNdoneDate)r8   r9   r:   r;   r<   rC   r=   r   r   rA   rA   B   s    GKHcDjr   rA   c                   N    e Zd ZU eed<   dZedz  ed<   dZeed<   dZedz  ed<   y)AddBodyr6   Nstreamq2quadrantdue)r8   r9   r:   r;   r<   rF   rH   rI   r=   r   r   rE   rE   H   s-    JFC$JHcCtr   rE   c                       e Zd ZU eed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZedz  ed<   dZ	edz  ed<   dZ
edz  ed<   y)	
UpdateBodyr5   Nr6   rF   rH   rB   rI   rC   )r8   r9   r:   r;   r<   r6   rF   rH   rB   rI   rC   r=   r   r   rK   rK   O   s[    GE3:FC$JHcDjFC$JCtHcDjr   rK   >   donetododoing>   q1rG   q3q4c                 ~    | D ch c]  }|j                  d       }}d}d| |v r|dz  }d| |v rd| S c c}w )Nr5      u)get)taskstexistingns       r   _next_idrZ   ]   sZ    %*+UdUH+	AaS'X
	Q aS'X
qc7N	 ,s   :z/{token}/tasksc                 0    dt        t        |             dS )NTokrV   )r'   r   )r   s    r   
list_tasksr^   e   s    ve}!566r   z/{token}/renamebodyc                 "   t        |       }t        |      }|j                  xs dj                         }|st	        dd      |D ];  }|j                  d      |j                  k(  s"|d d |d<   t        ||       d|d	c S  t	        d
d      )N   title emptyr   r5      r6   Tr\   r   task not found)r   r'   r6   stripr   rU   r5   r2   )r   r_   r   rV   r6   rW   s         r   rename_taskrg   j   s    uA!HEZZ2$$&EMBB55;$''!tAgJ!UO//	 
 C0@
AAr   z/{token}/addc                 p   |j                   xs dj                         }|st        dd      |j                  t        v r|j                  nd}t        |       }t        |      }t        |      |d d |j                  xs d |d|j                  xs d d}|j                  |       t        ||       d	||d
S )Nra   rb   rc   r   rG   rd   rM   )r5   r6   rF   rH   rB   rI   T)r]   rV   added)r6   rf   r   rH   _VALID_QUADRANTr   r'   rZ   rF   rI   appendr2   )r   r_   r6   qr   rV   tasks          r   add_taskrn   y   s    ZZ2$$&EMBB/9tAuA!HEuot;;&$ DD 
LL	!UO66r   z/{token}/updatec                 *   t        |       }t        |      }|D ]k  }|j                  d      |j                  k(  s#|j                  $|j                  j                         }|r|dd |d<   |j                  .|j                  t        vrt        dd      |j                  |d<   |j                  |j                  t        vrt        dd	      |j                  |d
<   |j                  dk(  r5|j                  xs dj                         xs |j                  d      |d<   n|j                  dd       |j                  |j                  xs d|d<   |j                  |j                  xs d|d<   t        ||       d|dc S  t        dd      )uY   通用欄位更新：只改有帶進來的欄位（title/stream/quadrant/status/due）。r5   Nrd   r6   rb   zbad quadrantr   rH   
bad statusrB   rL   ra   rC   rF   rI   Tr\   r   re   )r   r'   rU   r5   r6   rf   rH   rj   r   rB   _VALID_STATUSrC   poprF   rI   r2   )r   r_   r   rV   rW   tis         r   update_taskrt      sa    	uA!HE55;$''!zz%ZZ%%'!#DSAgJ}}(==7'COO $*{{&;;m3'CMM"kk(;;&(%)]]%8b$?$?$A$VQUU:EVAjMEE*d+{{&"kk1T(xx#88+t%!UO/// 0 C0@
AAr   z/{token}/statusc                    |j                   t        vrt        dd      t        |       }t	        |      }|D ]  }|j                  d      |j                  k(  s"|j                   |d<   |j                   dk(  r&|j                  xs dj                         xs d |d<   n|j                  dd        t        ||       d	|d
c S  t        dd      )Nrb   rp   r   r5   rB   rL   ra   rC   Tr\   r   re   )rB   rq   r   r   r'   rU   r5   rC   rf   rr   r2   )r   r_   r   rV   rW   s        r   
set_statusrv      s    {{-'LAAuA!HE55;$''!++AhK{{f$!%!4" ; ; = E*j$'!UO//  C0@
AAr   z/{token}/deletec                     t        |       }t        |      }|D cg c]#  }|j                  d      |j                  k7  s"|% }}t	        |      t	        |      k(  rt        dd      t        ||       d|dS c c}w )Nr5   r   re   r   Tr\   )r   r'   rU   r5   lenr   r2   )r   r_   r   rV   rW   kepts         r   delete_taskrz      sr    uA!HE7u!dtww 6AuD7
4yCJ4DEE	!TN&&	 8s
   #A:A:)&__doc__r    r/   repathlibr   fastapir   r   pydanticr   router__file__resolveparentr   compiler   r;   r   r'   r2   r4   r?   rA   rE   rK   rq   rj   rZ   rU   r^   postrg   rn   rt   rv   rz   r=   r   r   <module>r      s    	 	  , 	,gY	7 8n$$&--44;;hFBJJ34	'# '$ 'T T D  
    i     ** 7c 7 7 Bs B* B  B ^7C 7w 7 7( Bs B* B  B> Bc B B  B" 's '* '  'r   