11from typing import Union
22
33import jsonpickle
4- from rocketpy .environment .environment import Environment as RocketPyEnvironment
54from fastapi import HTTPException , status
5+ from pymongo .errors import PyMongoError
66
77from lib import logger , parse_error
88from lib .models .environment import Env
9+ from lib .services .environment import EnvironmentService
910from lib .repositories .environment import EnvRepository
1011from lib .views .environment import (
1112 EnvSummary ,
12- EnvData ,
13- EnvPlots ,
1413 EnvCreated ,
1514 EnvDeleted ,
1615 EnvUpdated ,
@@ -26,7 +25,7 @@ class EnvController:
2625 env: models.Env
2726
2827 Enables:
29- - Simulation of RocketPyEnvironment from models.Env
28+ - Simulation of a RocketPy Environment from models.Env
3029 - CRUD operations over models.Env on the database
3130 """
3231
@@ -41,25 +40,6 @@ def env(self) -> Env:
4140 def env (self , env : Env ):
4241 self ._env = env
4342
44- @staticmethod
45- def get_rocketpy_env (env : Env ) -> RocketPyEnvironment :
46- """
47- Get the rocketpy env object.
48-
49- Returns:
50- RocketPyEnvironment
51- """
52- rocketpy_env = RocketPyEnvironment (
53- latitude = env .latitude ,
54- longitude = env .longitude ,
55- elevation = env .elevation ,
56- date = env .date ,
57- )
58- rocketpy_env .set_atmospheric_model (
59- type = env .atmospheric_model_type , file = env .atmospheric_model_file
60- )
61- return rocketpy_env
62-
6343 async def create_env (self ) -> Union [EnvCreated , HTTPException ]:
6444 """
6545 Create a env in the database.
@@ -71,6 +51,16 @@ async def create_env(self) -> Union[EnvCreated, HTTPException]:
7151 async with EnvRepository () as env_repo :
7252 env_repo .fetch_env (self .env )
7353 await env_repo .create_env ()
54+ except PyMongoError as e :
55+ logger .error (
56+ f"controllers.environment.create_env: PyMongoError { e } "
57+ )
58+ raise HTTPException (
59+ status_code = status .HTTP_503_SERVICE_UNAVAILABLE ,
60+ detail = "Failed to create environment in db" ,
61+ ) from e
62+ except HTTPException as e :
63+ raise e from e
7464 except Exception as e :
7565 exc_str = parse_error (e )
7666 logger .error (f"controllers.environment.create_env: { exc_str } " )
@@ -103,6 +93,16 @@ async def get_env_by_id(env_id: str) -> Union[Env, HTTPException]:
10393 async with EnvRepository () as env_repo :
10494 await env_repo .get_env_by_id (env_id )
10595 read_env = env_repo .env
96+ except PyMongoError as e :
97+ logger .error (
98+ f"controllers.environment.get_env_by_id: PyMongoError { e } "
99+ )
100+ raise HTTPException (
101+ status_code = status .HTTP_503_SERVICE_UNAVAILABLE ,
102+ detail = "Failed to read environment from db" ,
103+ ) from e
104+ except HTTPException as e :
105+ raise e from e
106106 except Exception as e :
107107 exc_str = parse_error (e )
108108 logger .error (f"controllers.environment.get_env_by_id: { exc_str } " )
@@ -141,7 +141,7 @@ async def get_rocketpy_env_as_jsonpickle(
141141 """
142142 try :
143143 read_env = await cls .get_env_by_id (env_id )
144- rocketpy_env = cls . get_rocketpy_env (read_env )
144+ rocketpy_env = EnvironmentService . from_env_model (read_env )
145145 except HTTPException as e :
146146 raise e from e
147147 except Exception as e :
@@ -182,6 +182,16 @@ async def update_env_by_id(
182182 env_repo .fetch_env (self .env )
183183 await env_repo .create_env ()
184184 await env_repo .delete_env_by_id (env_id )
185+ except PyMongoError as e :
186+ logger .error (
187+ f"controllers.environment.update_env: PyMongoError { e } "
188+ )
189+ raise HTTPException (
190+ status_code = status .HTTP_503_SERVICE_UNAVAILABLE ,
191+ detail = "Failed to update environment from db" ,
192+ ) from e
193+ except HTTPException as e :
194+ raise e from e
185195 except Exception as e :
186196 exc_str = parse_error (e )
187197 logger .error (f"controllers.environment.update_env: { exc_str } " )
@@ -215,6 +225,16 @@ async def delete_env_by_id(
215225 try :
216226 async with EnvRepository () as env_repo :
217227 await env_repo .delete_env_by_id (env_id )
228+ except PyMongoError as e :
229+ logger .error (
230+ f"controllers.environment.delete_env: PyMongoError { e } "
231+ )
232+ raise HTTPException (
233+ status_code = status .HTTP_503_SERVICE_UNAVAILABLE ,
234+ detail = "Failed to delete environment from db" ,
235+ ) from e
236+ except HTTPException as e :
237+ raise e from e
218238 except Exception as e :
219239 exc_str = parse_error (e )
220240 logger .error (f"controllers.environment.delete_env: { exc_str } " )
@@ -240,24 +260,15 @@ async def simulate_env(
240260 env_id: str.
241261
242262 Returns:
243- views. EnvSummary
263+ EnvSummary
244264
245265 Raises:
246266 HTTP 404 Not Found: If the env does not exist in the database.
247267 """
248268 try :
249269 read_env = await cls .get_env_by_id (env_id )
250- rocketpy_env = cls .get_rocketpy_env (read_env )
251-
252- env_simulation_numbers = EnvData .parse_obj (
253- rocketpy_env .all_info_returned ()
254- )
255- env_simulation_plots = EnvPlots .parse_obj (
256- rocketpy_env .all_plot_info_returned ()
257- )
258- env_summary = EnvSummary (
259- env_data = env_simulation_numbers , env_plots = env_simulation_plots
260- )
270+ rocketpy_env = EnvironmentService .from_env_model (read_env )
271+ env_summary = rocketpy_env .get_env_summary ()
261272 except HTTPException as e :
262273 raise e from e
263274 except Exception as e :
0 commit comments