Skip to content

Commit 79a4b53

Browse files
refactors controllers/environemnt
1 parent 243f39e commit 79a4b53

File tree

3 files changed

+172
-81
lines changed

3 files changed

+172
-81
lines changed

lib/controllers/__init__.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# lib/controllers/__init__.py
2+
3+
4+
def parse_error(e):
5+
exc_str = f"{e}".replace("\n", " ").replace(" ", " ")
6+
return exc_str

lib/controllers/environment.py

Lines changed: 164 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,33 @@ 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+
@property
39+
async def env(self) -> Env:
40+
return self._env
41+
42+
@env.setter
43+
def env(self, env: Env):
44+
self._env = env
45+
46+
@staticmethod
47+
async def get_rocketpy_env(env: Env) -> RocketPyEnvironment:
48+
"""
49+
Get the rocketpy env object.
50+
51+
Returns:
52+
RocketPyEnvironment
53+
"""
54+
rocketpy_env = RocketPyEnvironment(
3355
latitude=env.latitude,
3456
longitude=env.longitude,
3557
elevation=env.elevation,
@@ -38,165 +60,228 @@ def __init__(self, env: Env):
3860
rocketpy_env.set_atmospheric_model(
3961
type=env.atmospheric_model_type, file=env.atmospheric_model_file
4062
)
41-
self.rocketpy_env = rocketpy_env
42-
self.env = env
63+
return rocketpy_env
4364

4465
async def create_env(self) -> "Union[EnvCreated, HTTPException]":
4566
"""
4667
Create a env in the database.
4768
4869
Returns:
49-
EnvCreated: Environment id.
70+
views.EnvCreated
5071
"""
51-
env = EnvRepository(environment=self.env)
52-
successfully_created_env = await env.create_env()
53-
if not successfully_created_env:
72+
env_repo = EnvRepository(environment=self.env)
73+
try:
74+
await env_repo.create_env()
75+
except Exception as e:
76+
exc_str = parse_error(e)
77+
logging.error(
78+
f"[{datetime.now()}] controllers.environment.create_env: {exc_str}"
79+
)
5480
raise HTTPException(
5581
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
56-
detail="Failed to create environment",
82+
detail=f"Failed to create environment: {e}",
83+
) from e
84+
else:
85+
return EnvCreated(env_id=env_repo.env_id)
86+
finally:
87+
logging.info(
88+
f"[{datetime.now()}] Call to controllers.environment.create_env completed; params: Env {hash(self.env)}"
5789
)
5890

59-
return EnvCreated(env_id=str(env.env_id))
60-
6191
@staticmethod
62-
async def get_env(env_id: int) -> "Union[Env, HTTPException]":
92+
async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
6393
"""
6494
Get a env from the database.
6595
6696
Args:
67-
env_id (int): Environment id.
97+
env_id: int
6898
6999
Returns:
70-
env model object
100+
models.Env
71101
72102
Raises:
73103
HTTP 404 Not Found: If the env is not found in the database.
74104
"""
75-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
76-
if not successfully_read_env:
105+
env_repo = EnvRepository(env_id=env_id)
106+
try:
107+
read_env = await env_repo.get_env()
108+
except Exception as e:
109+
exc_str = parse_error(e)
110+
logging.error(
111+
f"[{datetime.now()}] controllers.environment.get_env_by_id: {exc_str}"
112+
)
77113
raise HTTPException(
78-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
114+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
115+
detail=f"Failed to read environment: {e}",
116+
) from e
117+
else:
118+
if read_env:
119+
return read_env
120+
raise HTTPException(
121+
status_code=status.HTTP_404_NOT_FOUND,
122+
detail="Environment not found",
123+
)
124+
finally:
125+
logging.info(
126+
f"[{datetime.now()}] Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
79127
)
80128

81-
return successfully_read_env
82-
83-
@staticmethod
84-
async def get_rocketpy_env(env_id: int) -> "Union[EnvPickle, HTTPException]":
129+
@classmethod
130+
async def get_rocketpy_env_as_jsonpickle(
131+
cls,
132+
env_id: int,
133+
) -> "Union[EnvPickle, HTTPException]":
85134
"""
86-
Get a rocketpy env object encoded as jsonpickle string from the database.
135+
Get rocketpy.Environmnet as jsonpickle string.
87136
88137
Args:
89-
env_id (int): env id.
138+
env_id: int
90139
91140
Returns:
92-
str: jsonpickle string of the rocketpy env.
141+
views.EnvPickle
93142
94143
Raises:
95144
HTTP 404 Not Found: If the env is not found in the database.
96145
"""
97-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
98-
if not successfully_read_env:
146+
env_repo = EnvRepository(env_id=env_id)
147+
try:
148+
read_env = await env_repo.get_env()
149+
except Exception as e:
150+
exc_str = parse_error(e)
151+
logging.error(
152+
f"[{datetime.now()}] controllers.environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
153+
)
154+
raise HTTPException(
155+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
156+
detail=f"Failed to read environment: {e}",
157+
) from e
158+
else:
159+
if read_env:
160+
rocketpy_env = cls.get_rocketpy_env(read_env)
161+
return EnvPickle(
162+
jsonpickle_rocketpy_env=jsonpickle.encode(rocketpy_env)
163+
)
99164
raise HTTPException(
100-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
165+
status_code=status.HTTP_404_NOT_FOUND,
166+
detail="Environment not found",
167+
)
168+
finally:
169+
logging.info(
170+
f"[{datetime.now()}] Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
101171
)
102172

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]":
173+
async def update_env(
174+
self, env_id: int
175+
) -> "Union[EnvUpdated, HTTPException]":
112176
"""
113177
Update a env in the database.
114178
115179
Args:
116-
env_id (int): env id.
180+
env_id: int
117181
118182
Returns:
119-
EnvUpdated: env id and message.
183+
views.EnvUpdated
120184
121185
Raises:
122186
HTTP 404 Not Found: If the env is not found in the database.
123187
"""
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"
188+
env_repo = EnvRepository(environment=self.env, env_id=env_id)
189+
try:
190+
read_env = await env_repo.get_env()
191+
if read_env:
192+
await env_repo.update_env()
193+
else:
194+
raise HTTPException(
195+
status_code=status.HTTP_404_NOT_FOUND,
196+
detail="Environment not found",
197+
)
198+
except Exception as e:
199+
exc_str = parse_error(e)
200+
logging.error(
201+
f"[{datetime.now()}] controllers.environment.update_env: {exc_str}"
128202
)
129-
130-
successfully_updated_env = await EnvRepository(
131-
environment=self.env, env_id=env_id
132-
).update_env()
133-
if not successfully_updated_env:
134203
raise HTTPException(
135204
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
136-
detail="Failed to update environment",
205+
detail=f"Failed to update environment: {e}",
206+
) from e
207+
else:
208+
return EnvUpdated(new_env_id=env_repo.env_id)
209+
finally:
210+
logging.info(
211+
f"[{datetime.now()}] Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {hash(self.env)}"
137212
)
138213

