Skip to content

Commit 04bae09

Browse files
refactors controllers/environemnt
1 parent 243f39e commit 04bae09

File tree

3 files changed

+174
-81
lines changed

3 files changed

+174
-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: 166 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,230 @@ 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 = self.env
73+
env_repo = EnvRepository(environment=env)
74+
try:
75+
await env_repo.create_env()
76+
except Exception as e:
77+
exc_str = parse_error(e)
78+
logging.error(
79+
f"[{datetime.now()}] controllers.environment.create_env: {exc_str}"
80+
)
5481
raise HTTPException(
5582
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
56-
detail="Failed to create environment",
83+
detail=f"Failed to create environment: {e}",
84+
) from e
85+
else:
86+
return EnvCreated(env_id=env_repo.env_id)
87+
finally:
88+
logging.info(
89+
f"[{datetime.now()}] Call to controllers.environment.create_env completed; params: Env {hash(env)}"
5790
)
5891

59-
return EnvCreated(env_id=str(env.env_id))
60-
6192
@staticmethod
62-
async def get_env(env_id: int) -> "Union[Env, HTTPException]":
93+
async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
6394
"""
6495
Get a env from the database.
6596
6697
Args:
67-
env_id (int): Environment id.
98+
env_id: int
6899
69100
Returns:
70-
env model object
101+
models.Env
71102
72103
Raises:
73104
HTTP 404 Not Found: If the env is not found in the database.
74105
"""
75-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
76-
if not successfully_read_env:
106+
env_repo = EnvRepository(env_id=env_id)
107+
try:
108+
read_env = await env_repo.env
109+
except Exception as e:
110+
exc_str = parse_error(e)
111+
logging.error(
112+
f"[{datetime.now()}] controllers.environment.get_env_by_id: {exc_str}"
113+
)
77114
raise HTTPException(
78-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
115+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
116+
detail=f"Failed to read environment: {e}",
117+
) from e
118+
else:
119+
if read_env:
120+
return read_env
121+
raise HTTPException(
122+
status_code=status.HTTP_404_NOT_FOUND,
123+
detail="Environment not found",
124+
)
125+
finally:
126+
logging.info(
127+
f"[{datetime.now()}] Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
79128
)
80129

81-
return successfully_read_env
82-
83-
@staticmethod
84-
async def get_rocketpy_env(env_id: int) -> "Union[EnvPickle, HTTPException]":
130+
@classmethod
131+
async def get_rocketpy_env_as_jsonpickle(
132+
cls,
133+
env_id: int,
134+
) -> "Union[EnvPickle, HTTPException]":
85135
"""
86-
Get a rocketpy env object encoded as jsonpickle string from the database.
136+
Get rocketpy.Environmnet as jsonpickle string.
87137
88138
Args:
89-
env_id (int): env id.
139+
env_id: int
90140
91141
Returns:
92-
str: jsonpickle string of the rocketpy env.
142+
views.EnvPickle
93143
94144
Raises:
95145
HTTP 404 Not Found: If the env is not found in the database.
96146
"""
97-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
98-
if not successfully_read_env:
147+
env_repo = EnvRepository(env_id=env_id)
148+
try:
149+
read_env = await env_repo.env
150+
except Exception as e:
151+
exc_str = parse_error(e)
152+
logging.error(
153+
f"[{datetime.now()}] controllers.environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
154+
)
155+
raise HTTPException(
156+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
157+
detail=f"Failed to read environment: {e}",
158+
) from e
159+
else:
160+
if read_env:
161+
rocketpy_env = cls.get_rocketpy_env(read_env)
162+
return EnvPickle(
163+
jsonpickle_rocketpy_env=jsonpickle.encode(rocketpy_env)
164+
)
99165
raise HTTPException(
100-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
166+
status_code=status.HTTP_404_NOT_FOUND,
167+
detail="Environment not found",
168+
)
169+
finally:
170+
logging.info(
171+
f"[{datetime.now()}] Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
101172
)
102173

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]":
174+
async def update_env(
175+
self, env_id: int
176+
) -> "Union[EnvUpdated, HTTPException]":
112177
"""
113178
Update a env in the database.
114179
115180
Args:
116-
env_id (int): env id.
181+
env_id: int
117182
118183
Returns:
119-
EnvUpdated: env id and message.
184+
views.EnvUpdated
120185
121186
Raises:
122187
HTTP 404 Not Found: If the env is not found in the database.
123188
"""
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"
189+
env = self.env
190+
env_repo = EnvRepository(environment=env, env_id=env_id)
191+
try:
192+
read_env = await env_repo.env
193+
if read_env:
194+
await env_repo.update_env()
195+
else:
196+
raise HTTPException(
197+
status_code=status.HTTP_404_NOT_FOUND,
198+
detail="Environment not found",
199+
)
200+
except Exception as e:
201+
exc_str = parse_error(e)
202+
logging.error(
203+
f"[{datetime.now()}] controllers.environment.update_env: {exc_str}"
128204
)
129-
130-
successfully_updated_env = await EnvRepository(
131-
environment=self.env, env_id=env_id
132-
).update_env()
133-
if not successfully_updated_env:
134205
raise HTTPException(
135206
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
136-
detail="Failed to update environment",
207+
detail=f"Failed to update environment: {e}",
208+
) from e
209+
else:
210+
return EnvUpdated(new_env_id=env_repo.env_id)
211+
finally:
212+
logging.info(
213+
f"[{datetime.now()}] Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {hash(env)}"
137214
)
138215

