125 lines
4.1 KiB
Python
125 lines
4.1 KiB
Python
#!/usr/bin/env python
|
|
# -*- coding: utf-8 -*-
|
|
"""
|
|
SystemConfig Service - 系统配置服务层
|
|
"""
|
|
from typing import Dict, Any, List, Optional
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.base_service import BaseService
|
|
from app.config_manager import config_manager, GROUP_ENV_MAPPING, SECRET_KEYS
|
|
from core.system_config.model import SystemConfig
|
|
from core.system_config.schema import SystemConfigCreate, SystemConfigUpdate
|
|
|
|
|
|
class SystemConfigService(BaseService[SystemConfig, SystemConfigCreate, SystemConfigUpdate]):
|
|
"""系统配置服务层"""
|
|
|
|
model = SystemConfig
|
|
|
|
@classmethod
|
|
async def get_group_config(cls, group: str, mask_secrets: bool = True) -> Dict[str, Any]:
|
|
"""
|
|
获取分组配置(通过 config_manager 三级获取)
|
|
|
|
:param group: 配置分组
|
|
:param mask_secrets: 是否对敏感字段脱敏
|
|
:return: {key: value} 字典
|
|
"""
|
|
configs = await config_manager.get_group(group)
|
|
|
|
if mask_secrets:
|
|
return {
|
|
k: config_manager.mask_value(v) if config_manager.is_secret_key(k) and v else v
|
|
for k, v in configs.items()
|
|
}
|
|
return configs
|
|
|
|
@classmethod
|
|
async def update_group_config(
|
|
cls,
|
|
db: AsyncSession,
|
|
group: str,
|
|
configs: Dict[str, Optional[str]],
|
|
) -> Dict[str, Any]:
|
|
"""
|
|
批量更新分组配置
|
|
|
|
:param db: 数据库会话
|
|
:param group: 配置分组
|
|
:param configs: {key: value} 字典
|
|
:return: 更新后的配置(脱敏)
|
|
"""
|
|
for key, value in configs.items():
|
|
# 如果敏感字段传入的是脱敏值(含 ***),跳过不更新
|
|
if config_manager.is_secret_key(key) and value and "***" in value:
|
|
continue
|
|
|
|
result = await db.execute(
|
|
select(SystemConfig).where(
|
|
SystemConfig.config_group == group,
|
|
SystemConfig.config_key == key,
|
|
SystemConfig.is_deleted == False, # noqa: E712
|
|
)
|
|
)
|
|
config = result.scalar_one_or_none()
|
|
|
|
if config:
|
|
config.config_value = value
|
|
else:
|
|
config = SystemConfig(
|
|
config_group=group,
|
|
config_key=key,
|
|
config_value=value,
|
|
is_secret=key in SECRET_KEYS,
|
|
status=True,
|
|
)
|
|
db.add(config)
|
|
|
|
await db.commit()
|
|
|
|
# 清除该分组的 Redis 缓存
|
|
await config_manager.invalidate_group(group)
|
|
|
|
# 返回更新后的配置(脱敏)
|
|
return await cls.get_group_config(group, mask_secrets=True)
|
|
|
|
@classmethod
|
|
async def get_all_groups_config(cls, mask_secrets: bool = True) -> Dict[str, Dict[str, Any]]:
|
|
"""获取所有分组配置"""
|
|
result = {}
|
|
for group in GROUP_ENV_MAPPING:
|
|
result[group] = await cls.get_group_config(group, mask_secrets=mask_secrets)
|
|
return result
|
|
|
|
@classmethod
|
|
async def get_group_db_records(cls, db: AsyncSession, group: str) -> List[SystemConfig]:
|
|
"""获取分组在数据库中的记录"""
|
|
result = await db.execute(
|
|
select(SystemConfig).where(
|
|
SystemConfig.config_group == group,
|
|
SystemConfig.is_deleted == False, # noqa: E712
|
|
).order_by(SystemConfig.sort)
|
|
)
|
|
return list(result.scalars().all())
|
|
|
|
@classmethod
|
|
async def delete_group_config(cls, db: AsyncSession, group: str) -> bool:
|
|
"""删除分组配置(软删除)"""
|
|
result = await db.execute(
|
|
select(SystemConfig).where(
|
|
SystemConfig.config_group == group,
|
|
SystemConfig.is_deleted == False, # noqa: E712
|
|
)
|
|
)
|
|
configs = list(result.scalars().all())
|
|
for config in configs:
|
|
config.is_deleted = True
|
|
await db.commit()
|
|
|
|
# 清除缓存
|
|
await config_manager.invalidate_group(group)
|
|
return len(configs) > 0
|