main
py 148 lines 5.49 KB
Raw
1 from helpers.api import ApiHandler, Input, Output, Request, Response
2 from helpers import projects
3 from helpers.notification import NotificationManager, NotificationType, NotificationPriority
4
5
6 class Projects(ApiHandler):
7 async def process(self, input: Input, request: Request) -> Output:
8 action = input.get("action", "")
9 ctxid = input.get("context_id", None)
10
11 if ctxid:
12 _context = self.use_context(ctxid)
13
14 try:
15 if action == "list":
16 data = self.get_active_projects_list()
17 elif action == "list_options":
18 data = self.get_active_projects_options()
19 elif action == "load":
20 data = self.load_project(input.get("name", None))
21 elif action == "create":
22 data = self.create_project(input.get("project", None))
23 elif action == "clone":
24 data = self.clone_project(input.get("project", None))
25 elif action == "update":
26 data = self.update_project(input.get("project", None))
27 elif action == "delete":
28 data = self.delete_project(input.get("name", None))
29 elif action == "activate":
30 data = self.activate_project(ctxid, input.get("name", None))
31 elif action == "deactivate":
32 data = self.deactivate_project(ctxid)
33 elif action == "file_structure":
34 data = self.get_file_structure(input.get("name", None), input.get("settings"))
35 else:
36 raise Exception("Invalid action")
37
38 return {
39 "ok": True,
40 "data": data,
41 }
42 except Exception as e:
43 return {
44 "ok": False,
45 "error": str(e),
46 }
47
48 def get_active_projects_list(self):
49 return projects.get_active_projects_list()
50
51 def get_active_projects_options(self):
52 items = projects.get_active_projects_list() or []
53 return [
54 {"key": p.get("name", ""), "label": p.get("title", "") or p.get("name", "")}
55 for p in items
56 if p.get("name")
57 ]
58
59 def create_project(self, project: dict|None):
60 if project is None:
61 raise Exception("Project data is required")
62 data = projects.BasicProjectData(**project)
63 name = projects.create_project(project["name"], data)
64 return projects.load_edit_project_data(name)
65
66 def clone_project(self, project: dict|None):
67 if project is None:
68 raise Exception("Project data is required")
69 git_url = project.get("git_url", "")
70 git_token = project.get("git_token", "")
71 if not git_url:
72 raise Exception("Git URL is required")
73
74 # Progress notification
75 notification = NotificationManager.send_notification(
76 NotificationType.PROGRESS,
77 NotificationPriority.NORMAL,
78 f"Cloning repository...",
79 "Git Clone",
80 display_time=999,
81 group="git_clone"
82 )
83
84 try:
85 data = projects.BasicProjectData(**project)
86 name = projects.clone_git_project(project["name"], git_url, git_token, data)
87
88 # Success notification
89 NotificationManager.send_notification(
90 NotificationType.SUCCESS,
91 NotificationPriority.NORMAL,
92 f"Repository cloned successfully",
93 "Git Clone",
94 display_time=3,
95 group="git_clone"
96 )
97 return projects.load_edit_project_data(name)
98 except Exception as e:
99 # Error notification
100 NotificationManager.send_notification(
101 NotificationType.ERROR,
102 NotificationPriority.HIGH,
103 f"Clone failed: {str(e)}",
104 "Git Clone",
105 display_time=5,
106 group="git_clone"
107 )
108 raise
109
110 def load_project(self, name: str|None):
111 if name is None:
112 raise Exception("Project name is required")
113 return projects.load_edit_project_data(name)
114
115 def update_project(self, project: dict|None):
116 if project is None:
117 raise Exception("Project data is required")
118 data = projects.EditProjectData(**project)
119 name = projects.update_project(project["name"], data)
120 return projects.load_edit_project_data(name)
121
122 def delete_project(self, name: str|None):
123 if name is None:
124 raise Exception("Project name is required")
125 return projects.delete_project(name)
126
127 def activate_project(self, context_id: str|None, name: str|None):
128 if not context_id:
129 raise Exception("Context ID is required")
130 if not name:
131 raise Exception("Project name is required")
132 return projects.activate_project(context_id, name)
133
134 def deactivate_project(self, context_id: str|None):
135 if not context_id:
136 raise Exception("Context ID is required")
137 return projects.deactivate_project(context_id)
138
139 def get_file_structure(self, name: str|None, settings: dict|None):
140 if not name:
141 raise Exception("Project name is required")
142 # project data
143 basic_data = projects.load_basic_project_data(name)
144 # override file structure settings
145 if settings:
146 basic_data["file_structure"] = settings # type: ignore
147 # get structure
148 return projects.get_file_structure(name, basic_data)