
    Mi                       d Z ddlmZ ddlmZ ddlmZmZ ddlm	Z	m
Z
 ddlmZ  ee          Z eddg	          Zd
ZdZdZdZdZddZ G d de          Z G d de          Ze                    de          dd            ZdS )um  Authentication endpoints for third-party system integration.

第三方系统认证端点。
提供 SSO 令牌交换接口，允许已认证的外部系统为其用户获取本系统 JWT。

三方系统传入的 ID 通常是纯数字（如 user_id=1001, dept_id=5），
本接口会自动添加类型前缀（U_、O_、D_、A_、R_）以匹配内部 ACL 体系。
    )annotations)	APIRouter)	BaseModelField)TokenClaimscreate_access_token)
get_loggerz/authauth)prefixtagsU_O_D_A_R_valuestrr   returnc                D    | s| S |                      |          r| n| |  S )u   为 ID 添加类型前缀（如已存在则不重复添加）。

    >>> ensure_prefix("1001", "U_")
    'U_1001'
    >>> ensure_prefix("U_1001", "U_")
    'U_1001'
    >>> ensure_prefix("", "U_")
    ''
    )
startswith)r   r   s     )D:\work\zm-rag\backend\app\api\v1\auth.pyensure_prefixr       s9      $$V,,D55V2DU2D2DD    c                  Z   e Zd ZU dZ eddd          Zded<    edd	
          Zded<    edd
          Zded<    edd
          Z	ded<    edd
          Z
ded<    edd
          Zded<    edd
          Zded<    edd
          Zded<    eed          Zded<   dS )SSOTokenRequestu   Request body for SSO token exchange.

    第三方系统传入的用户身份信息。ID 字段可以是纯数字（如 ``"1001"``），
    服务端会自动添加类型前缀（``U_``、``O_``、``D_``、``A_``、``R_``）。
    .   u2   用户唯一标识（纯数字即可，如 1001）)
min_lengthdescriptionr   user_id u   用户姓名)defaultr   	user_nameu'   科室 ID（纯数字即可，如 17）	office_idu   科室名称office_nameu&   部门 ID（纯数字即可，如 5）dept_idu   部门名称	dept_nameu&   地区 ID（纯数字即可，如 1）area_idu   地区名称	area_nameu6   角色 ID 列表（纯数字即可，如 ["1", "3"]）)default_factoryr   z	list[str]role_idsN)__name__
__module____qualname____doc__r   r   __annotations__r"   r#   r$   r%   r&   r'   r(   listr*    r   r   r   r   2   sE          58lmmmGmmmmU2>BBBIBBBBU23\]]]I]]]]uR^DDDKDDDD51YZZZGZZZZU2>BBBIBBBB51YZZZGZZZZU2>BBBIBBBB%B~Hr   r   c                  @    e Zd ZU dZded<   dZded<   ded<   ded<   d	S )
SSOTokenResponseut   Response containing the issued JWT.

    签发的 JWT 令牌响应。user_id 为添加前缀后的内部 ID。
    r   access_tokenbearer
token_typeint
expires_inr   N)r+   r,   r-   r.   r/   r6   r1   r   r   r3   r3   D   sK          
 JOOOLLLLLr   r3   z/sso)response_modelbodyc                  K   t          | j        t                    }t          | j        t                    }t          | j        t                    }t          | j        t                    }d | j	        D             }t          || j        || j        || j        || j        |	  	        }t          |d          }t                               d||||           t%          |j        d|j        |          S )	u  Exchange third-party user info for a zm-rag JWT.

    第三方系统调用此接口，传入用户信息，换取本系统的 JWT 令牌。
    返回的令牌可直接用于所有需要认证的接口。

    **ID 自动前缀**：三方系统传入的原始 ID（通常为纯数字）会被自动添加
    类型前缀以匹配内部 ACL 体系：

    - ``user_id``  → ``U_<id>``
    - ``office_id`` → ``O_<id>``
    - ``dept_id``  → ``D_<id>``
    - ``area_id``  → ``A_<id>``
    - ``role_ids`` → ``R_<id>``

    当前版本不要求调用方身份验证（无 app_id/secret），
    后续可通过中间件或依赖注入添加。
    c                8    g | ]}t          |t                    S r1   )r   PREFIX_ROLE).0rs     r   
<listcomp>z&sso_token_exchange.<locals>.<listcomp>k   s"    NNN1q+66NNNr   )	r   r"   r#   r$   r%   r&   r'   r(   r*   zzm-rag)issuersso_token_issued)r   r#   r%   r'   r5   )r4   r6   r8   r   )r   r   PREFIX_USERr#   PREFIX_OFFICEr%   PREFIX_DEPTr'   PREFIX_AREAr*   r   r"   r$   r&   r(   r   loggerinfor3   r4   r8   )r:   prefixed_user_idprefixed_office_idprefixed_dept_idprefixed_area_idprefixed_role_idsclaimsresults           r   sso_token_exchangerP   S   s     ( %T\;??&t~}EE$T\;??$T\;??NNNNN .$$ . ."
 
 
F !999F
KK $       ($ 	   r   N)r   r   r   r   r   r   )r:   r   r   r3   )r.   
__future__r   fastapir   pydanticr   r   app.core.securityr   r   app.utils.loggerr	   r+   rG   routerrC   rD   rE   rF   r=   r   r   r3   postrP   r1   r   r   <module>rX      sg    # " " " " "       % % % % % % % % > > > > > > > > ' ' ' ' ' '	H			'	1	1	1
 E E E E$@ @ @ @ @i @ @ @$	 	 	 	 	y 	 	 	 V$4554 4 4 654 4 4r   