diff --git a/README.md b/README.md index 06709a8..ba5cbb7 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,8 @@ cp .env.example .env ``` -# edit SECRET_KEY & DEFAULT_ADMIN_PASSWORD +edit SECRET_KEY & DEFAULT_ADMIN_PASSWORD +and run: `bash start_prod.sh` diff --git a/backend/app/api/routes/routers.py b/backend/app/api/routes/routers.py index ecdb863..95421e7 100644 --- a/backend/app/api/routes/routers.py +++ b/backend/app/api/routes/routers.py @@ -13,9 +13,20 @@ from app.services.settings_service import settings_service router = APIRouter() +def serialize_router(router: Router, global_ssh_key: str | None = None) -> RouterResponse: + has_router_key = bool((router.ssh_key or '').strip()) + has_global_key = bool((global_ssh_key or '').strip()) + payload = RouterResponse.model_validate(router, from_attributes=True).model_dump() + payload['uses_global_ssh_key'] = has_global_key and not has_router_key + payload['has_effective_ssh_key'] = has_router_key or has_global_key + return RouterResponse.model_validate(payload) + + @router.get("", response_model=list[RouterResponse]) def list_routers(current_user: User = Depends(get_current_user), db: Session = Depends(get_db)): - return db.query(Router).filter(Router.owner_id == current_user.id).order_by(Router.created_at.desc()).all() + settings = settings_service.get_or_create(db) + routers = db.query(Router).filter(Router.owner_id == current_user.id).order_by(Router.created_at.desc()).all() + return [serialize_router(router, settings.global_ssh_key) for router in routers] @router.post("", response_model=RouterResponse) @@ -24,7 +35,8 @@ def create_router(payload: RouterCreate, current_user: User = Depends(get_curren db.add(router) db.commit() db.refresh(router) - return router + settings = settings_service.get_or_create(db) + return serialize_router(router, settings.global_ssh_key) @router.get("/{router_id}", response_model=RouterResponse) @@ -32,7 +44,8 @@ def get_router(router_id: int, current_user: User = Depends(get_current_user), d router = db.query(Router).filter(Router.id == router_id, Router.owner_id == current_user.id).first() if not router: raise HTTPException(status_code=404, detail="Router not found") - return router + settings = settings_service.get_or_create(db) + return serialize_router(router, settings.global_ssh_key) @router.put("/{router_id}", response_model=RouterResponse) @@ -45,7 +58,8 @@ def update_router(router_id: int, payload: RouterUpdate, current_user: User = De db.add(router) db.commit() db.refresh(router) - return router + settings = settings_service.get_or_create(db) + return serialize_router(router, settings.global_ssh_key) @router.delete("/{router_id}") diff --git a/backend/app/schemas/router.py b/backend/app/schemas/router.py index d63cf46..4ded433 100644 --- a/backend/app/schemas/router.py +++ b/backend/app/schemas/router.py @@ -38,6 +38,8 @@ class RouterUpdate(BaseModel): class RouterResponse(RouterBase): id: int owner_id: int + uses_global_ssh_key: bool = False + has_effective_ssh_key: bool = False last_connection_status: bool | None = None last_connection_tested_at: datetime | None = None last_connection_error: str | None = None diff --git a/frontend/src/app/features/routers/routers-page.component.html b/frontend/src/app/features/routers/routers-page.component.html index 9cab121..7c84f51 100644 --- a/frontend/src/app/features/routers/routers-page.component.html +++ b/frontend/src/app/features/routers/routers-page.component.html @@ -39,7 +39,7 @@
- +
diff --git a/frontend/src/app/features/routers/routers-page.component.ts b/frontend/src/app/features/routers/routers-page.component.ts index 47a1273..6d1f2a5 100644 --- a/frontend/src/app/features/routers/routers-page.component.ts +++ b/frontend/src/app/features/routers/routers-page.component.ts @@ -23,6 +23,8 @@ interface RouterItem { ssh_user: string; ssh_password?: string; ssh_key?: string; + uses_global_ssh_key?: boolean; + has_effective_ssh_key?: boolean; } @Component({ @@ -58,7 +60,15 @@ export class RoutersPageComponent implements OnInit { } get keyCount(): number { - return this.routers.filter((item) => !!item.ssh_key).length; + return this.routers.filter((item) => this.hasEffectiveSshKey(item)).length; + } + + hasEffectiveSshKey(item: RouterItem): boolean { + return !!item.has_effective_ssh_key; + } + + usesGlobalSshKey(item: RouterItem): boolean { + return !!item.uses_global_ssh_key; }