| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | # | 
					
						
							|  |  |  | #  Copyright 2024 The InfiniFlow Authors. All Rights Reserved. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  Licensed under the Apache License, Version 2.0 (the "License"); | 
					
						
							|  |  |  | #  you may not use this file except in compliance with the License. | 
					
						
							|  |  |  | #  You may obtain a copy of the License at | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #      http://www.apache.org/licenses/LICENSE-2.0 | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | #  Unless required by applicable law or agreed to in writing, software | 
					
						
							|  |  |  | #  distributed under the License is distributed on an "AS IS" BASIS, | 
					
						
							|  |  |  | #  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
					
						
							|  |  |  | #  See the License for the specific language governing permissions and | 
					
						
							|  |  |  | #  limitations under the License. | 
					
						
							|  |  |  | # | 
					
						
							|  |  |  | import json | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  | import traceback | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | from flask import request, Response | 
					
						
							|  |  |  | from flask_login import login_required, current_user | 
					
						
							|  |  |  | from api.db.services.canvas_service import CanvasTemplateService, UserCanvasService | 
					
						
							| 
									
										
										
										
											2025-03-19 18:04:13 +07:00
										 |  |  | from api.db.services.user_service import TenantService | 
					
						
							| 
									
										
										
										
											2025-03-19 14:22:53 +07:00
										 |  |  | from api.db.services.user_canvas_version import UserCanvasVersionService | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  | from api.settings import RetCode | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | from api.utils import get_uuid | 
					
						
							| 
									
										
										
										
											2024-09-03 14:57:58 +08:00
										 |  |  | from api.utils.api_utils import get_json_result, server_error_response, validate_request, get_data_error_result | 
					
						
							| 
									
										
										
										
											2024-08-02 18:51:14 +08:00
										 |  |  | from agent.canvas import Canvas | 
					
						
							| 
									
										
										
										
											2024-08-16 12:36:53 +08:00
										 |  |  | from peewee import MySQLDatabase, PostgresqlDatabase | 
					
						
							| 
									
										
										
										
											2024-12-17 16:29:35 +07:00
										 |  |  | from api.db.db_models import APIToken | 
					
						
							| 
									
										
										
										
											2025-03-19 18:04:13 +07:00
										 |  |  | import logging | 
					
						
							| 
									
										
										
										
											2025-03-19 14:22:53 +07:00
										 |  |  | import time | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/templates', methods=['GET'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | @login_required | 
					
						
							|  |  |  | def templates(): | 
					
						
							|  |  |  |     return get_json_result(data=[c.to_dict() for c in CanvasTemplateService.get_all()]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/list', methods=['GET'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | @login_required | 
					
						
							|  |  |  | def canvas_list(): | 
					
						
							| 
									
										
										
										
											2024-07-03 12:15:15 +08:00
										 |  |  |     return get_json_result(data=sorted([c.to_dict() for c in \ | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |                                  UserCanvasService.query(user_id=current_user.id)], key=lambda x: x["update_time"]*-1) | 
					
						
							| 
									
										
										
										
											2024-07-03 12:15:15 +08:00
										 |  |  |                            ) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/rm', methods=['POST'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | @validate_request("canvas_ids") | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def rm(): | 
					
						
							|  |  |  |     for i in request.json["canvas_ids"]: | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |         if not UserCanvasService.query(user_id=current_user.id,id=i): | 
					
						
							| 
									
										
										
										
											2024-09-04 10:36:15 +08:00
										 |  |  |             return get_json_result( | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |                 data=False, message='Only owner of canvas authorized for this operation.', | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |                 code=RetCode.OPERATING_ERROR) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |         UserCanvasService.delete_by_id(i) | 
					
						
							|  |  |  |     return get_json_result(data=True) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/set', methods=['POST'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | @validate_request("dsl", "title") | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def save(): | 
					
						
							|  |  |  |     req = request.json | 
					
						
							|  |  |  |     req["user_id"] = current_user.id | 
					
						
							| 
									
										
										
										
											2024-12-08 14:21:12 +08:00
										 |  |  |     if not isinstance(req["dsl"], str): | 
					
						
							|  |  |  |         req["dsl"] = json.dumps(req["dsl"], ensure_ascii=False) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |     req["dsl"] = json.loads(req["dsl"]) | 
					
						
							|  |  |  |     if "id" not in req: | 
					
						
							|  |  |  |         if UserCanvasService.query(user_id=current_user.id, title=req["title"].strip()): | 
					
						
							| 
									
										
										
										
											2024-12-31 14:36:23 +08:00
										 |  |  |             return get_data_error_result(message=f"{req['title'].strip()} already exists.") | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |         req["id"] = get_uuid() | 
					
						
							|  |  |  |         if not UserCanvasService.save(**req): | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |             return get_data_error_result(message="Fail to save canvas.") | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |     else: | 
					
						
							| 
									
										
										
										
											2024-09-04 11:53:45 +08:00
										 |  |  |         if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): | 
					
						
							|  |  |  |             return get_json_result( | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |                 data=False, message='Only owner of canvas authorized for this operation.', | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |                 code=RetCode.OPERATING_ERROR) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |         UserCanvasService.update_by_id(req["id"], req) | 
					
						
							| 
									
										
										
										
											2025-03-19 14:22:53 +07:00
										 |  |  |     # save version     | 
					
						
							|  |  |  |     UserCanvasVersionService.insert( user_canvas_id=req["id"], dsl=req["dsl"], title="{0}_{1}".format(req["title"], time.strftime("%Y_%m_%d_%H_%M_%S"))) | 
					
						
							|  |  |  |     UserCanvasVersionService.delete_all_versions(req["id"]) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |     return get_json_result(data=req) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-03-19 14:22:53 +07:00
										 |  |  |   | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/get/<canvas_id>', methods=['GET'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | @login_required | 
					
						
							|  |  |  | def get(canvas_id): | 
					
						
							| 
									
										
										
										
											2025-03-19 18:04:13 +07:00
										 |  |  |     e, c = UserCanvasService.get_by_tenant_id(canvas_id) | 
					
						
							|  |  |  |     logging.info(f"get canvas_id: {canvas_id} c: {c}") | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |     if not e: | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |         return get_data_error_result(message="canvas not found.") | 
					
						
							| 
									
										
										
										
											2025-03-19 18:04:13 +07:00
										 |  |  |     return get_json_result(data=c) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-17 16:29:35 +07:00
										 |  |  | @manager.route('/getsse/<canvas_id>', methods=['GET'])  # type: ignore # noqa: F821 | 
					
						
							|  |  |  | def getsse(canvas_id): | 
					
						
							|  |  |  |     token = request.headers.get('Authorization').split() | 
					
						
							|  |  |  |     if len(token) != 2: | 
					
						
							|  |  |  |         return get_data_error_result(message='Authorization is not valid!"') | 
					
						
							|  |  |  |     token = token[1] | 
					
						
							|  |  |  |     objs = APIToken.query(beta=token) | 
					
						
							|  |  |  |     if not objs: | 
					
						
							| 
									
										
										
										
											2024-12-26 16:08:17 +08:00
										 |  |  |         return get_data_error_result(message='Authentication error: API key is invalid!"') | 
					
						
							| 
									
										
										
										
											2024-12-17 16:29:35 +07:00
										 |  |  |     e, c = UserCanvasService.get_by_id(canvas_id) | 
					
						
							|  |  |  |     if not e: | 
					
						
							|  |  |  |         return get_data_error_result(message="canvas not found.") | 
					
						
							|  |  |  |     return get_json_result(data=c.to_dict()) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/completion', methods=['POST'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | @validate_request("id") | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def run(): | 
					
						
							|  |  |  |     req = request.json | 
					
						
							|  |  |  |     stream = req.get("stream", True) | 
					
						
							|  |  |  |     e, cvs = UserCanvasService.get_by_id(req["id"]) | 
					
						
							|  |  |  |     if not e: | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |         return get_data_error_result(message="canvas not found.") | 
					
						
							| 
									
										
										
										
											2024-09-04 11:53:45 +08:00
										 |  |  |     if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): | 
					
						
							|  |  |  |         return get_json_result( | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |             data=False, message='Only owner of canvas authorized for this operation.', | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |             code=RetCode.OPERATING_ERROR) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |     if not isinstance(cvs.dsl, str): | 
					
						
							|  |  |  |         cvs.dsl = json.dumps(cvs.dsl, ensure_ascii=False) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     final_ans = {"reference": [], "content": ""} | 
					
						
							| 
									
										
										
										
											2024-08-28 19:23:53 +08:00
										 |  |  |     message_id = req.get("message_id", get_uuid()) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |     try: | 
					
						
							|  |  |  |         canvas = Canvas(cvs.dsl, current_user.id) | 
					
						
							|  |  |  |         if "message" in req: | 
					
						
							| 
									
										
										
										
											2024-08-26 12:05:15 +08:00
										 |  |  |             canvas.messages.append({"role": "user", "content": req["message"], "id": message_id}) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |             canvas.add_user_input(req["message"]) | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         return server_error_response(e) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     if stream: | 
					
						
							|  |  |  |         def sse(): | 
					
						
							|  |  |  |             nonlocal answer, cvs | 
					
						
							|  |  |  |             try: | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |                 for ans in canvas.run(stream=True): | 
					
						
							|  |  |  |                     if ans.get("running_status"): | 
					
						
							| 
									
										
										
										
											2024-11-21 16:22:25 +08:00
										 |  |  |                         yield "data:" + json.dumps({"code": 0, "message": "", | 
					
						
							|  |  |  |                                                     "data": {"answer": ans["content"], | 
					
						
							|  |  |  |                                                              "running_status": True}}, | 
					
						
							|  |  |  |                                                    ensure_ascii=False) + "\n\n" | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |                         continue | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |                     for k in ans.keys(): | 
					
						
							|  |  |  |                         final_ans[k] = ans[k] | 
					
						
							|  |  |  |                     ans = {"answer": ans["content"], "reference": ans.get("reference", [])} | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |                     yield "data:" + json.dumps({"code": 0, "message": "", "data": ans}, ensure_ascii=False) + "\n\n" | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-08-26 12:05:15 +08:00
										 |  |  |                 canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) | 
					
						
							| 
									
										
										
										
											2024-11-05 10:04:31 +08:00
										 |  |  |                 canvas.history.append(("assistant", final_ans["content"])) | 
					
						
							| 
									
										
										
										
											2024-12-30 18:38:51 +08:00
										 |  |  |                 if not canvas.path[-1]: | 
					
						
							|  |  |  |                     canvas.path.pop(-1) | 
					
						
							| 
									
										
										
										
											2024-07-08 09:32:44 +08:00
										 |  |  |                 if final_ans.get("reference"): | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |                     canvas.reference.append(final_ans["reference"]) | 
					
						
							|  |  |  |                 cvs.dsl = json.loads(str(canvas)) | 
					
						
							|  |  |  |                 UserCanvasService.update_by_id(req["id"], cvs.to_dict()) | 
					
						
							|  |  |  |             except Exception as e: | 
					
						
							| 
									
										
										
										
											2024-11-20 18:21:50 +08:00
										 |  |  |                 cvs.dsl = json.loads(str(canvas)) | 
					
						
							| 
									
										
										
										
											2024-12-30 18:38:51 +08:00
										 |  |  |                 if not canvas.path[-1]: | 
					
						
							|  |  |  |                     canvas.path.pop(-1) | 
					
						
							| 
									
										
										
										
											2024-11-20 18:21:50 +08:00
										 |  |  |                 UserCanvasService.update_by_id(req["id"], cvs.to_dict()) | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |                 traceback.print_exc() | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |                 yield "data:" + json.dumps({"code": 500, "message": str(e), | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |                                             "data": {"answer": "**ERROR**: " + str(e), "reference": []}}, | 
					
						
							|  |  |  |                                            ensure_ascii=False) + "\n\n" | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |             yield "data:" + json.dumps({"code": 0, "message": "", "data": True}, ensure_ascii=False) + "\n\n" | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         resp = Response(sse(), mimetype="text/event-stream") | 
					
						
							|  |  |  |         resp.headers.add_header("Cache-control", "no-cache") | 
					
						
							|  |  |  |         resp.headers.add_header("Connection", "keep-alive") | 
					
						
							|  |  |  |         resp.headers.add_header("X-Accel-Buffering", "no") | 
					
						
							|  |  |  |         resp.headers.add_header("Content-Type", "text/event-stream; charset=utf-8") | 
					
						
							|  |  |  |         return resp | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |     for answer in canvas.run(stream=False): | 
					
						
							| 
									
										
										
										
											2024-12-08 14:21:12 +08:00
										 |  |  |         if answer.get("running_status"): | 
					
						
							|  |  |  |             continue | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |         final_ans["content"] = "\n".join(answer["content"]) if "content" in answer else "" | 
					
						
							|  |  |  |         canvas.messages.append({"role": "assistant", "content": final_ans["content"], "id": message_id}) | 
					
						
							|  |  |  |         if final_ans.get("reference"): | 
					
						
							|  |  |  |             canvas.reference.append(final_ans["reference"]) | 
					
						
							|  |  |  |         cvs.dsl = json.loads(str(canvas)) | 
					
						
							|  |  |  |         UserCanvasService.update_by_id(req["id"], cvs.to_dict()) | 
					
						
							|  |  |  |         return get_json_result(data={"answer": final_ans["content"], "reference": final_ans.get("reference", [])}) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/reset', methods=['POST'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-07-04 15:57:25 +08:00
										 |  |  | @validate_request("id") | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  | @login_required | 
					
						
							|  |  |  | def reset(): | 
					
						
							|  |  |  |     req = request.json | 
					
						
							|  |  |  |     try: | 
					
						
							| 
									
										
										
										
											2024-07-04 15:57:25 +08:00
										 |  |  |         e, user_canvas = UserCanvasService.get_by_id(req["id"]) | 
					
						
							|  |  |  |         if not e: | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |             return get_data_error_result(message="canvas not found.") | 
					
						
							| 
									
										
										
										
											2024-09-04 11:53:45 +08:00
										 |  |  |         if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): | 
					
						
							|  |  |  |             return get_json_result( | 
					
						
							| 
									
										
										
										
											2024-11-05 11:02:31 +08:00
										 |  |  |                 data=False, message='Only owner of canvas authorized for this operation.', | 
					
						
							| 
									
										
										
										
											2024-11-19 18:41:48 +08:00
										 |  |  |                 code=RetCode.OPERATING_ERROR) | 
					
						
							| 
									
										
										
										
											2024-07-04 15:57:25 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  |         canvas = Canvas(json.dumps(user_canvas.dsl), current_user.id) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |         canvas.reset() | 
					
						
							|  |  |  |         req["dsl"] = json.loads(str(canvas)) | 
					
						
							| 
									
										
										
										
											2024-07-04 15:57:25 +08:00
										 |  |  |         UserCanvasService.update_by_id(req["id"], {"dsl": req["dsl"]}) | 
					
						
							| 
									
										
										
										
											2024-06-14 10:33:59 +08:00
										 |  |  |         return get_json_result(data=req["dsl"]) | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         return server_error_response(e) | 
					
						
							| 
									
										
										
										
											2024-08-16 12:36:53 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-10 17:03:24 +08:00
										 |  |  | @manager.route('/input_elements', methods=['GET'])  # noqa: F821 | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def input_elements(): | 
					
						
							| 
									
										
										
										
											2024-12-11 19:23:59 +08:00
										 |  |  |     cvs_id = request.args.get("id") | 
					
						
							|  |  |  |     cpn_id = request.args.get("component_id") | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         e, user_canvas = UserCanvasService.get_by_id(cvs_id) | 
					
						
							|  |  |  |         if not e: | 
					
						
							|  |  |  |             return get_data_error_result(message="canvas not found.") | 
					
						
							|  |  |  |         if not UserCanvasService.query(user_id=current_user.id, id=cvs_id): | 
					
						
							|  |  |  |             return get_json_result( | 
					
						
							|  |  |  |                 data=False, message='Only owner of canvas authorized for this operation.', | 
					
						
							|  |  |  |                 code=RetCode.OPERATING_ERROR) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         canvas = Canvas(json.dumps(user_canvas.dsl), current_user.id) | 
					
						
							|  |  |  |         return get_json_result(data=canvas.get_component_input_elements(cpn_id)) | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         return server_error_response(e) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | @manager.route('/debug', methods=['POST'])  # noqa: F821 | 
					
						
							|  |  |  | @validate_request("id", "component_id", "params") | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def debug(): | 
					
						
							| 
									
										
										
										
											2024-12-10 17:03:24 +08:00
										 |  |  |     req = request.json | 
					
						
							| 
									
										
										
										
											2024-12-11 19:23:59 +08:00
										 |  |  |     for p in req["params"]: | 
					
						
							|  |  |  |         assert p.get("key") | 
					
						
							| 
									
										
										
										
											2024-12-10 17:03:24 +08:00
										 |  |  |     try: | 
					
						
							|  |  |  |         e, user_canvas = UserCanvasService.get_by_id(req["id"]) | 
					
						
							|  |  |  |         if not e: | 
					
						
							|  |  |  |             return get_data_error_result(message="canvas not found.") | 
					
						
							|  |  |  |         if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): | 
					
						
							|  |  |  |             return get_json_result( | 
					
						
							|  |  |  |                 data=False, message='Only owner of canvas authorized for this operation.', | 
					
						
							|  |  |  |                 code=RetCode.OPERATING_ERROR) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |         canvas = Canvas(json.dumps(user_canvas.dsl), current_user.id) | 
					
						
							| 
									
										
										
										
											2024-12-11 19:23:59 +08:00
										 |  |  |         canvas.get_component(req["component_id"])["obj"]._param.debug_inputs = req["params"] | 
					
						
							|  |  |  |         df = canvas.get_component(req["component_id"])["obj"].debug() | 
					
						
							|  |  |  |         return get_json_result(data=df.to_dict(orient="records")) | 
					
						
							| 
									
										
										
										
											2024-12-10 17:03:24 +08:00
										 |  |  |     except Exception as e: | 
					
						
							|  |  |  |         return server_error_response(e) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-12-08 21:23:51 +08:00
										 |  |  | @manager.route('/test_db_connect', methods=['POST'])  # noqa: F821 | 
					
						
							| 
									
										
										
										
											2024-08-16 12:36:53 +08:00
										 |  |  | @validate_request("db_type", "database", "username", "host", "port", "password") | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def test_db_connect(): | 
					
						
							|  |  |  |     req = request.json | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         if req["db_type"] in ["mysql", "mariadb"]: | 
					
						
							|  |  |  |             db = MySQLDatabase(req["database"], user=req["username"], host=req["host"], port=req["port"], | 
					
						
							|  |  |  |                                password=req["password"]) | 
					
						
							|  |  |  |         elif req["db_type"] == 'postgresql': | 
					
						
							|  |  |  |             db = PostgresqlDatabase(req["database"], user=req["username"], host=req["host"], port=req["port"], | 
					
						
							|  |  |  |                                     password=req["password"]) | 
					
						
							| 
									
										
										
										
											2024-12-12 18:26:44 +07:00
										 |  |  |         elif req["db_type"] == 'mssql': | 
					
						
							|  |  |  |             import pyodbc | 
					
						
							|  |  |  |             connection_string = ( | 
					
						
							|  |  |  |                 f"DRIVER={{ODBC Driver 17 for SQL Server}};" | 
					
						
							|  |  |  |                 f"SERVER={req['host']},{req['port']};" | 
					
						
							|  |  |  |                 f"DATABASE={req['database']};" | 
					
						
							|  |  |  |                 f"UID={req['username']};" | 
					
						
							|  |  |  |                 f"PWD={req['password']};" | 
					
						
							|  |  |  |             ) | 
					
						
							|  |  |  |             db = pyodbc.connect(connection_string) | 
					
						
							|  |  |  |             cursor = db.cursor() | 
					
						
							|  |  |  |             cursor.execute("SELECT 1") | 
					
						
							|  |  |  |             cursor.close() | 
					
						
							|  |  |  |         else: | 
					
						
							|  |  |  |             return server_error_response("Unsupported database type.") | 
					
						
							|  |  |  |         if req["db_type"] != 'mssql': | 
					
						
							|  |  |  |             db.connect() | 
					
						
							| 
									
										
										
										
											2024-08-16 12:36:53 +08:00
										 |  |  |         db.close() | 
					
						
							| 
									
										
										
										
											2024-12-12 18:26:44 +07:00
										 |  |  |          | 
					
						
							| 
									
										
										
										
											2024-08-22 10:19:22 +08:00
										 |  |  |         return get_json_result(data="Database Connection Successful!") | 
					
						
							| 
									
										
										
										
											2024-08-16 12:36:53 +08:00
										 |  |  |     except Exception as e: | 
					
						
							| 
									
										
										
										
											2024-08-21 17:48:00 +08:00
										 |  |  |         return server_error_response(e) | 
					
						
							| 
									
										
										
										
											2025-03-19 14:22:53 +07:00
										 |  |  | #api get list version dsl of canvas | 
					
						
							|  |  |  | @manager.route('/getlistversion/<canvas_id>', methods=['GET'])  # noqa: F821 | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def getlistversion(canvas_id): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         list =sorted([c.to_dict() for c in UserCanvasVersionService.list_by_canvas_id(canvas_id)], key=lambda x: x["update_time"]*-1) | 
					
						
							|  |  |  |         return get_json_result(data=list) | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         return get_data_error_result(message=f"Error getting history files: {e}") | 
					
						
							|  |  |  | #api get version dsl of canvas | 
					
						
							|  |  |  | @manager.route('/getversion/<version_id>', methods=['GET'])  # noqa: F821 | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def getversion( version_id): | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |        | 
					
						
							|  |  |  |         e, version = UserCanvasVersionService.get_by_id(version_id) | 
					
						
							|  |  |  |         if version: | 
					
						
							|  |  |  |             return get_json_result(data=version.to_dict()) | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         return get_json_result(data=f"Error getting history file: {e}") | 
					
						
							| 
									
										
										
										
											2025-03-19 18:04:13 +07:00
										 |  |  | @manager.route('/listteam', methods=['GET'])  # noqa: F821 | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def list_kbs(): | 
					
						
							|  |  |  |     keywords = request.args.get("keywords", "") | 
					
						
							|  |  |  |     page_number = int(request.args.get("page", 1)) | 
					
						
							|  |  |  |     items_per_page = int(request.args.get("page_size", 150)) | 
					
						
							|  |  |  |     orderby = request.args.get("orderby", "create_time") | 
					
						
							|  |  |  |     desc = request.args.get("desc", True) | 
					
						
							|  |  |  |     try: | 
					
						
							|  |  |  |         tenants = TenantService.get_joined_tenants_by_user_id(current_user.id) | 
					
						
							|  |  |  |         kbs, total = UserCanvasService.get_by_tenant_ids( | 
					
						
							|  |  |  |             [m["tenant_id"] for m in tenants], current_user.id, page_number, | 
					
						
							|  |  |  |             items_per_page, orderby, desc, keywords) | 
					
						
							|  |  |  |         return get_json_result(data={"kbs": kbs, "total": total}) | 
					
						
							|  |  |  |     except Exception as e: | 
					
						
							|  |  |  |         return server_error_response(e) | 
					
						
							|  |  |  | @manager.route('/setting', methods=['POST'])  # noqa: F821 | 
					
						
							|  |  |  | @validate_request("id", "title", "permission") | 
					
						
							|  |  |  | @login_required | 
					
						
							|  |  |  | def setting(): | 
					
						
							|  |  |  |     req = request.json | 
					
						
							|  |  |  |     req["user_id"] = current_user.id | 
					
						
							|  |  |  |     e,flow = UserCanvasService.get_by_id(req["id"]) | 
					
						
							|  |  |  |     if not e: | 
					
						
							|  |  |  |         return get_data_error_result(message="canvas not found.") | 
					
						
							|  |  |  |     flow = flow.to_dict() | 
					
						
							|  |  |  |     flow["title"] = req["title"] | 
					
						
							|  |  |  |     if req["description"]: | 
					
						
							|  |  |  |         flow["description"] = req["description"] | 
					
						
							|  |  |  |     if req["permission"]: | 
					
						
							|  |  |  |         flow["permission"] = req["permission"] | 
					
						
							|  |  |  |     if req["avatar"]: | 
					
						
							|  |  |  |         flow["avatar"] = req["avatar"] | 
					
						
							|  |  |  |     if not UserCanvasService.query(user_id=current_user.id, id=req["id"]): | 
					
						
							|  |  |  |         return get_json_result( | 
					
						
							|  |  |  |             data=False, message='Only owner of canvas authorized for this operation.', | 
					
						
							|  |  |  |             code=RetCode.OPERATING_ERROR) | 
					
						
							|  |  |  |     num= UserCanvasService.update_by_id(req["id"], flow) | 
					
						
							|  |  |  |     return get_json_result(data=num) |