""" API endpoints для импорта ролей Автор: Сергей Антропов Сайт: https://devops.org.ru """ from fastapi import APIRouter, Request, HTTPException, Form from fastapi.responses import HTMLResponse, JSONResponse from fastapi.templating import Jinja2Templates from pathlib import Path from typing import Optional from app.core.config import settings from app.services.import_service import ImportService router = APIRouter() templates_path = Path(__file__).parent.parent.parent.parent / "templates" templates = Jinja2Templates(directory=str(templates_path)) import_service = ImportService() @router.get("/roles/import", response_class=HTMLResponse) async def import_role_page(request: Request): """Страница импорта роли""" return templates.TemplateResponse( "pages/roles/import.html", {"request": request} ) @router.post("/api/v1/roles/import/git") async def import_from_git_api( repo_url: str = Form(...), role_name: Optional[str] = Form(None), branch: str = Form("main"), subdirectory: Optional[str] = Form(None) ): """API endpoint для импорта роли из Git репозитория""" try: result = await import_service.import_from_git( repo_url=repo_url, role_name=role_name, branch=branch, subdirectory=subdirectory ) return JSONResponse(content=result, status_code=201) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except Exception as e: raise HTTPException(status_code=500, detail=f"Ошибка при импорте роли: {str(e)}") @router.post("/api/v1/roles/import/galaxy") async def import_from_galaxy_api( role_name: str = Form(...), version: Optional[str] = Form(None), namespace: Optional[str] = Form(None) ): """API endpoint для импорта роли из Ansible Galaxy""" try: result = await import_service.import_from_galaxy( role_name=role_name, version=version, namespace=namespace ) return JSONResponse(content=result, status_code=201) except ValueError as e: raise HTTPException(status_code=400, detail=str(e)) except Exception as e: raise HTTPException(status_code=500, detail=f"Ошибка при импорте роли: {str(e)}") @router.post("/api/v1/roles/import/validate") async def validate_repo_api( repo_url: str = Form(...), branch: str = Form("main") ): """Проверка доступности репозитория""" try: result = await import_service.validate_repo(repo_url, branch) return JSONResponse(content=result) except Exception as e: raise HTTPException(status_code=500, detail=str(e))