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)}")