92 lines
2.4 KiB
Python
92 lines
2.4 KiB
Python
"""Project database catalog and registered-table CRUD APIs."""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any
|
|
|
|
from fastapi import APIRouter, HTTPException, Query
|
|
|
|
from app.auth import CurrentUser
|
|
from app.data_platform.record_service import (
|
|
create_record,
|
|
delete_record,
|
|
list_databases,
|
|
list_records,
|
|
list_tables,
|
|
update_record,
|
|
)
|
|
from app.data_platform.schema import ensure_all_project_databases
|
|
|
|
router = APIRouter(prefix="/data-platform")
|
|
|
|
|
|
@router.get("/databases")
|
|
async def databases(_user: CurrentUser):
|
|
return await list_databases()
|
|
|
|
|
|
@router.post("/databases/initialize")
|
|
async def initialize_databases(user: CurrentUser):
|
|
if "admin" not in user.get("roles", []):
|
|
raise HTTPException(403, "只有系统管理员可以初始化项目数据库")
|
|
await ensure_all_project_databases()
|
|
return {"ok": True}
|
|
|
|
|
|
@router.get("/databases/{project_id}/tables")
|
|
async def tables(project_id: str, _user: CurrentUser):
|
|
return await list_tables(project_id)
|
|
|
|
|
|
@router.get("/databases/{project_id}/tables/{table_code}/records")
|
|
async def records(
|
|
project_id: str,
|
|
table_code: str,
|
|
_user: CurrentUser,
|
|
page: int = Query(default=1, ge=1),
|
|
page_size: int = Query(default=50, ge=1, le=200),
|
|
search: str | None = None,
|
|
sort_field: str | None = None,
|
|
sort_order: str = Query(default="desc", pattern="^(asc|desc)$"),
|
|
):
|
|
return await list_records(
|
|
project_id,
|
|
table_code,
|
|
page=page,
|
|
page_size=page_size,
|
|
search=search,
|
|
sort_field=sort_field,
|
|
sort_order=sort_order,
|
|
)
|
|
|
|
|
|
@router.post("/databases/{project_id}/tables/{table_code}/records")
|
|
async def add_record(
|
|
project_id: str,
|
|
table_code: str,
|
|
body: dict[str, Any],
|
|
user: CurrentUser,
|
|
):
|
|
return await create_record(project_id, table_code, body, user["username"])
|
|
|
|
|
|
@router.patch("/databases/{project_id}/tables/{table_code}/records/{record_id}")
|
|
async def edit_record(
|
|
project_id: str,
|
|
table_code: str,
|
|
record_id: str,
|
|
body: dict[str, Any],
|
|
user: CurrentUser,
|
|
):
|
|
return await update_record(project_id, table_code, record_id, body, user["username"])
|
|
|
|
|
|
@router.delete("/databases/{project_id}/tables/{table_code}/records/{record_id}")
|
|
async def remove_record(
|
|
project_id: str,
|
|
table_code: str,
|
|
record_id: str,
|
|
user: CurrentUser,
|
|
):
|
|
return await delete_record(project_id, table_code, record_id, user["username"])
|
|
|