
    OjK              	          d dl Z d dlmZ d dlmZmZmZ d dlmZm	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 d d
lmZmZmZmZ  e j4                  e      Zdeeddf   fdZ edd       e	e      fdedz  dedefdZ e	e      fdedefdZ  e	e       e	e      fdedededefdZ!dedefdZ"dedededdfdZ#y)    N)wraps)AnyCallable	Generator)CookieDepends)Session)SessionLocal)AppError)is_session_expired)t)r	   UserAccountProjectRegistryProjectMemberreturnc               #   t   K   t               } 	 |  | j                          y # | j                          w xY ww)N)r
   close)dbs    B/Users/manta/Documents/Projects/TheRoad-I1/backend/app/api/deps.pyget_dbr      s)     	B


s   8# 858session)defaultaliassession_tokenr   c                    | st        dt        d      d      |j                  t              j	                  t        j
                  | k(        j                         }|st        dt        d      d      t        |j                        r8|j                  |       |j                          t        dt        d      d      |j                  t              j	                  t        j
                  |j                  k(        j                         }|st        dt        d      d      |j                  st        dt        d      d      |S )	Nzauth.not_authenticatedi  codemessagestatus_codezauth.session_expiredzuser.not_found  zuser.deactivated  )r   r   querySessionModelfilteridfirstr   
expires_atdeletecommitr   user_id	is_active)r   r   r   users       r   get_current_userr-      s,    )./
 	
 hh|$++LOO},LMSSUG)./
 	
 ',,-
		'
		',-
 	
 88K '''//(IJPPRD!&'
 	
 >>#()
 	
 K    current_userc                 R    | j                   dk7  rt        dt        d      d      | S )Nadminzpermission.admin_requiredr!   r   )roler   r   )r/   s    r   require_adminr3   G   s4    G#,12
 	

 r.   
project_idr,   c                    |j                  t              j                  t        j                  | k(  t        j                  dk7        j                         }|st        dt        d      d      |j                  dk7  rx|j                  t              j                  t        j                  | k(  t        j                  |j                  k(        j                         }|st        dt        d      d      | S )z|Verify the user has access to the project and return the project_id.

    Replaces the old get_project_db() dependency.
    deletedzproject.not_foundr    r   r1   zproject.access_deniedr!   )r"   r   r$   r%   statusr&   r   r   r2   r   r4   r*   )r4   r   r,   projectmembers        r   verify_project_accessr:   Q   s     	!	""j0/2H2HI2U	V	 
 $)*
 	
 yyGHH]#VM,,
:M<Q<QUYU\U\<\]UW 	
 ,12  r.   funcc                 T     t               dt        dt        dt        f fd       }|S )u*  모든 API 엔드포인트에 적용 가능한 공용 데코레이터.

    - dict 응답이면 `warnings` 키를 자동으로 ensure (없으면 빈 리스트).
    - `AppError`는 그대로 재전파 (핸들러에서 JSON 응답 변환).
    - 기타 예상치 못한 예외는 WARNING 로그 후 AppError(code='internal_error', 500)로 정규화.

    적용: `@router.post(...)` 아래에 `@api_endpoint` 추가.
    신규 endpoint는 필수, 기존은 점진 적용.

    참조: docs/architecture-refactor-final/02-final-roadmap.md §Phase 2.5
    argskwargsr   c                      	  | i |}t        |t              r|j                  dg        |S # t         $ r  t        $ r7}t        j                  dj                         t        dd| d      |d }~ww xY w)Nz&Unhandled exception in API endpoint %sinternal_erroru   내부 오류: i  r   warnings)r   	Exceptionlogger	exception__name__
isinstancedict
setdefault)r=   r>   resultexcr;   s       r   wrapperzapi_endpoint.<locals>.wrapper   s    
	4*6*F fd#j"-  	 	Et}}U%)#/ 		s   / A82A33A8)r   r   )r;   rK   s   ` r   api_endpointrL   |   s7     4[s c c  " Nr.   c                 R   t        | ||       t        |dd      dk(  ry|j                  t              j	                  t        j
                  | k(  t        j                  |j                  k(        j                         }|t        t        |dd            dk7  rt        ddd	
      y)u  이 사람이 **써도 되나** — owner 또는 admin 만. ★읽기 권한으로 파이프라인 입력을 못 바꾼다.

    ★★★(Codex BLOCK 2026-09-02) `verify_project_access` 는 **member 인지만** 본다.
    고증 판정(POST)과 좌표 선언(PUT) 은 다음 유료 조사의 좌표와 config hash 를 바꾸는
    **쓰기**라 같은 문을 지난다 — 규칙은 여기 한 곳.)r   r,   r2    r1   Nownerzproject.write_denieduu   파이프라인 입력을 바꾸는 쓰기는 **owner 나 admin** 만 한다 — 읽기 권한으로는 못 바꾼다r!   r   )r:   getattrr"   r   r$   r4   r*   r%   r&   strr   )r4   r   r,   r9   s       r   require_project_writerR      s     *$7tVR G+hh}%vm..*<#++tww688=  ~WVVR89WD'<	 	 Er.   )$logging	functoolsr   typingr   r   r   fastapir   r   sqlalchemy.ormr	   
OrmSessionapp.core.databaser
   app.core.errorsr   app.core.securityr   app.i18n.loaderr   app.models.catalogr#   r   r   r   	getLoggerrE   rC   r   rQ   r-   r3   r:   rL   rR    r.   r   <module>r`      s     + + # 0 * $ 0  c c			8	$	*dD01  !'t9 EV_+:++ +\ /66F.G  K  V_ 01### # 		#Vx H Bc z  QU r.   