139-
return EnvUpdated(new_env_id=str(successfully_updated_env))
140-
141216
@staticmethod
142-
async def delete_env(env_id: int) -> "Union[EnvDeleted, HTTPException]":
217+
async def delete_env(env_id: str) -> "Union[EnvDeleted, HTTPException]":
143218
"""
144219
Delete a env from the database.
145220
146221
Args:
147-
env_id (int): Environment id.
222+
env_id: int
148223
149224
Returns:
150-
EnvDeleted: Environment id and message.
225+
views.EnvDeleted
151226
152227
Raises:
153228
HTTP 404 Not Found: If the env is not found in the database.
154229
"""
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"
230+
env_repo = EnvRepository(env_id=env_id)
231+
try:
232+
await env_repo.delete_env()
233+
except Exception as e:
234+
exc_str = parse_error(e)
235+
logging.error(
236+
f"[{datetime.now()}] controllers.environment.delete_env: {exc_str}"
159237
)
160-
161-
successfully_deleted_env = await EnvRepository(env_id=env_id).delete_env()
162-
if not successfully_deleted_env:
163238
raise HTTPException(
164239
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
165-
detail="Failed to delete environment",
240+
detail=f"Failed to delete environment: {e}",
241+
) from e
242+
else:
243+
return EnvDeleted(deleted_env_id=env_id)
244+
finally:
245+
logging.info(
246+
f"[{datetime.now()}] Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
166247
)
167248

168-
return EnvDeleted(deleted_env_id=str(env_id))
169-
170-
@staticmethod
171-
async def simulate(env_id: int) -> "Union[EnvSummary, HTTPException]":
249+
@classmethod
250+
async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
172251
"""
173252
Simulate a rocket environment.
174253
175254
Args:
176-
env_id (int): Env id.
255+
env_id: int.
177256
178257
Returns:
179-
Env summary view.
258+
views.EnvSummary
180259
181260
Raises:
182261
HTTP 404 Not Found: If the env does not exist in the database.
183262
"""
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-
263+
read_env = await cls.get_env_by_id(env_id)
190264
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())
265+
rocketpy_env = cls.get_rocketpy_env(read_env)
266+
env_simulation_numbers = EnvData.parse_obj(
267+
rocketpy_env.all_info_returned()
268+
)
269+
env_simulation_plots = EnvPlots.parse_obj(
270+
rocketpy_env.all_plot_info_returned()
271+
)
194272
env_summary = EnvSummary(
195273
env_data=env_simulation_numbers, env_plots=env_simulation_plots
196274
)
197-
return env_summary
198275
except Exception as e:
276+
exc_str = parse_error(e)
277+
logging.error(
278+
f"[{datetime.now()}] controllers.environment.simulate: {exc_str}"
279+
)
199280
raise HTTPException(
200281
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
201282
detail=f"Failed to simulate environment: {e}",
202283
) from e
284+
else:
285+
return env_summary
286+
finally:
287+
logging.info(
288+
f"[{datetime.now()}] Call to controllers.environment.simulate completed; params: EnvID {env_id}"
289+
)

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)