From 4b02118286d21609816cd6357415a22e981f3241 Mon Sep 17 00:00:00 2001 From: Huarch Date: Sat, 13 Jun 2026 14:58:53 +0800 Subject: [PATCH] refactor(metadata): drop geoserver config refs --- app/api/v1/endpoints/meta.py | 16 +------ app/api/v1/endpoints/project.py | 13 +----- app/domain/schemas/metadata.py | 9 ---- app/infra/db/metadb/models.py | 20 -------- .../repositories/metadata_repository.py | 46 ------------------- tests/api/test_meta_endpoints.py | 5 -- tests/api/test_project_endpoints.py | 10 +--- 7 files changed, 3 insertions(+), 116 deletions(-) diff --git a/app/api/v1/endpoints/meta.py b/app/api/v1/endpoints/meta.py index c6a6f45..c46fbcb 100644 --- a/app/api/v1/endpoints/meta.py +++ b/app/api/v1/endpoints/meta.py @@ -16,7 +16,6 @@ from app.auth.project_dependencies import ( from app.auth.metadata_dependencies import get_current_metadata_user from app.core.config import settings from app.domain.schemas.metadata import ( - GeoServerConfigResponse, ProjectMetaResponse, ProjectSummaryResponse, ) @@ -34,25 +33,13 @@ async def get_project_metadata( """ 获取项目元数据 - 返回当前项目的完整元数据,包括项目基本信息和GeoServer配置 + 返回当前项目的完整元数据 """ project = await metadata_repo.get_project_by_id(ctx.project_id) if not project: raise HTTPException( status_code=status.HTTP_404_NOT_FOUND, detail="Project not found" ) - geoserver = await metadata_repo.get_geoserver_config(ctx.project_id) - geoserver_payload = ( - GeoServerConfigResponse( - gs_base_url=geoserver.gs_base_url, - gs_admin_user=geoserver.gs_admin_user, - gs_datastore_name=geoserver.gs_datastore_name, - default_extent=geoserver.default_extent, - srid=geoserver.srid, - ) - if geoserver - else None - ) return ProjectMetaResponse( project_id=project.id, name=project.name, @@ -62,7 +49,6 @@ async def get_project_metadata( map_extent=project.map_extent, status=project.status, project_role=ctx.project_role, - geoserver=geoserver_payload, ) diff --git a/app/api/v1/endpoints/project.py b/app/api/v1/endpoints/project.py index a14c681..12f5d42 100644 --- a/app/api/v1/endpoints/project.py +++ b/app/api/v1/endpoints/project.py @@ -4,7 +4,7 @@ from fastapi.responses import PlainTextResponse from typing import Any, Dict, List from app.infra.db.metadb.repositories.metadata_repository import MetadataRepository from app.auth.project_dependencies import get_metadata_repository -from app.domain.schemas.metadata import ProjectMetaResponse, GeoServerConfigResponse +from app.domain.schemas.metadata import ProjectMetaResponse import app.services.project_info as project_info from app.infra.db.postgresql.database import get_database_instance as get_pg_db from app.infra.db.timescaledb.database import get_database_instance as get_ts_db @@ -57,16 +57,6 @@ async def get_project_info_endpoint( if not project_detail: raise HTTPException(status_code=404, detail=f"Project {network} not found") - geoserver_payload = None - if project_detail.geoserver: - geoserver_payload = GeoServerConfigResponse( - gs_base_url=project_detail.geoserver.gs_base_url, - gs_admin_user=project_detail.geoserver.gs_admin_user, - gs_datastore_name=project_detail.geoserver.gs_datastore_name, - default_extent=project_detail.geoserver.default_extent, - srid=project_detail.geoserver.srid, - ) - return ProjectMetaResponse( project_id=project_detail.project_id, name=project_detail.name, @@ -76,7 +66,6 @@ async def get_project_info_endpoint( map_extent=project_detail.map_extent, status=project_detail.status, project_role="viewer", - geoserver=geoserver_payload, ) @router.get("/listprojects/", summary="获取项目列表", description="获取服务器上所有可用的供水管网项目名称列表。") diff --git a/app/domain/schemas/metadata.py b/app/domain/schemas/metadata.py index db3220a..f161a5f 100644 --- a/app/domain/schemas/metadata.py +++ b/app/domain/schemas/metadata.py @@ -4,14 +4,6 @@ from uuid import UUID from pydantic import BaseModel -class GeoServerConfigResponse(BaseModel): - gs_base_url: Optional[str] = None - gs_admin_user: Optional[str] = None - gs_datastore_name: str - default_extent: Optional[dict] = None - srid: int - - class ProjectMetaResponse(BaseModel): project_id: UUID name: str @@ -21,7 +13,6 @@ class ProjectMetaResponse(BaseModel): map_extent: Optional[dict] = None status: str project_role: str - geoserver: Optional[GeoServerConfigResponse] = None class ProjectSummaryResponse(BaseModel): diff --git a/app/infra/db/metadb/models.py b/app/infra/db/metadb/models.py index 6236080..5588954 100644 --- a/app/infra/db/metadb/models.py +++ b/app/infra/db/metadb/models.py @@ -64,26 +64,6 @@ class ProjectDatabase(Base): pool_max_size: Mapped[int] = mapped_column(Integer, default=10) -class ProjectGeoServerConfig(Base): - __tablename__ = "project_geoserver_configs" - - id: Mapped[UUID] = mapped_column(PGUUID(as_uuid=True), primary_key=True) - project_id: Mapped[UUID] = mapped_column( - PGUUID(as_uuid=True), unique=True, index=True - ) - gs_base_url: Mapped[str | None] = mapped_column(Text, nullable=True) - gs_admin_user: Mapped[str | None] = mapped_column(String(50), nullable=True) - gs_admin_password_encrypted: Mapped[str | None] = mapped_column( - Text, nullable=True - ) - gs_datastore_name: Mapped[str] = mapped_column(String(100), default="ds_postgis") - default_extent: Mapped[dict | None] = mapped_column(JSONB, nullable=True) - srid: Mapped[int] = mapped_column(Integer, default=4326) - updated_at: Mapped[datetime] = mapped_column( - DateTime(timezone=True), default=datetime.utcnow - ) - - class UserProjectMembership(Base): __tablename__ = "user_project_membership" diff --git a/app/infra/db/metadb/repositories/metadata_repository.py b/app/infra/db/metadb/repositories/metadata_repository.py index 89b2ae3..27e528b 100644 --- a/app/infra/db/metadb/repositories/metadata_repository.py +++ b/app/infra/db/metadb/repositories/metadata_repository.py @@ -8,9 +8,7 @@ from sqlalchemy.ext.asyncio import AsyncSession from app.core.encryption import ( get_database_encryptor, - get_encryptor, is_database_encryption_configured, - is_encryption_configured, ) from app.infra.db.metadb import models @@ -43,17 +41,6 @@ class ProjectDbRouting: pool_max_size: int -@dataclass(frozen=True) -class ProjectGeoServerInfo: - project_id: UUID - gs_base_url: Optional[str] - gs_admin_user: Optional[str] - gs_admin_password: Optional[str] - gs_datastore_name: str - default_extent: Optional[dict] - srid: int - - @dataclass(frozen=True) class ProjectSummary: project_id: UUID @@ -75,7 +62,6 @@ class ProjectDetail: gs_workspace: str map_extent: Optional[dict] status: str - geoserver: Optional[ProjectGeoServerInfo] class MetadataRepository: @@ -113,8 +99,6 @@ class MetadataRepository: if not project: return None - geoserver = await self.get_geoserver_config(project.id) - return ProjectDetail( project_id=project.id, name=project.name, @@ -123,7 +107,6 @@ class MetadataRepository: gs_workspace=project.gs_workspace, map_extent=project.map_extent, status=project.status, - geoserver=geoserver, ) async def get_membership_role( @@ -169,35 +152,6 @@ class MetadataRepository: pool_max_size=record.pool_max_size, ) - async def get_geoserver_config( - self, project_id: UUID - ) -> Optional[ProjectGeoServerInfo]: - result = await self.session.execute( - select(models.ProjectGeoServerConfig).where( - models.ProjectGeoServerConfig.project_id == project_id - ) - ) - record = result.scalar_one_or_none() - if not record: - return None - if record.gs_admin_password_encrypted: - if is_encryption_configured(): - encryptor = get_encryptor() - password = encryptor.decrypt(record.gs_admin_password_encrypted) - else: - password = record.gs_admin_password_encrypted - else: - password = None - return ProjectGeoServerInfo( - project_id=record.project_id, - gs_base_url=record.gs_base_url, - gs_admin_user=record.gs_admin_user, - gs_admin_password=password, - gs_datastore_name=record.gs_datastore_name, - default_extent=record.default_extent, - srid=record.srid, - ) - async def list_projects_for_user(self, user_id: UUID) -> List[ProjectSummary]: stmt = ( select(models.Project, models.UserProjectMembership.project_role) diff --git a/tests/api/test_meta_endpoints.py b/tests/api/test_meta_endpoints.py index 4b1c89b..c550e36 100644 --- a/tests/api/test_meta_endpoints.py +++ b/tests/api/test_meta_endpoints.py @@ -38,7 +38,6 @@ async def test_meta_project_returns_map_extent(monkeypatch): project_id = uuid4() repo = SimpleNamespace( get_project_by_id=lambda _project_id: None, - get_geoserver_config=lambda _project_id: None, ) async def get_project_by_id(_project_id): @@ -52,11 +51,7 @@ async def test_meta_project_returns_map_extent(monkeypatch): status="active", ) - async def get_geoserver_config(_project_id): - return None - repo.get_project_by_id = get_project_by_id - repo.get_geoserver_config = get_geoserver_config response = await module.get_project_metadata( ctx=SimpleNamespace( diff --git a/tests/api/test_project_endpoints.py b/tests/api/test_project_endpoints.py index f7b1059..6ed23da 100644 --- a/tests/api/test_project_endpoints.py +++ b/tests/api/test_project_endpoints.py @@ -81,7 +81,7 @@ async def test_project_info_returns_404_when_missing(monkeypatch): @pytest.mark.anyio -async def test_project_info_returns_geoserver_payload(monkeypatch): +async def test_project_info_returns_project_metadata(monkeypatch): module = _load_project_module(monkeypatch) detail = SimpleNamespace( project_id=uuid4(), @@ -91,13 +91,6 @@ async def test_project_info_returns_geoserver_payload(monkeypatch): gs_workspace="ws", map_extent={"xmin": 1, "ymin": 2, "xmax": 3, "ymax": 4}, status="active", - geoserver=SimpleNamespace( - gs_base_url="http://gs", - gs_admin_user="admin", - gs_datastore_name="store", - default_extent={"xmin": 1, "ymin": 2, "xmax": 3, "ymax": 4}, - srid=4326, - ), ) repo = SimpleNamespace(get_project_detail_by_code=AsyncMock(return_value=detail)) @@ -105,4 +98,3 @@ async def test_project_info_returns_geoserver_payload(monkeypatch): assert payload.code == "demo" assert payload.map_extent == {"xmin": 1, "ymin": 2, "xmax": 3, "ymax": 4} - assert payload.geoserver.gs_base_url == "http://gs"