139-
return EnvUpdated(new_env_id=str(successfully_updated_env))
140-
141214
@staticmethod
142-
async def delete_env(env_id: int) -> "Union[EnvDeleted, HTTPException]":
215+
async def delete_env(env_id: str) -> "Union[EnvDeleted, HTTPException]":
143216
"""
144217
Delete a env from the database.
145218
146219
Args:
147-
env_id (int): Environment id.
220+
env_id: int
148221
149222
Returns:
150-
EnvDeleted: Environment id and message.
223+
views.EnvDeleted
151224
152225
Raises:
153226
HTTP 404 Not Found: If the env is not found in the database.
154227
"""
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"
228+
env_repo = EnvRepository(env_id=env_id)
229+
try:
230+
await env_repo.delete_env()
231+
except Exception as e:
232+
exc_str = parse_error(e)
233+
logging.error(
234+
f"[{datetime.now()}] controllers.environment.delete_env: {exc_str}"
159235
)
160-
161-
successfully_deleted_env = await EnvRepository(env_id=env_id).delete_env()
162-
if not successfully_deleted_env:
163236
raise HTTPException(
164237
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
165-
detail="Failed to delete environment",
238+
detail=f"Failed to delete environment: {e}",
239+
) from e
240+
else:
241+
return EnvDeleted(deleted_env_id=env_id)
242+
finally:
243+
logging.info(
244+
f"[{datetime.now()}] Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
166245
)
167246

168-
return EnvDeleted(deleted_env_id=str(env_id))
169-
170-
@staticmethod
171-
async def simulate(env_id: int) -> "Union[EnvSummary, HTTPException]":
247+
@classmethod
248+
async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
172249
"""
173250
Simulate a rocket environment.
174251
175252
Args:
176-
env_id (int): Env id.
253+
env_id: int.
177254
178255
Returns:
179-
Env summary view.
256+
views.EnvSummary
180257
181258
Raises:
182259
HTTP 404 Not Found: If the env does not exist in the database.
183260
"""
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-
261+
read_env = await cls.get_env_by_id(env_id)
190262
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())
263+
rocketpy_env = cls.get_rocketpy_env(read_env)
264+
env_simulation_numbers = EnvData.parse_obj(
265+
rocketpy_env.all_info_returned()
266+
)
267+
env_simulation_plots = EnvPlots.parse_obj(
268+
rocketpy_env.all_plot_info_returned()
269+
)
194270
env_summary = EnvSummary(
195271
env_data=env_simulation_numbers, env_plots=env_simulation_plots
196272
)
197-
return env_summary
198273
except Exception as e:
274+
exc_str = parse_error(e)
275+
logging.error(
276+
f"[{datetime.now()}] controllers.environment.simulate: {exc_str}"
277+
)
199278
raise HTTPException(
200279
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
201280
detail=f"Failed to simulate environment: {e}",
202281
) from e
282+
else:
283+
return env_summary
284+
finally:
285+
logging.info(
286+
f"[{datetime.now()}] Call to controllers.environment.simulate completed; params: EnvID {env_id}"
287+
)

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)