mirror of
https://github.com/jxxghp/MoviePilot.git
synced 2026-09-05 07:27:15 +08:00
fix: preserve runtime settings and user config compatibility
This commit is contained in:
@@ -1,9 +1,13 @@
|
||||
from typing import Any, Union, Dict, Optional
|
||||
from typing import Any, Union, Dict, Optional, List
|
||||
|
||||
from sqlalchemy import select
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.db.base import DbOper
|
||||
from app.db.models.userconfig import UserConfig
|
||||
from app.schemas.types import UserConfigKey
|
||||
from app.foundation.singleton import Singleton
|
||||
from app.db.decorators import run_legacy_sync_query
|
||||
|
||||
|
||||
class UserConfigOper(DbOper, metaclass=Singleton):
|
||||
@@ -16,9 +20,29 @@ class UserConfigOper(DbOper, metaclass=Singleton):
|
||||
"""
|
||||
super().__init__()
|
||||
self.__USERCONF = {}
|
||||
for item in UserConfig.list(self._db):
|
||||
for item in self._list_configs():
|
||||
self.__set_config_cache(username=item.username, key=item.key, value=item.value)
|
||||
|
||||
def _with_sync_session(self, operation):
|
||||
"""在显式会话或兼容查询会话中执行只读操作。"""
|
||||
if isinstance(self._db, Session):
|
||||
return operation(self._db)
|
||||
return run_legacy_sync_query(operation)
|
||||
|
||||
def _list_configs(self) -> List[UserConfig]:
|
||||
"""读取全部用户配置,避免把 None 会话传入已显式化的 Model。"""
|
||||
return self._with_sync_session(
|
||||
lambda session: list(session.execute(select(UserConfig)).scalars().all())
|
||||
)
|
||||
|
||||
def _get_by_key(self, username: str, key: str) -> Optional[UserConfig]:
|
||||
"""按用户名和键读取配置,复用调用方事务或一次性兼容会话。"""
|
||||
return self._with_sync_session(
|
||||
lambda session: UserConfig.get_by_key(
|
||||
db=session, username=username, key=key
|
||||
)
|
||||
)
|
||||
|
||||
def set(self, username: str, key: Union[str, UserConfigKey], value: Any):
|
||||
"""
|
||||
设置用户配置
|
||||
@@ -28,7 +52,7 @@ class UserConfigOper(DbOper, metaclass=Singleton):
|
||||
# 更新内存
|
||||
self.__set_config_cache(username=username, key=key, value=value)
|
||||
# 写入数据库
|
||||
conf = UserConfig.get_by_key(db=self._db, username=username, key=key)
|
||||
conf = self._get_by_key(username=username, key=key)
|
||||
if conf:
|
||||
if value:
|
||||
self._stage_update(conf, {"value": value})
|
||||
|
||||
Reference in New Issue
Block a user