Spaces:
Running
Running
File size: 3,670 Bytes
5301c48 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 |
from fastapi import APIRouter, HTTPException
from pydantic import BaseModel
from typing import Optional
from starfish.common.logger import get_logger
from starfish.data_factory.storage.models import Project
from web.api.storage import save_project, get_project, list_projects, delete_project
logger = get_logger(__name__)
router = APIRouter(prefix="/project", tags=["project"])
class ProjectCreateRequest(BaseModel):
name: str
template_name: str
description: Optional[str] = None
@router.post("/create")
async def create_project(request: ProjectCreateRequest):
"""
Create a new project.
This endpoint creates a new project with the given details and saves it using Local Storage.
Args:
request: Project creation request containing name, description, and metadata
Returns:
The created project details
"""
try:
logger.info(f"Creating project: {request.name}")
# Create project instance
project = Project(
project_id=request.name,
name=request.name,
template_name=request.template_name,
description=request.description,
)
# Save project using local storage
await save_project(project)
logger.info(f"Project created successfully: {project.project_id}")
return {"id": project.project_id, "name": project.name, "description": project.description, "created_at": project.created_when}
except Exception as e:
logger.error(f"Error creating project: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error creating project: {str(e)}")
@router.get("/get")
async def get_project_endpoint(id: str):
"""
Get a project by ID.
Args:
project_id: The ID of the project to retrieve
Returns:
The project details
"""
try:
project = await get_project(id)
if not project:
raise HTTPException(status_code=404, detail="Project not found")
return {
"id": project.project_id,
"name": project.name,
"template_name": project.template_name,
"description": project.description,
"created_at": project.created_when,
}
except HTTPException:
raise
except Exception as e:
logger.error(f"Error retrieving project: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error retrieving project: {str(e)}")
@router.delete("/delete")
async def delete_project_endpoint(id: str):
"""
Delete a project by ID.
Args:
id: The ID of the project to delete
Returns:
The deleted project details
"""
try:
await delete_project(id)
return {"message": "Project deleted successfully"}
except Exception as e:
logger.error(f"Error deleting project: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error deleting project: {str(e)}")
@router.post("/list")
async def list_projects_endpoint(request: dict):
"""
List all projects.
Returns:
List of all projects
"""
try:
projects = await list_projects()
return [
{
"id": project.project_id,
"name": project.name,
"template_name": project.template_name,
"description": project.description,
"created_at": project.created_when,
}
for project in projects
]
except Exception as e:
logger.error(f"Error listing projects: {str(e)}")
raise HTTPException(status_code=500, detail=f"Error listing projects: {str(e)}")
|