Files
algorithm/backend/app/routes/repositories.py
2026-02-08 20:06:35 +08:00

282 lines
8.6 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""算法仓库管理路由,提供仓库添加、列表、删除等功能"""
from fastapi import APIRouter, HTTPException, status, Depends
from typing import List, Dict, Any, Optional
from pydantic import BaseModel
import uuid
from app.models.models import AlgorithmRepository
from app.models.database import SessionLocal
from app.routes.user import get_current_active_user
from app.schemas.user import UserResponse
from app.gitea.service import gitea_service
router = APIRouter(prefix="/repositories", tags=["repositories"])
class CreateRepositoryRequest(BaseModel):
"""创建仓库请求"""
name: str
description: str
type: str = "code"
repo_url: str
branch: str = "main"
local_path: str = ""
algorithm_id: Optional[str] = None
class UpdateRepositoryRequest(BaseModel):
"""更新仓库请求"""
name: Optional[str] = None
description: Optional[str] = None
type: Optional[str] = None
repo_url: Optional[str] = None
branch: Optional[str] = None
local_path: Optional[str] = None
algorithm_id: Optional[str] = None
@router.post("", status_code=status.HTTP_201_CREATED)
async def create_repository(
request: CreateRepositoryRequest,
current_user: UserResponse = Depends(get_current_active_user)
):
"""创建算法仓库"""
# 检查用户权限
if current_user.role_name != "admin":
raise HTTPException(status_code=403, detail="Insufficient permissions")
# 创建数据库会话
db = SessionLocal()
try:
# 生成唯一ID
repo_id = str(uuid.uuid4())
# 创建仓库实例
repo = AlgorithmRepository(
id=repo_id,
name=request.name,
description=request.description,
type=request.type,
repo_url=request.repo_url,
branch=request.branch,
local_path=request.local_path,
algorithm_id=request.algorithm_id
)
# 保存到数据库
db.add(repo)
db.commit()
db.refresh(repo)
return {
"success": True,
"message": "Repository created successfully",
"repository": {
"id": repo.id,
"name": repo.name,
"description": repo.description,
"type": repo.type,
"repo_url": repo.repo_url,
"branch": repo.branch,
"local_path": repo.local_path,
"algorithm_id": repo.algorithm_id,
"status": repo.status,
"created_at": repo.created_at,
"updated_at": repo.updated_at
}
}
finally:
db.close()
@router.get("")
async def list_repositories(
algorithm_id: Optional[str] = None,
current_user: UserResponse = Depends(get_current_active_user)
):
"""获取算法仓库列表"""
# 检查用户权限
if current_user.role_name != "admin":
raise HTTPException(status_code=403, detail="Insufficient permissions")
# 创建数据库会话
db = SessionLocal()
try:
# 查询仓库列表
query = db.query(AlgorithmRepository)
# 如果指定了算法ID只返回该算法的仓库
if algorithm_id:
query = query.filter(AlgorithmRepository.algorithm_id == algorithm_id)
repos = query.all()
# 转换为字典列表
repo_list = []
for repo in repos:
repo_list.append({
"id": repo.id,
"name": repo.name,
"description": repo.description,
"type": repo.type,
"repo_url": repo.repo_url,
"branch": repo.branch,
"local_path": repo.local_path,
"algorithm_id": repo.algorithm_id,
"status": repo.status,
"created_at": repo.created_at,
"updated_at": repo.updated_at
})
return {
"success": True,
"repositories": repo_list
}
finally:
db.close()
@router.get("/{repo_id}")
async def get_repository(
repo_id: str,
current_user: UserResponse = Depends(get_current_active_user)
):
"""获取单个算法仓库"""
# 检查用户权限
if current_user.role_name != "admin":
raise HTTPException(status_code=403, detail="Insufficient permissions")
# 创建数据库会话
db = SessionLocal()
try:
# 查询仓库
repo = db.query(AlgorithmRepository).filter(AlgorithmRepository.id == repo_id).first()
if not repo:
raise HTTPException(status_code=404, detail="Repository not found")
return {
"success": True,
"repository": {
"id": repo.id,
"name": repo.name,
"description": repo.description,
"type": repo.type,
"repo_url": repo.repo_url,
"branch": repo.branch,
"local_path": repo.local_path,
"algorithm_id": repo.algorithm_id,
"status": repo.status,
"created_at": repo.created_at,
"updated_at": repo.updated_at
}
}
finally:
db.close()
@router.put("/{repo_id}")
async def update_repository(
repo_id: str,
request: UpdateRepositoryRequest,
current_user: UserResponse = Depends(get_current_active_user)
):
"""更新算法仓库"""
# 检查用户权限
if current_user.role_name != "admin":
raise HTTPException(status_code=403, detail="Insufficient permissions")
# 创建数据库会话
db = SessionLocal()
try:
# 查询仓库
repo = db.query(AlgorithmRepository).filter(AlgorithmRepository.id == repo_id).first()
if not repo:
raise HTTPException(status_code=404, detail="Repository not found")
# 更新仓库信息
if request.name is not None:
repo.name = request.name
if request.description is not None:
repo.description = request.description
if request.type is not None:
repo.type = request.type
if request.repo_url is not None:
repo.repo_url = request.repo_url
if request.branch is not None:
repo.branch = request.branch
if request.local_path is not None:
repo.local_path = request.local_path
if request.algorithm_id is not None:
repo.algorithm_id = request.algorithm_id
# 保存到数据库
db.commit()
db.refresh(repo)
return {
"success": True,
"message": "Repository updated successfully",
"repository": {
"id": repo.id,
"name": repo.name,
"description": repo.description,
"type": repo.type,
"repo_url": repo.repo_url,
"branch": repo.branch,
"local_path": repo.local_path,
"algorithm_id": repo.algorithm_id,
"status": repo.status,
"created_at": repo.created_at,
"updated_at": repo.updated_at
}
}
finally:
db.close()
@router.delete("/{repo_id}")
async def delete_repository(
repo_id: str,
current_user: UserResponse = Depends(get_current_active_user)
):
"""删除算法仓库"""
# 检查用户权限
if current_user.role_name != "admin":
raise HTTPException(status_code=403, detail="Insufficient permissions")
# 创建数据库会话
db = SessionLocal()
try:
# 查询仓库
repo = db.query(AlgorithmRepository).filter(AlgorithmRepository.id == repo_id).first()
if not repo:
raise HTTPException(status_code=404, detail="Repository not found")
# 先删除Gitea仓库
gitea_deleted = False
if repo.repo_url:
# 从repo_url中提取仓库名称
import os
repo_name = os.path.basename(repo.repo_url).replace('.git', '')
gitea_deleted = gitea_service.delete_repository(repo_name)
if gitea_deleted:
print(f"Gitea repository deleted successfully: {repo_name}")
else:
print(f"Failed to delete Gitea repository: {repo_name}")
# 删除系统仓库数据
db.delete(repo)
db.commit()
return {
"success": True,
"message": "Repository deleted successfully",
"gitea_deleted": gitea_deleted
}
finally:
db.close()