Skip to content

Commit 2d9d996

Browse files
refactors controllers/environemnt
1 parent 243f39e commit 2d9d996

File tree

2 files changed

+163
-81
lines changed

2 files changed

+163
-81
lines changed

lib/controllers/environment.py

Lines changed: 161 additions & 79 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,12 @@
11
from typing import Union
2+
from datetime import datetime
23

4+
import logging
35
import jsonpickle
4-
from rocketpy.environment.environment import Environment
6+
from rocketpy.environment.environment import Environment as RocketPyEnvironment
57
from fastapi import HTTPException, status
68

9+
from lib.controllers import parse_error
710
from lib.models.environment import Env
811
from lib.repositories.environment import EnvRepository
912
from lib.views.environment import (
@@ -22,14 +25,28 @@ class EnvController:
2225
Controller for the Environment model.
2326
2427
Init Attributes:
25-
env (models.Env): Environment model object.
28+
env: models.Env
2629
2730
Enables:
28-
- Create a rocketpy.Environment object from an Env model object.
31+
- Simulation of RocketPyEnvironment from models.Env
32+
- CRUD operations over modeols.Env on the database
2933
"""
3034

3135
def __init__(self, env: Env):
32-
rocketpy_env = Environment(
36+
self._env = env
37+
38+
async def get_env(self) -> Env:
39+
return self._env
40+
41+
@staticmethod
42+
async def get_rocketpy_env(env: Env) -> RocketPyEnvironment:
43+
"""
44+
Get the rocketpy env object.
45+
46+
Returns:
47+
RocketPyEnvironment
48+
"""
49+
rocketpy_env = RocketPyEnvironment(
3350
latitude=env.latitude,
3451
longitude=env.longitude,
3552
elevation=env.elevation,
@@ -38,165 +55,230 @@ def __init__(self, env: Env):
3855
rocketpy_env.set_atmospheric_model(
3956
type=env.atmospheric_model_type, file=env.atmospheric_model_file
4057
)
41-
self.rocketpy_env = rocketpy_env
42-
self.env = env
58+
return rocketpy_env
4359

4460
async def create_env(self) -> "Union[EnvCreated, HTTPException]":
4561
"""
4662
Create a env in the database.
4763
4864
Returns:
49-
EnvCreated: Environment id.
65+
views.EnvCreated
5066
"""
51-
env = EnvRepository(environment=self.env)
52-
successfully_created_env = await env.create_env()
53-
if not successfully_created_env:
67+
env = self.get_env()
68+
env_repo = EnvRepository(environment=env)
69+
try:
70+
await env_repo.create_env()
71+
except Exception as e:
72+
exc_str = parse_error(e)
73+
logging.error(
74+
f"[{datetime.now()}] controllers/environment.create_env: {exc_str}"
75+
)
5476
raise HTTPException(
5577
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
56-
detail="Failed to create environment",
78+
detail=f"Failed to create environment: {e}",
79+
) from e
80+
else:
81+
return EnvCreated(env_id=env_repo.get_env_id())
82+
finally:
83+
logging.info(
84+
f"[{datetime.now()}] Call to controllers.environment.create_env completed; params: Env {env.__hash__()}"
5785
)
5886

59-
return EnvCreated(env_id=str(env.env_id))
60-
6187
@staticmethod
62-
async def get_env(env_id: int) -> "Union[Env, HTTPException]":
88+
async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
6389
"""
6490
Get a env from the database.
6591
6692
Args:
67-
env_id (int): Environment id.
93+
env_id: int
6894
6995
Returns:
70-
env model object
96+
models.Env
7197
7298
Raises:
7399
HTTP 404 Not Found: If the env is not found in the database.
74100
"""
75-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
76-
if not successfully_read_env:
101+
env_repo = EnvRepository(env_id=env_id)
102+
try:
103+
read_env = await env_repo.get_env()
104+
except Exception as e:
105+
exc_str = parse_error(e)
106+
logging.error(
107+
f"[{datetime.now()}] controllers/environment.get_env_by_id: {exc_str}"
108+
)
109+
raise HTTPException(
110+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
111+
detail=f"Failed to read environment: {e}",
112+
) from e
113+
else:
114+
if read_env:
115+
return read_env
77116
raise HTTPException(
78-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
117+
status_code=status.HTTP_404_NOT_FOUND,
118+
detail="Environment not found",
119+
)
120+
finally:
121+
logging.info(
122+
f"[{datetime.now()}] Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
79123
)
80124

81-
return successfully_read_env
82-
83-
@staticmethod
84-
async def get_rocketpy_env(env_id: int) -> "Union[EnvPickle, HTTPException]":
125+
@classmethod
126+
async def get_rocketpy_env_as_jsonpickle(
127+
cls,
128+
env_id: int,
129+
) -> "Union[EnvPickle, HTTPException]":
85130
"""
86-
Get a rocketpy env object encoded as jsonpickle string from the database.
131+
Get rocketpy.Environmnet as jsonpickle string.
87132
88133
Args:
89-
env_id (int): env id.
134+
env_id: int
90135
91136
Returns:
92-
str: jsonpickle string of the rocketpy env.
137+
views.EnvPickle
93138
94139
Raises:
95140
HTTP 404 Not Found: If the env is not found in the database.
96141
"""
97-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
98-
if not successfully_read_env:
142+
env_repo = EnvRepository(env_id=env_id)
143+
try:
144+
read_env = await env_repo.get_env()
145+
except Exception as e:
146+
exc_str = parse_error(e)
147+
logging.error(
148+
f"[{datetime.now()}] controllers/environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
149+
)
150+
raise HTTPException(
151+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
152+
detail=f"Failed to read environment: {e}",
153+
) from e
154+
else:
155+
if read_env:
156+
rocketpy_env = cls.get_rocketpy_env(read_env)
157+
return EnvPickle(
158+
jsonpickle_rocketpy_env=jsonpickle.encode(rocketpy_env)
159+
)
99160
raise HTTPException(
100-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
161+
status_code=status.HTTP_404_NOT_FOUND,
162+
detail="Environment not found",
163+
)
164+
finally:
165+
logging.info(
166+
f"[{datetime.now()}] Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
101167
)
102168

103-
successfully_read_rocketpy_env = EnvController(
104-
successfully_read_env
105-
).rocketpy_env
106-
107-
return EnvPickle(
108-
jsonpickle_rocketpy_env=jsonpickle.encode(successfully_read_rocketpy_env)
109-
)
110-
111-
async def update_env(self, env_id: int) -> "Union[EnvUpdated, HTTPException]":
169+
async def update_env(
170+
self, env_id: int
171+
) -> "Union[EnvUpdated, HTTPException]":
112172
"""
113173
Update a env in the database.
114174
115175
Args:
116-
env_id (int): env id.
176+
env_id: int
117177
118178
Returns:
119-
EnvUpdated: env id and message.
179+
views.EnvUpdated
120180
121181
Raises:
122182
HTTP 404 Not Found: If the env is not found in the database.
123183
"""
124-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
125-
if not successfully_read_env:
126-
raise HTTPException(
127-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
184+
env = self.get_env()
185+
env_repo = EnvRepository(environment=env, env_id=env_id)
186+
try:
187+
read_env = await env_repo.get_env()
188+
if read_env:
189+
await env_repo.update_env()
190+
else:
191+
raise HTTPException(
192+
status_code=status.HTTP_404_NOT_FOUND,
193+
detail="Environment not found",
194+
)
195+
except Exception as e:
196+
exc_str = parse_error(e)
197+
logging.error(
198+
f"[{datetime.now()}] controllers/environment.update_env: {exc_str}"
128199
)
129-
130-
successfully_updated_env = await EnvRepository(
131-
environment=self.env, env_id=env_id
132-
).update_env()
133-
if not successfully_updated_env:
134200
raise HTTPException(
135201
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
136-
detail="Failed to update environment",
202+
detail=f"Failed to update environment: {e}",
203+
) from e
204+
else:
205+
return EnvUpdated(new_env_id=env_repo.get_env_id())
206+
finally:
207+
logging.info(
208+
f"[{datetime.now()}] Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {env.__hash__()}"
137209
)
138210

139-
return EnvUpdated(new_env_id=str(successfully_updated_env))
140-
141211
@staticmethod
142-
async def delete_env(env_id: int) -> "Union[EnvDeleted, HTTPException]":
212+
async def delete_env(env_id: str) -> "Union[EnvDeleted, HTTPException]":
143213
"""
144214
Delete a env from the database.
145215
146216
Args:
147-
env_id (int): Environment id.
217+
env_id: int
148218
149219
Returns:
150-
EnvDeleted: Environment id and message.
220+
views.EnvDeleted
151221
152222
Raises:
153223
HTTP 404 Not Found: If the env is not found in the database.
154224
"""
155-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
156-
if not successfully_read_env:
157-
raise HTTPException(
158-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
225+
env_repo = EnvRepository(env_id=env_id)
226+
try:
227+
await env_repo.delete_env()
228+
except Exception as e:
229+
exc_str = parse_error(e)
230+
logging.error(
231+
f"[{datetime.now()}] controllers/environment.delete_env: {exc_str}"
159232
)
160-
161-
successfully_deleted_env = await EnvRepository(env_id=env_id).delete_env()
162-
if not successfully_deleted_env:
163233
raise HTTPException(
164234
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
165-
detail="Failed to delete environment",
235+
detail=f"Failed to delete environment: {e}",
236+
) from e
237+
else:
238+
return EnvDeleted(deleted_env_id=env_id)
239+
finally:
240+
logging.info(
241+
f"[{datetime.now()}] Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
166242
)
167243

168-
return EnvDeleted(deleted_env_id=str(env_id))
169-
170-
@staticmethod
171-
async def simulate(env_id: int) -> "Union[EnvSummary, HTTPException]":
244+
@classmethod
245+
async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
172246
"""
173247
Simulate a rocket environment.
174248
175249
Args:
176-
env_id (int): Env id.
250+
env_id: int.
177251
178252
Returns:
179-
Env summary view.
253+
views.EnvSummary
180254
181255
Raises:
182256
HTTP 404 Not Found: If the env does not exist in the database.
183257
"""
184-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
185-
if not successfully_read_env:
186-
raise HTTPException(
187-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
188-
)
189-
258+
read_env = await cls.get_env_by_id(env_id)
190259
try:
191-
env = EnvController(successfully_read_env).rocketpy_env
192-
env_simulation_numbers = EnvData.parse_obj(env.all_info_returned())
193-
env_simulation_plots = EnvPlots.parse_obj(env.all_plot_info_returned())
260+
rocketpy_env = cls.get_rocketpy_env(read_env)
261+
env_simulation_numbers = EnvData.parse_obj(
262+
rocketpy_env.all_info_returned()
263+
)
264+
env_simulation_plots = EnvPlots.parse_obj(
265+
rocketpy_env.all_plot_info_returned()
266+
)
194267
env_summary = EnvSummary(
195268
env_data=env_simulation_numbers, env_plots=env_simulation_plots
196269
)
197-
return env_summary
198270
except Exception as e:
271+
exc_str = parse_error(e)
272+
logging.error(
273+
f"[{datetime.now()}] controllers/environment.simulate: {exc_str}"
274+
)
199275
raise HTTPException(
200276
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
201277
detail=f"Failed to simulate environment: {e}",
202278
) from e
279+
else:
280+
return env_summary
281+
finally:
282+
logging.info(
283+
f"[{datetime.now()}] Call to controllers.environment.simulate completed; params: EnvID {env_id}"
284+
)

lib/models/environment.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,6 @@ class Env(BaseModel, frozen=True):
1111
# Opional parameters
1212
atmospheric_model_type: Optional[str] = "standard_atmosphere"
1313
atmospheric_model_file: Optional[str] = "GFS"
14-
date: Optional[datetime.datetime] = datetime.datetime.today() + datetime.timedelta(
15-
days=1
14+
date: Optional[datetime.datetime] = (
15+
datetime.datetime.today() + datetime.timedelta(days=1)
1616
)

0 commit comments

Comments
 (0)