88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
from fastapi import APIRouter, Depends, HTTPException, status
|
|
from psycopg import AsyncConnection
|
|
from sqlalchemy import text
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.auth.project_dependencies import (
|
|
ProjectContext,
|
|
get_project_context,
|
|
get_project_pg_session,
|
|
get_project_timescale_connection,
|
|
get_metadata_repository,
|
|
)
|
|
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,
|
|
)
|
|
from app.infra.repositories.metadata_repository import MetadataRepository
|
|
|
|
router = APIRouter()
|
|
|
|
|
|
@router.get("/meta/project", response_model=ProjectMetaResponse)
|
|
async def get_project_metadata(
|
|
ctx: ProjectContext = Depends(get_project_context),
|
|
metadata_repo: MetadataRepository = Depends(get_metadata_repository),
|
|
):
|
|
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,
|
|
code=project.code,
|
|
description=project.description,
|
|
gs_workspace=project.gs_workspace,
|
|
status=project.status,
|
|
project_role=ctx.project_role,
|
|
geoserver=geoserver_payload,
|
|
)
|
|
|
|
|
|
@router.get("/meta/projects", response_model=list[ProjectSummaryResponse])
|
|
async def list_user_projects(
|
|
current_user=Depends(get_current_metadata_user),
|
|
metadata_repo: MetadataRepository = Depends(get_metadata_repository),
|
|
):
|
|
projects = await metadata_repo.list_projects_for_user(current_user.id)
|
|
return [
|
|
ProjectSummaryResponse(
|
|
project_id=project.project_id,
|
|
name=project.name,
|
|
code=project.code,
|
|
description=project.description,
|
|
gs_workspace=project.gs_workspace,
|
|
status=project.status,
|
|
project_role=project.project_role,
|
|
)
|
|
for project in projects
|
|
]
|
|
|
|
|
|
@router.get("/meta/db/health")
|
|
async def project_db_health(
|
|
pg_session: AsyncSession = Depends(get_project_pg_session),
|
|
ts_conn: AsyncConnection = Depends(get_project_timescale_connection),
|
|
):
|
|
await pg_session.execute(text("SELECT 1"))
|
|
async with ts_conn.cursor() as cur:
|
|
await cur.execute("SELECT 1")
|
|
return {"postgres": "ok", "timescale": "ok"}
|