@@ -560,71 +560,78 @@ def import_project() -> flask.Response:
560560 return flask .make_response ({"snapshot" : snapshot }, 200 )
561561
562562
563- # @routes.route(
564- # schemas_dict["import_extension"]["route"],
565- # methods=schemas_dict["import_extension"]["methods"],
566- # )
567- # def import_extension() -> flask.Response:
568- # """Import a .vext extension file and extract its contents."""
569- # utils_functions.validate_request(flask.request, schemas_dict["import_extension"])
570-
571- # if "file" not in flask.request.files:
572- # flask.abort(400, "No .vext file provided under 'file'")
573-
574- # vext_file = flask.request.files["file"]
575- # assert vext_file.filename is not None
576- # filename = werkzeug.utils.secure_filename(os.path.basename(vext_file.filename))
577-
578- # if not filename.lower().endswith(".vext"):
579- # flask.abort(400, "Uploaded file must be a .vext")
580-
581- # # Create extensions directory in the data folder
582- # extensions_folder = flask.current_app.config["EXTENSIONS_FOLDER_PATH"]
583- # os.makedirs(extensions_folder, exist_ok=True)
584-
585- # extension_name = (
586- # filename.rsplit("-", 1)[0] if "-" in filename else filename.replace(".vext", "")
587- # )
588- # extension_path = os.path.join(extensions_folder, extension_name)
589-
590- # # Remove existing extension if present
591- # if os.path.exists(extension_path):
592- # shutil.rmtree(extension_path)
593-
594- # os.makedirs(extension_path, exist_ok=True)
595-
596- # # Extract the .vext file
597- # vext_file.stream.seek(0)
598- # with zipfile.ZipFile(vext_file.stream) as zip_archive:
599- # zip_archive.extractall(extension_path)
600-
601- # # Look for the backend executable and frontend JS
602- # backend_executable = None
603- # frontend_file = None
604-
605- # for file in os.listdir(extension_path):
606- # file_path = os.path.join(extension_path, file)
607- # if os.path.isfile(file_path):
608- # if file.endswith(".es.js"):
609- # frontend_file = file_path
610- # elif not file.endswith(".js") and not file.endswith(".css"):
611- # backend_executable = file_path
612- # os.chmod(backend_executable, 0o755)
613-
614- # if not frontend_file:
615- # flask.abort(400, "Invalid .vext file: missing frontend JavaScript")
616- # if not backend_executable:
617- # flask.abort(400, "Invalid .vext file: missing backend executable")
618-
619- # assert frontend_file is not None
620- # with open(frontend_file, "r", encoding="utf-8") as f:
621- # frontend_content = f.read()
622-
623- # return flask.make_response(
624- # {
625- # "extension_name": extension_name,
626- # "frontend_content": frontend_content,
627- # "backend_path": backend_executable,
628- # },
629- # 200,
630- # )
563+ @routes .route (
564+ schemas_dict ["import_extension" ]["route" ],
565+ methods = schemas_dict ["import_extension" ]["methods" ],
566+ )
567+ def import_extension () -> flask .Response :
568+ """Import a .vext extension file and extract its contents."""
569+ utils_functions .validate_request (flask .request , schemas_dict ["import_extension" ])
570+
571+ if "file" not in flask .request .files :
572+ flask .abort (400 , "No .vext file provided under 'file'" )
573+
574+ vext_file = flask .request .files ["file" ]
575+ assert vext_file .filename is not None
576+ filename = werkzeug .utils .secure_filename (os .path .basename (vext_file .filename ))
577+
578+ if not filename .lower ().endswith (".vext" ):
579+ flask .abort (400 , "Uploaded file must be a .vext" )
580+
581+
582+ # Create extensions directory in the data folder
583+ extensions_folder = flask .current_app .config ["EXTENSIONS_FOLDER_PATH" ]
584+ os .makedirs (extensions_folder , exist_ok = True )
585+
586+ archive_path = os .path .join (extensions_folder , filename )
587+
588+ # Remove existing extension if present
589+ unziped_extension_path = os .path .join (archive_path .replace (".vext" , "" ))
590+ if os .path .exists (unziped_extension_path ):
591+ shutil .rmtree (unziped_extension_path )
592+
593+ os .makedirs (unziped_extension_path , exist_ok = True )
594+
595+ # Extract the .vext file
596+ vext_file .stream .seek (0 )
597+ with zipfile .ZipFile (vext_file .stream ) as zip_archive :
598+ zip_archive .extractall (unziped_extension_path )
599+
600+ metadata_path = os .path .join (unziped_extension_path , "metadata.json" )
601+ if not os .path .isfile (metadata_path ):
602+ flask .abort (400 , "Invalid .vext file: missing metadata.json" )
603+ with open (metadata_path , "r" , encoding = "utf-8" ) as f :
604+ metadata = flask .json .load (f )
605+
606+
607+ # Look for the backend executable and frontend JS
608+ backend_executable = None
609+ frontend_file = None
610+
611+ for file in os .listdir (unziped_extension_path ):
612+ file_path = os .path .join (unziped_extension_path , file )
613+ if os .path .isfile (file_path ):
614+ if file .endswith (".es.js" ):
615+ frontend_file = file_path
616+ elif not file .endswith (".js" ) and not file .endswith (".css" ):
617+ backend_executable = file_path
618+ os .chmod (backend_executable , 0o755 )
619+
620+ if not frontend_file :
621+ flask .abort (400 , "Invalid .vext file: missing frontend JavaScript" )
622+ if not backend_executable :
623+ flask .abort (400 , "Invalid .vext file: missing backend executable" )
624+
625+ assert frontend_file is not None
626+ with open (frontend_file , "r" , encoding = "utf-8" ) as f :
627+ frontend_content = f .read ()
628+
629+ return flask .make_response (
630+ {
631+ "extension_name" : metadata ["name" ],
632+ "extension_version" : metadata ["version" ],
633+ "frontend_content" : frontend_content ,
634+ "backend_path" : metadata ["microservice_executable" ],
635+ },
636+ 200 ,
637+ )
0 commit comments