6b302b3279
- Add ToolType SQLAlchemy model with Docker Compose template support - Create CRUD API endpoints for tool type management - Implement YAML and template variable validation - Add built-in tool types (code-server, jupyter-notebook) seeded on startup - Create frontend page with list, create, edit, and delete functionality - Add tool types navigation to app shell - Update mypy config to ignore missing imports Quality gates: ruff (passed), mypy (passed), pytest unit (8 passed), typecheck (passed), lint (passed), build (passed)
89 lines
2.9 KiB
Python
89 lines
2.9 KiB
Python
from fastapi import FastAPI
|
|
from fastapi.staticfiles import StaticFiles
|
|
|
|
from src.api.auth import router as auth_router
|
|
from src.api.git_repositories import router as git_repositories_router
|
|
from src.api.projects import router as projects_router
|
|
from src.api.ssh_keys import router as ssh_keys_router
|
|
from src.api.tool_types import router as tool_types_router
|
|
from src.api.user_config import router as user_config_router
|
|
from src.api.users import router as users_router
|
|
from src.database import SessionLocal
|
|
from src.models.tool_type import ToolType
|
|
from sqlalchemy import select
|
|
|
|
app = FastAPI(title="Headquarter API")
|
|
|
|
|
|
async def seed_builtin_tool_types():
|
|
async with SessionLocal() as session:
|
|
builtin_types = [
|
|
{
|
|
"name": "code-server",
|
|
"display_name": "VS Code Server",
|
|
"description": "VS Code running in the browser via code-server",
|
|
"compose_template": """version: "3.8"
|
|
services:
|
|
code-server:
|
|
image: lscr.io/linuxserver/code-server:latest
|
|
container_name: {{TOOL_NAME}}
|
|
environment:
|
|
- PUID=1000
|
|
- PGID=1000
|
|
- TZ=Europe/London
|
|
volumes:
|
|
- {{REPO_PATH}}:/config/workspace
|
|
ports:
|
|
- "8443:8443"
|
|
restart: unless-stopped""",
|
|
"required_variables": ["REPO_PATH", "TOOL_NAME"],
|
|
},
|
|
{
|
|
"name": "jupyter-notebook",
|
|
"display_name": "Jupyter Notebook",
|
|
"description": "Jupyter Lab for interactive development",
|
|
"compose_template": """version: "3.8"
|
|
services:
|
|
jupyter:
|
|
image: jupyter/scipy-notebook:latest
|
|
container_name: {{TOOL_NAME}}
|
|
environment:
|
|
- JUPYTER_ENABLE_LAB=yes
|
|
volumes:
|
|
- {{REPO_PATH}}:/home/jovyan/work
|
|
ports:
|
|
- "8888:8888"
|
|
restart: unless-stopped""",
|
|
"required_variables": ["REPO_PATH", "TOOL_NAME"],
|
|
},
|
|
]
|
|
|
|
for tool_data in builtin_types:
|
|
existing = await session.scalar(select(ToolType).where(ToolType.name == tool_data["name"]))
|
|
if not existing:
|
|
tool_type = ToolType(
|
|
name=tool_data["name"],
|
|
display_name=tool_data["display_name"],
|
|
description=tool_data["description"],
|
|
compose_template=tool_data["compose_template"],
|
|
required_variables=tool_data["required_variables"],
|
|
is_builtin=True,
|
|
)
|
|
session.add(tool_type)
|
|
|
|
await session.commit()
|
|
|
|
|
|
@app.on_event("startup")
|
|
async def on_startup():
|
|
await seed_builtin_tool_types()
|
|
|
|
app.include_router(auth_router)
|
|
app.include_router(projects_router)
|
|
app.include_router(users_router)
|
|
app.include_router(ssh_keys_router)
|
|
app.include_router(git_repositories_router)
|
|
app.include_router(user_config_router)
|
|
app.include_router(tool_types_router)
|
|
app.mount("/uploads", StaticFiles(directory="uploads"), name="uploads")
|