97 lines
3.0 KiB
Python
97 lines
3.0 KiB
Python
import json
|
|
from typing import Any, Union, Dict, Optional
|
|
|
|
from app.db import DbOper
|
|
from app.db.models.userconfig import UserConfig
|
|
from app.schemas.types import UserConfigKey
|
|
from app.utils.object import ObjectUtils
|
|
from app.utils.singleton import Singleton
|
|
|
|
|
|
class UserConfigOper(DbOper, metaclass=Singleton):
|
|
# 配置缓存
|
|
__USERCONF: Dict[str, Dict[str, Any]] = {}
|
|
|
|
def __init__(self):
|
|
"""
|
|
加载配置到内存
|
|
"""
|
|
super().__init__()
|
|
for item in UserConfig.list(self._db):
|
|
value = json.loads(item.value) if ObjectUtils.is_obj(item.value) else item.value
|
|
self.__set_config_cache(username=item.username, key=item.key, value=value)
|
|
|
|
def set(self, username: str, key: Union[str, UserConfigKey], value: Any):
|
|
"""
|
|
设置用户配置
|
|
"""
|
|
if isinstance(key, UserConfigKey):
|
|
key = key.value
|
|
# 更新内存
|
|
self.__set_config_cache(username=username, key=key, value=value)
|
|
# 写入数据库
|
|
if ObjectUtils.is_obj(value):
|
|
value = json.dumps(value)
|
|
elif value is None:
|
|
value = ''
|
|
conf = UserConfig.get_by_key(db=self._db, username=username, key=key)
|
|
if conf:
|
|
if value:
|
|
conf.update(self._db, {"value": value})
|
|
else:
|
|
conf.delete(self._db, conf.id)
|
|
else:
|
|
conf = UserConfig(username=username, key=key, value=value)
|
|
conf.create(self._db)
|
|
|
|
def get(self, username: str, key: Union[str, UserConfigKey] = None) -> Any:
|
|
"""
|
|
获取用户配置
|
|
"""
|
|
if not username:
|
|
return self.__USERCONF
|
|
if isinstance(key, UserConfigKey):
|
|
key = key.value
|
|
if not key:
|
|
return self.__get_config_caches(username=username)
|
|
return self.__get_config_cache(username=username, key=key)
|
|
|
|
def __del__(self):
|
|
if self._db:
|
|
self._db.close()
|
|
|
|
def __set_config_cache(self, username: str, key: str, value: Any):
|
|
"""
|
|
设置配置缓存
|
|
"""
|
|
if not username or not key:
|
|
return
|
|
cache = self.__USERCONF
|
|
if not cache:
|
|
cache = {}
|
|
user_cache = cache.get(username)
|
|
if not user_cache:
|
|
user_cache = {}
|
|
cache[username] = user_cache
|
|
user_cache[key] = value
|
|
self.__USERCONF = cache
|
|
|
|
def __get_config_caches(self, username: str) -> Optional[Dict[str, Any]]:
|
|
"""
|
|
获取配置缓存
|
|
"""
|
|
if not username or not self.__USERCONF:
|
|
return None
|
|
return self.__USERCONF.get(username)
|
|
|
|
def __get_config_cache(self, username: str, key: str) -> Any:
|
|
"""
|
|
获取配置缓存
|
|
"""
|
|
if not username or not key or not self.__USERCONF:
|
|
return None
|
|
user_cache = self.__get_config_caches(username)
|
|
if not user_cache:
|
|
return None
|
|
return user_cache.get(key)
|