From 473eece89680bc740fcafc1c9d491402a5f5cfb9 Mon Sep 17 00:00:00 2001 From: CREDO23 Date: Thu, 9 Apr 2026 12:10:37 +0200 Subject: [PATCH] feat: add export route skeleton --- surfsense_backend/app/routes/__init__.py | 2 + surfsense_backend/app/routes/export_routes.py | 38 +++++++++++++++++++ 2 files changed, 40 insertions(+) create mode 100644 surfsense_backend/app/routes/export_routes.py diff --git a/surfsense_backend/app/routes/__init__.py b/surfsense_backend/app/routes/__init__.py index 02367606b..443b8cc93 100644 --- a/surfsense_backend/app/routes/__init__.py +++ b/surfsense_backend/app/routes/__init__.py @@ -13,6 +13,7 @@ from .discord_add_connector_route import router as discord_add_connector_router from .documents_routes import router as documents_router from .dropbox_add_connector_route import router as dropbox_add_connector_router from .editor_routes import router as editor_router +from .export_routes import router as export_router from .folders_routes import router as folders_router from .google_calendar_add_connector_route import ( router as google_calendar_add_connector_router, @@ -57,6 +58,7 @@ router = APIRouter() router.include_router(search_spaces_router) router.include_router(rbac_router) # RBAC routes for roles, members, invites router.include_router(editor_router) +router.include_router(export_router) router.include_router(documents_router) router.include_router(folders_router) router.include_router(notes_router) diff --git a/surfsense_backend/app/routes/export_routes.py b/surfsense_backend/app/routes/export_routes.py new file mode 100644 index 000000000..0bc5b4d1c --- /dev/null +++ b/surfsense_backend/app/routes/export_routes.py @@ -0,0 +1,38 @@ +"""Routes for exporting knowledge base content as ZIP.""" + +import logging + +from fastapi import APIRouter, Depends, Query +from sqlalchemy.ext.asyncio import AsyncSession + +from app.db import Permission, User, get_async_session +from app.users import current_active_user +from app.utils.rbac import check_permission + +logger = logging.getLogger(__name__) + +router = APIRouter() + + +@router.get("/search-spaces/{search_space_id}/export") +async def export_knowledge_base( + search_space_id: int, + folder_id: int | None = Query(None, description="Export only this folder's subtree"), + session: AsyncSession = Depends(get_async_session), + user: User = Depends(current_active_user), +): + """Export documents as a ZIP of markdown files preserving folder structure. + + If folder_id is provided, only that folder's subtree is exported. + Otherwise, the entire search space is exported. + """ + await check_permission( + session, + user, + search_space_id, + Permission.DOCUMENTS_READ.value, + "You don't have permission to export documents in this search space", + ) + + # TODO: implement export logic + return {"message": "Export endpoint placeholder"}