Files
autoclip/backend/repositories/factory.py
T
Kris Ka 8ee2d50044 修复WebSocket进度更新和前端状态自动更新问题
- 修复WebSocketNotificationService.send_processing_progress方法参数不匹配问题
- 修复前端RealTimeStatus组件WebSocket消息处理逻辑
- 修复Celery Worker队列配置,确保任务正确路由到processing队列
- 修复Celery应用导入冲突,统一使用正确的celery_app配置
- 添加实时项目状态更新功能,前端无需手动刷新即可看到处理进度
- 完善系统启动脚本,修复PYTHONPATH未绑定变量错误
- 优化流水线处理逻辑,确保所有6个步骤正常执行
- 添加完整的项目文档和启动指南

测试结果:
- WebSocket进度更新正常工作(16%, 33%, 100%)
- 流水线处理完全正常(6个步骤全部成功)
- 前端状态自动更新正常
- 项目状态正确同步到数据库
2025-09-08 17:21:31 +08:00

149 lines
4.2 KiB
Python

"""
Repository工厂
提供统一的Repository实例化和管理
"""
from typing import Dict, Type
from sqlalchemy.orm import Session
from ..repositories.base import BaseRepository
from ..repositories.project_repository import ProjectRepository
from ..repositories.clip_repository import ClipRepository
from ..repositories.collection_repository import CollectionRepository
from ..repositories.task_repository import TaskRepository
class RepositoryFactory:
"""Repository工厂类"""
def __init__(self, db: Session):
"""
初始化Repository工厂
Args:
db: 数据库会话
"""
self.db = db
self._repositories: Dict[str, BaseRepository] = {}
def get_project_repository(self) -> ProjectRepository:
"""获取项目Repository"""
if "project" not in self._repositories:
self._repositories["project"] = ProjectRepository(self.db)
return self._repositories["project"]
def get_clip_repository(self) -> ClipRepository:
"""获取切片Repository"""
if "clip" not in self._repositories:
self._repositories["clip"] = ClipRepository(self.db)
return self._repositories["clip"]
def get_collection_repository(self) -> CollectionRepository:
"""获取合集Repository"""
if "collection" not in self._repositories:
self._repositories["collection"] = CollectionRepository(self.db)
return self._repositories["collection"]
def get_task_repository(self) -> TaskRepository:
"""获取任务Repository"""
if "task" not in self._repositories:
self._repositories["task"] = TaskRepository(self.db)
return self._repositories["task"]
def get_repository(self, repository_type: str) -> BaseRepository:
"""
根据类型获取Repository
Args:
repository_type: Repository类型
Returns:
Repository实例
"""
repository_map = {
"project": self.get_project_repository,
"clip": self.get_clip_repository,
"collection": self.get_collection_repository,
"task": self.get_task_repository
}
if repository_type not in repository_map:
raise ValueError(f"Unknown repository type: {repository_type}")
return repository_map[repository_type]()
def clear_cache(self):
"""清除Repository缓存"""
self._repositories.clear()
def __enter__(self):
"""上下文管理器入口"""
return self
def __exit__(self, exc_type, exc_val, exc_tb):
"""上下文管理器出口"""
self.clear_cache()
# 全局Repository工厂实例
_repository_factory: RepositoryFactory = None
def get_repository_factory(db: Session) -> RepositoryFactory:
"""
获取Repository工厂实例
Args:
db: 数据库会话
Returns:
Repository工厂实例
"""
global _repository_factory
if _repository_factory is None or _repository_factory.db != db:
_repository_factory = RepositoryFactory(db)
return _repository_factory
def get_project_repository(db: Session) -> ProjectRepository:
"""
获取项目Repository
Args:
db: 数据库会话
Returns:
项目Repository实例
"""
return get_repository_factory(db).get_project_repository()
def get_clip_repository(db: Session) -> ClipRepository:
"""
获取切片Repository
Args:
db: 数据库会话
Returns:
切片Repository实例
"""
return get_repository_factory(db).get_clip_repository()
def get_collection_repository(db: Session) -> CollectionRepository:
"""
获取合集Repository
Args:
db: 数据库会话
Returns:
合集Repository实例
"""
return get_repository_factory(db).get_collection_repository()
def get_task_repository(db: Session) -> TaskRepository:
"""
获取任务Repository
Args:
db: 数据库会话
Returns:
任务Repository实例
"""
return get_repository_factory(db).get_task_repository()