refactor: isolate media server and site userdata queries

This commit is contained in:
jxxghp
2026-08-23 14:15:37 +08:00
parent be1071b6cd
commit d8b8583d49
11 changed files with 202 additions and 110 deletions
+48 -18
View File
@@ -1,5 +1,6 @@
from typing import Optional
from typing import Optional, Union
from sqlalchemy.ext.asyncio import AsyncSession
from sqlalchemy.orm import Session
from app.db.base import DbOper
@@ -11,7 +12,11 @@ class MediaServerOper(DbOper):
媒体服务器数据管理
"""
def __init__(self, db: Optional[Session] = None):
def __init__(
self,
db: Optional[Union[Session, AsyncSession]] = None,
) -> None:
"""保存调用方提供的同步或异步查询会话。"""
super().__init__(db)
@staticmethod
@@ -34,7 +39,12 @@ class MediaServerOper(DbOper):
if not server or not item_id:
return False
item = MediaServerItem(**kwargs)
if not item.get_by_server_itemid(self._db, server, item_id):
existing = self._execute_sync_query(
lambda session: MediaServerItem.get_by_server_itemid(
session, server, item_id
)
)
if not existing:
self._stage_create(item)
return True
return False
@@ -49,7 +59,11 @@ class MediaServerOper(DbOper):
if not server or not item_id:
return False
item = MediaServerItem.get_by_server_itemid(self._db, server, item_id)
item = self._execute_sync_query(
lambda session: MediaServerItem.get_by_server_itemid(
session, server, item_id
)
)
if item:
self._stage_update(item, kwargs)
return False
@@ -93,16 +107,24 @@ class MediaServerOper(DbOper):
判断媒体服务器数据是否存在
"""
if kwargs.get("media_source") and kwargs.get("media_id"):
item = MediaServerItem.exist_by_media_identity(
self._db,
media_source=kwargs.get("media_source"),
media_id=kwargs.get("media_id"),
mtype=kwargs.get("mtype"),
item = self._execute_sync_query(
lambda session: MediaServerItem.exist_by_media_identity(
session,
media_source=kwargs.get("media_source"),
media_id=kwargs.get("media_id"),
mtype=kwargs.get("mtype"),
)
)
elif kwargs.get("title"):
# 按标题、类型、年份查
item = MediaServerItem.exists_by_title(self._db, title=kwargs.get("title"),
mtype=kwargs.get("mtype"), year=kwargs.get("year"))
item = self._execute_sync_query(
lambda session: MediaServerItem.exists_by_title(
session,
title=kwargs.get("title"),
mtype=kwargs.get("mtype"),
year=kwargs.get("year"),
)
)
else:
return None
if not item:
@@ -122,16 +144,24 @@ class MediaServerOper(DbOper):
异步判断媒体服务器数据是否存在
"""
if kwargs.get("media_source") and kwargs.get("media_id"):
item = await MediaServerItem.async_exist_by_media_identity(
self._db,
media_source=kwargs.get("media_source"),
media_id=kwargs.get("media_id"),
mtype=kwargs.get("mtype"),
item = await self._execute_async_query(
lambda session: MediaServerItem.async_exist_by_media_identity(
session,
media_source=kwargs.get("media_source"),
media_id=kwargs.get("media_id"),
mtype=kwargs.get("mtype"),
)
)
elif kwargs.get("title"):
# 按标题、类型、年份查
item = await MediaServerItem.async_exists_by_title(self._db, title=kwargs.get("title"),
mtype=kwargs.get("mtype"), year=kwargs.get("year"))
item = await self._execute_async_query(
lambda session: MediaServerItem.async_exists_by_title(
session,
title=kwargs.get("title"),
mtype=kwargs.get("mtype"),
year=kwargs.get("year"),
)
)
else:
return None
if not item:
+32 -8
View File
@@ -280,7 +280,13 @@ class SiteOper(DbOper):
"err_msg": payload.get("err_msg") or ""
})
# 按站点+天判断是否存在数据
siteuserdatas = SiteUserData.get_by_domain(self._db, domain=domain, workdate=current_day)
siteuserdatas = self._execute_sync_query(
lambda session: SiteUserData.get_by_domain(
session,
domain=domain,
workdate=current_day,
)
)
if siteuserdatas:
# 存在则更新
if not payload.get("err_msg"):
@@ -294,13 +300,21 @@ class SiteOper(DbOper):
"""
获取站点用户数据
"""
return SiteUserData.list(self._db)
return self._execute_sync_query(
lambda session: SiteUserData.list(session)
)
def get_userdata_by_domain(self, domain: str, workdate: Optional[str] = None) -> List[SiteUserData]:
"""
获取站点用户数据
"""
return SiteUserData.get_by_domain(self._db, domain=domain, workdate=workdate)
return self._execute_sync_query(
lambda session: SiteUserData.get_by_domain(
session,
domain=domain,
workdate=workdate,
)
)
async def async_get_userdata_by_domain(
self, domain: str, workdate: Optional[str] = None
@@ -308,13 +322,19 @@ class SiteOper(DbOper):
"""
异步获取站点用户数据。
"""
return await SiteUserData.async_get_by_domain(
self._db, domain=domain, workdate=workdate
return await self._execute_async_query(
lambda session: SiteUserData.async_get_by_domain(
session,
domain=domain,
workdate=workdate,
)
)
async def async_get_userdata_latest(self) -> List[SiteUserData]:
"""异步获取各站点最新用户数据。"""
return await SiteUserData.async_get_latest(self._db)
return await self._execute_async_query(
lambda session: SiteUserData.async_get_latest(session)
)
async def async_get_icon_by_domain(self, domain: str) -> Optional[SiteIcon]:
"""异步按域名获取站点图标。"""
@@ -335,13 +355,17 @@ class SiteOper(DbOper):
"""
获取站点用户数据
"""
return SiteUserData.get_by_date(self._db, date)
return self._execute_sync_query(
lambda session: SiteUserData.get_by_date(session, date)
)
def get_userdata_latest(self) -> List[SiteUserData]:
"""
获取站点最新数据
"""
return SiteUserData.get_latest(self._db)
return self._execute_sync_query(
lambda session: SiteUserData.get_latest(session)
)
def get_icon_by_domain(self, domain: str) -> Optional[SiteIcon]:
"""