- FastAPI serves static UI, file CRUD under code/ and read-only lib/ - Pyodide worker runs Python and Jedi completions in the browser - SQLite accounts: login/register, session cookies, superuser user management - Optional EDITOR_API_KEY, AUTH_* env vars, .env.example - Pipenv, pytest, Selenium smoke test, README Made-with: Cursor
57 lines
1.8 KiB
Python
57 lines
1.8 KiB
Python
from fastapi import APIRouter
|
|
|
|
from editor_app.models import FileContent, FolderOperation, MoveFileRequest
|
|
from editor_app.services import filesystem
|
|
|
|
router = APIRouter(prefix="/api")
|
|
|
|
|
|
@router.get("/files")
|
|
async def list_files(path: str = ""):
|
|
files = filesystem.list_files(path)
|
|
return {"files": files}
|
|
|
|
|
|
@router.get("/workspace/py-sources")
|
|
async def workspace_python_sources():
|
|
return {"files": filesystem.collect_python_sources()}
|
|
|
|
|
|
@router.get("/file/{file_path:path}")
|
|
async def read_file(file_path: str):
|
|
content, filename = filesystem.read_text_file(file_path)
|
|
return {"content": content, "filename": filename}
|
|
|
|
|
|
@router.post("/file/{file_path:path}")
|
|
async def save_file(file_path: str, file_data: FileContent):
|
|
filename = filesystem.save_text_file(file_path, file_data.content)
|
|
return {"message": "File saved successfully", "filename": filename}
|
|
|
|
|
|
@router.post("/file-move")
|
|
async def move_file(move_data: MoveFileRequest):
|
|
new_path, moved_type = filesystem.move_path(
|
|
source_path=move_data.source_path,
|
|
destination_folder=move_data.destination_folder,
|
|
)
|
|
return {"message": "Path moved successfully", "new_path": new_path, "moved_type": moved_type}
|
|
|
|
|
|
@router.delete("/file/{file_path:path}")
|
|
async def delete_file(file_path: str):
|
|
filesystem.delete_file(file_path)
|
|
return {"message": "File deleted successfully"}
|
|
|
|
|
|
@router.post("/folder/new/{folder_path:path}")
|
|
async def create_folder(folder_path: str, folder_data: FolderOperation):
|
|
folder_name = filesystem.create_folder(folder_path)
|
|
return {"message": "Folder created successfully", "folder": folder_name}
|
|
|
|
|
|
@router.delete("/folder/{folder_path:path}")
|
|
async def delete_folder(folder_path: str):
|
|
filesystem.delete_folder(folder_path)
|
|
return {"message": "Folder deleted successfully"}
|