From 47533e703739130eb46724cfffb0b2d8361beb3f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?API=E6=96=87=E6=A1=A3=E7=BB=B4=E6=8A=A4Agent?= Date: Sun, 28 Jun 2026 21:33:07 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E4=BF=AE=E5=A4=8D=E6=A0=87=E9=A2=98/?= =?UTF-8?q?=E9=85=8D=E9=9F=B3=E5=88=9B=E5=BB=BA500=E3=80=81=E7=B4=A0?= =?UTF-8?q?=E6=9D=90=E5=BA=93=E5=88=97=E8=A1=A8500=E3=80=81CORS=E7=BC=BA?= =?UTF-8?q?=E5=A4=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - titles.py/voices.py: get_by_id → find_by_id(方法名错误导致AttributeError) - project_repository.py: cast shared_users to JSONB for @> operator(JSON列不支持@>) - main.py: CORS allow_origins 添加 https://saas.xiaoxiajianji.com --- apps/api/app/api/routes/titles.py | 2 +- apps/api/app/api/routes/voices.py | 2 +- apps/api/main.py | 4 ++-- packages/adapters/sqlalchemy_impl/project_repository.py | 7 ++++--- 4 files changed, 8 insertions(+), 7 deletions(-) diff --git a/apps/api/app/api/routes/titles.py b/apps/api/app/api/routes/titles.py index 05deda4f7..7ed4b6285 100644 --- a/apps/api/app/api/routes/titles.py +++ b/apps/api/app/api/routes/titles.py @@ -51,7 +51,7 @@ def _to_response(item) -> TitleLibraryItemResponse: def _get_user_plan(user_id: str, user_repository: UserRepository) -> str: - user = user_repository.get_by_id(user_id) + user = user_repository.find_by_id(user_id) if user is None: return "free" return getattr(user, "subscription_plan", "free") or "free" diff --git a/apps/api/app/api/routes/voices.py b/apps/api/app/api/routes/voices.py index 17fa79fed..ed210e81b 100644 --- a/apps/api/app/api/routes/voices.py +++ b/apps/api/app/api/routes/voices.py @@ -55,7 +55,7 @@ def _to_response(item) -> VoiceLibraryItemResponse: def _get_user_plan(user_id: str, user_repository: UserRepository) -> str: - user = user_repository.get_by_id(user_id) + user = user_repository.find_by_id(user_id) if user is None: return "free" return getattr(user, "subscription_plan", "free") or "free" diff --git a/apps/api/main.py b/apps/api/main.py index 8ee30c7c0..e2e209207 100644 --- a/apps/api/main.py +++ b/apps/api/main.py @@ -41,8 +41,8 @@ else: # In production, filter out any wildcard "*" origins allow_origins = [origin for origin in settings.CORS_ORIGINS if origin != "*"] if not allow_origins: - # Default to production domain if no valid origins configured - allow_origins = ["https://xiaoxiajianji.com"] + # Default to production domains if no valid origins configured + allow_origins = ["https://xiaoxiajianji.com", "https://saas.xiaoxiajianji.com"] app.add_middleware( CORSMiddleware, diff --git a/packages/adapters/sqlalchemy_impl/project_repository.py b/packages/adapters/sqlalchemy_impl/project_repository.py index 963fd0681..fbd4795fd 100644 --- a/packages/adapters/sqlalchemy_impl/project_repository.py +++ b/packages/adapters/sqlalchemy_impl/project_repository.py @@ -54,12 +54,13 @@ class SQLAlchemyProjectRepository: def find_accessible_projects(self, user_id: str) -> list[Project]: """查找用户可访问的所有项目(自己拥有的 + 被共享的)""" - from sqlalchemy import or_ - + from sqlalchemy import or_, cast + from sqlalchemy.dialects.postgresql import JSONB + models = self.session.query(ProjectModel).filter( or_( ProjectModel.owner_user_id == user_id, - ProjectModel.shared_users.contains([user_id]) + cast(ProjectModel.shared_users, JSONB).contains([user_id]) ) ).all() return [self._to_entity(model) for model in models] -- 2.54.0