
    Tix)                        d Z ddlZddlZddlZddlZddlmZmZmZm	Z	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  ed	
      Zej/                  d      d        Zej/                  d      d        Zej5                  d      defd       Zej/                  d      d        Zej/                  d      d        Zej5                  d      defd       Z G d de      Zej5                  d      defd       Z ej/                  d      d        Z!ejE                  d      de#fd       Z$ej5                  d      defd        Z%ej/                  d!      d"        Z&ej/                  d#      d$        Z'y)%uF  
Settings Router - 设置路由模块

该模块提供设置相关的 API 路由端点，包括：
- 设置文件存在性检查
- 设置的获取和更新
- 代理配置管理
- 代理连接测试

主要端点：
- GET /api/settings/exists - 检查设置文件是否存在
- GET /api/settings - 获取所有设置（敏感信息已掩码）
- POST /api/settings - 更新设置
- GET /api/settings/proxy/status - 获取代理状态
- GET /api/settings/proxy/test - 测试代理连接
- GET /api/settings/proxy - 获取代理设置
- POST /api/settings/proxy - 更新代理设置
- GET /api/settings/knowledge/enabled - 获取启用的知识库列表
依赖模块：
- services.settings_service - 设置服务
- services.db_service - 数据库服务
- services.config_service - 配置服务
- services.knowledge_service - 知识库服务
    N)	APIRouterHTTPExceptionRequest
UploadFileFileForm)
db_service)settings_service)tool_service)list_user_enabled_knowledge)	BaseModelz/api/settings)prefixz/existsc                  J   K   dt        j                          d{   iS 7 w)u+  
    检查设置文件是否存在

    Returns:
        dict: 包含 exists 字段的字典，指示设置文件是否存在

    Description:
        用于前端检查是否需要显示初始设置向导。
        如果设置文件不存在，通常需要引导用户进行初始配置。
    existsN)r
   exists_settings     J/home/jay/workspace/tools/ai-image-gen/jaaz-app/server/routers/settings.pysettings_existsr   )   s#      ,<<>>??>s   #!# c                  2   K   t        j                         S w)uy  
    获取所有设置配置

    Returns:
        dict: 完整的设置配置字典，敏感信息已被掩码处理

    Description:
        返回所有应用设置，包括代理配置、系统提示词等。
        敏感信息（如密码）会被替换为 '*' 字符以保护隐私。
        设置会与默认配置合并，确保所有必需的键都存在。
    )r
   get_settingsr   r   r   r   r   8   s      ((**s   requestc                    K   | j                          d{   }t        j                  |       d{   }|S 7 #7 w)u  
    更新设置配置

    Args:
        request (Request): HTTP 请求对象，包含要更新的设置数据

    Returns:
        dict: 操作结果，包含 status 和 message 字段

    Description:
        接收 JSON 格式的设置数据并更新到配置文件。
        支持部分更新，新数据会与现有设置合并而不是完全替换。

    Example:
        POST /api/settings
        {
            "proxy": "http://proxy.com:8080"  // 或 "no_proxy" 或 "system"
        }
    N)jsonr
   update_settings)r   dataresults      r   r   r   H   s7     * D#33D99FM  9s   >:><>>z/proxy/statusc                     K   t        j                         } | j                  dd      }|dk(  rddddS |dk(  rddddS |j                  d	      rddd
dS ddddS w)u  
    获取代理配置状态

    Returns:
        dict: 代理状态信息，包含以下字段：
            - enable (bool): 代理是否启用
            - configured (bool): 代理是否正确配置
            - message (str): 状态描述信息

    Description:
        检查当前代理配置的状态，包括是否启用和是否正确配置。
        该端点不会暴露完整的代理 URL 以保护安全性。

    Status Logic:
        - enable=True, configured=True: 代理已启用且配置正确
        - enable=True, configured=False: 代理已启用但配置有误
        - enable=False, configured=False: 代理未启用
    proxysystemno_proxyFTzProxy is disabled)enable
configuredmessagezUsing system proxyzhttp://zhttps://z	socks4://z	socks5://zUsing custom proxyzProxy configuration is invalid)r
   get_raw_settingsget
startswith)settingsproxy_settings     r   get_proxy_statusr,   b   s     *  002HLL(3M
" *
 	

 
(	" +
 	

 
	!	!"S	T +
 	
 7
 	
s   AAz/proxyc                  :   K   t        j                         } d| iS w)uh  
    获取代理设置

    Returns:
        dict: 代理配置字典，包含 proxy 字段

    Description:
        仅返回代理相关的设置，不包含其他配置项。
        用于前端代理设置页面的数据加载。

    Response Format:
        {
            "proxy": "no_proxy" | "system" | "http://proxy.example.com:8080"
        }
    r    )r
   get_proxy_config)proxy_configs    r   get_proxy_settingsr0      s!     " $446L\""s   c                 N  K   | j                          d{   }t        |t              rd|vrt        dd      |d   }t        |t              st        dd      |dvr|j                  d      st        dd	      t        j                  d|i       d{   }|S 7 7 w)
u  
    更新代理设置

    Args:
        request (Request): HTTP 请求对象，包含代理配置数据

    Returns:
        dict: 操作结果，包含 status 和 message 字段

    Raises:
        HTTPException: 当代理配置数据格式不正确时抛出 400 错误

    Description:
        仅更新代理相关的设置，不影响其他配置项。
        代理配置应该是一个包含 "proxy" 键的对象。

    Example:
        POST /api/settings/proxy
        {
            "proxy": "no_proxy"  // 不使用代理
        }
        或
        {
            "proxy": "system"  // 使用系统代理
        }
        或
        {
            "proxy": "http://proxy.example.com:8080"  // 使用指定代理
        }
    Nr      z@Invalid proxy configuration. Expected format: {'proxy': 'value'}status_codedetailzProxy value must be a string)r"   r!   r&   zGInvalid proxy value. Must be 'no_proxy', 'system', or a valid proxy URL)r   
isinstancedictr   strr)   r
   r   )r   
proxy_dataproxy_valuer   s       r   update_proxy_settingsr;      s     @ ||~%J j$'7*+DUW 	W W%K k3'13 	3
 009O9O  QB  :C\^ 	^
 $33Wk4JKKFM1 &. Ls"   B%B!BB%B#B%#B%c                   D    e Zd ZU eed<   eed<   eed<   eed<   dZeed<   y)CreateWorkflowRequestnameapi_jsondescriptioninputsNoutputs)__name__
__module____qualname__r8   __annotations__r7   listrB   r   r   r   r=   r=      s!    
INLGSr   r=   z/comfyui/create_workflowc                   K   | j                   st        dd      | j                  st        dd      | j                  st        dd      | j                  st        dd      	 | j                   j                  dd      }t        j                  | j                        }t        j                  | j                        }t        j                  | j                        }t        j                  ||| j                  ||       d {    t        j                          d {    d	d
iS 7 $7 
# t        $ r}t        ddt        |             d }~ww xY ww)Nr2   zName is requiredr3   zAPI JSON is requiredzDescription is requiredzInputs are required _successTzFailed to create workflow: )r>   r   r?   r@   rA   replacer   dumpsrB   r	   create_comfy_workflowr   
initialize	Exceptionr8   )r   r>   r?   rA   rB   es         r   create_workflowrR      s.    <<4FGG4JKK4MNN>>4IJJ
L||##C-::g../GNN+**W__-..tXw?R?RTZ\cddd%%'''4   	e' L&A#a&$JL 	LLsO   A%E(BD0 D,D0 #D.$D0 +E,D0 .D0 0	E9EEEz/comfyui/list_workflowsc                  F   K   t        j                          d {   S 7 wN)r	   list_comfy_workflowsr   r   r   list_workflowsrV     s     002222s   !!z/comfyui/delete_workflow/{id}idc                    K   t        j                  |        d {   }t        j                          d {    |S 7 "7 wrT   )r	   delete_comfy_workflowr   rO   )rW   r   s     r   delete_workflowrZ     s9     33B77F

!
!
###M 8#s   A>AA A Az/comfyui/proxyc                   K   	 | j                          d {   }|j                  d      }|j                  dd      }|r|st        dd      | | }t        j                         4 d {   }|j                  |       d {   }|j                         cd d d       d {    S 7 7 @7 )7 # 1 d {  7  sw Y   y xY w# t
        $ r}t        ddt        |             d }~ww xY ww)	Nurlpathr   r2   z'Missing 'url' or 'path' in request bodyr3   i  zProxy request failed: )r   r(   r   httpxAsyncClientrP   r8   )r   r   
target_urlr]   full_urlclientresponserQ   s           r   comfyui_proxyrd     s     G\\^#XXe_
xx#(QS S !\$( $$& 	# 	#&#ZZ11H==?	# 	# 	# $	#1	# 	# 	# 	#
  G&<SVH$EG 	GGs   C4C
 B-AC
 .B//C
 2B5B1B5C
 'B3(C
 ,C4-C
 /C
 1B53C
 5C;B><CC
 C4C
 
	C1C,,C11C4z/knowledge/enabledc                     K   	 t               } d| t        |       dS # t        $ r}dt        |      g dcY d}~S d}~ww xY ww)ui   
    获取启用的知识库列表

    Returns:
        dict: 包含启用知识库列表的响应
    T)rK   r   countF)rK   errorr   N)r   lenrP   r8   )knowledge_listrQ   s     r   get_enabled_knowledgerj   -  sS     
46"(
 	

  
V
 	

s(   A A	?:?A?Az/my_assets_dir_pathc                     K   ddl m}  	 t        j                  | d       d| ddS # t        $ r}dt        |      dd	cY d
}~S d
}~ww xY ww)uj   
    获取用户的My Assets目录路径
    
    Returns:
        dict: 包含目录路径的响应
    r   )	FILES_DIRT)exist_okz/My Assets directory path retrieved successfully)rK   r]   r%   Fr   )rK   rg   r]   N)services.config_servicerl   osmakedirsrP   r8   )rl   rQ   s     r   get_my_assets_dir_pathrq   D  s[      2

I- H
 	

  
V
 	

s.   A' A	A	AA	AA		A)(__doc__r   ro   shutilr^   fastapir   r   r   r   r   r   services.db_servicer	   services.settings_servicer
   services.tool_servicer   services.knowledge_servicer   pydanticr   routerr(   r   r   postr   r,   r0   r;   r=   rR   rV   deleteintrZ   rd   rj   rq   r   r   r   <module>r~      s  2  	   M M * 6 . B  
/	* I@ @ B+ + R7  2 O2
 2
j H# #( X7 7 7tI  '(L#8 L )L, %&3 '3 ./c  0 G G G2  !
 "
, !"
 #
r   