Files
FastapiAdmin/backend/app/api/v1/services/system/config_service.py
T
zhangtao 7892121066 refactor: 重构Redis依赖注入以提升代码可维护性
将Redis依赖从Request对象中解耦,改为通过Depends注入,提高代码的可测试性和可维护性
2025-04-15 04:25:07 +08:00

95 lines
3.7 KiB
Python

# -*- coding: utf-8 -*-
import json
from typing import Dict
from aioredis import Redis
from fastapi import UploadFile
from sqlalchemy.ext.asyncio import AsyncSession
from aioredis import Redis
from app.api.v1.schemas.system.auth_schema import AuthSchema
from app.api.v1.schemas.system.config_schema import ConfigOutSchema, ConfigUpdateSchema
from app.api.v1.cruds.system.config_crud import ConfigCRUD
from app.common.enums import RedisInitKeyConfig
from app.core.redis_crud import RedisCURD
from app.utils.upload_util import UploadUtil
from app.core.base_schema import UploadResponseSchema
from app.core.exceptions import CustomException
from app.config.setting import settings
from app.core.logger import logger
class ConfigService:
"""
配置管理模块服务层
"""
@classmethod
async def get_service(cls, auth: AuthSchema, id: int) -> Dict:
config_obj = await ConfigCRUD(auth).get_crud(id=id)
return ConfigOutSchema.model_validate(config_obj).model_dump()
@classmethod
async def update_service(cls, auth: AuthSchema, redis: Redis, data: ConfigUpdateSchema) -> bool:
new_obj = await ConfigCRUD(auth).update_crud(id=data.id, data=data)
new_obj_dict = ConfigOutSchema.model_validate(new_obj).model_dump()
# 保存到Redis并设置过期时间
redis_key = f"{RedisInitKeyConfig.System_Config.key}:{'init_system_config'}"
try:
value = json.dumps(new_obj_dict, ensure_ascii=False)
await RedisCURD(redis).set(
key=redis_key,
value=value,
expire=settings.ACCESS_TOKEN_EXPIRE_MINUTES * 60
)
logger.info(f"更新系统配置成功: {new_obj_dict}")
return True
except Exception as e:
logger.error(f"更新系统配置失败: {e}")
raise CustomException(msg="更新系统配置失败")
return new_obj_dict
@classmethod
async def upload_service(cls, base_url: str, file: UploadFile) -> Dict:
"""上传文件"""
if not file:
raise CustomException(msg="请选择要上传的文件")
filename, filepath = await UploadUtil.upload_file(file=file)
return UploadResponseSchema(
file_path=f'{filepath}',
file_name=filename,
origin_name=file.filename,
file_url=f'{base_url}{filepath}',
).model_dump()
@classmethod
async def init_config_service(cls, redis: Redis, db: AsyncSession)-> None:
auth = AuthSchema(db=db)
config_obj = await ConfigCRUD(auth).get_crud(id=1)
config_obj_dict = ConfigOutSchema.model_validate(config_obj).model_dump()
# 保存到Redis并设置过期时间
redis_key = f"{RedisInitKeyConfig.System_Config.key}:{'init_system_config'}"
try:
value = json.dumps(config_obj_dict, ensure_ascii=False)
await RedisCURD(redis).set(
key=redis_key,
value=value,
expire=settings.ACCESS_TOKEN_EXPIRE_MINUTES * 60
)
except Exception as e:
logger.error(f"初始化系统配置失败: {e}")
raise CustomException(msg="初始化系统配置失败")
@classmethod
async def get_init_config_service(cls, redis: Redis) -> Dict:
"""获取系统配置"""
redis_key = f"{RedisInitKeyConfig.System_Config.key}:{'init_system_config'}"
config_obj_list_dict = await RedisCURD(redis).get(redis_key)
if not config_obj_list_dict:
raise CustomException(msg="系统配置不存在")
return json.loads(config_obj_list_dict)