diff --git a/apps/api/app/api/routes/voices.py b/apps/api/app/api/routes/voices.py index 9e39beebd..d7cf61252 100644 --- a/apps/api/app/api/routes/voices.py +++ b/apps/api/app/api/routes/voices.py @@ -137,56 +137,42 @@ def list_voices_unified( preset_count = 0 clone_count = 0 + has_preset = type is None or type == "preset" + has_clone = type is None or type == "clone" + # 获取预置音色 - if type is None or type == "preset": + if has_preset: preset_items = [_preset_to_unified_response(p) for p in PRESET_VOICES] preset_count = len(preset_items) - if type == "preset": - # 仅预置:应用分页 - items = preset_items[skip : skip + limit] - else: - items.extend(preset_items) # 获取克隆音色 - if type is None or type == "clone": + if has_clone: use_case = ListVoiceLibraryUseCase(voice_repository) - clone_items_raw = use_case.execute(user_id, status=status_filter, skip=0, limit=1000) + clone_items_raw = use_case.execute(user_id, status=status_filter, skip=skip, limit=limit) clone_items = [_to_unified_response(i) for i in clone_items_raw] - clone_count = len(clone_items) - if type == "clone": - # 仅克隆:应用分页 - items = clone_items[skip : skip + limit] - else: - items.extend(clone_items) + clone_count = voice_repository.count_by_user(user_id, status=status_filter) if status_filter else voice_repository.count_by_user(user_id) - # 全量模式:应用分页 - if type is None: - total = preset_count + clone_count - items = items[skip : skip + limit] - elif type == "preset": + # 组装结果 + if type == "preset": + items = preset_items[skip : skip + limit] total = preset_count + elif type == "clone": + items = clone_items + total = clone_count else: - total = clone_repository_count(voice_repository, user_id, status_filter) + # 全量模式:预置在前,克隆补位 + all_items = preset_items + clone_items + total = preset_count + clone_count + items = all_items[skip : skip + limit] return UnifiedVoiceListResponse( items=items, total=total, - preset_count=preset_count if type != "clone" else 0, - clone_count=clone_count if type != "preset" else 0, + preset_count=preset_count if has_preset else 0, + clone_count=clone_count if has_clone else 0, ) -def clone_repository_count( - voice_repository: SQLAlchemyVoiceLibraryRepository, - user_id: str, - status_filter: Optional[str], -) -> int: - """获取克隆音色数量。""" - if status_filter: - return voice_repository.count_by_user(user_id, status=status_filter) - return voice_repository.count_by_user(user_id) - - # ==================== 预置音色专用端点 ==================== diff --git a/packages/adapters/sqlalchemy_impl/voice_library_repository.py b/packages/adapters/sqlalchemy_impl/voice_library_repository.py index c0875c0f3..673d438c8 100644 --- a/packages/adapters/sqlalchemy_impl/voice_library_repository.py +++ b/packages/adapters/sqlalchemy_impl/voice_library_repository.py @@ -110,15 +110,17 @@ class SQLAlchemyVoiceLibraryRepository: self.session.commit() return True - def count_by_user(self, user_id: str) -> int: - return ( + def count_by_user(self, user_id: str, *, status: Optional[str] = None) -> int: + query = ( self.session.query(VoiceLibraryModel) .filter( VoiceLibraryModel.user_id == user_id, VoiceLibraryModel.status != "deleted", ) - .count() ) + if status: + query = query.filter(VoiceLibraryModel.status == status) + return query.count() @staticmethod def _model_to_entity(model: VoiceLibraryModel) -> VoiceLibraryItem: