Skip to content

Commit 1dd4e4d

Browse files
refactors controllers/environemnt
1 parent 243f39e commit 1dd4e4d

File tree

3 files changed

+170
-81
lines changed

3 files changed

+170
-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: 162 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,29 @@ 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+
@staticmethod
43+
async def get_rocketpy_env(env: Env) -> RocketPyEnvironment:
44+
"""
45+
Get the rocketpy env object.
46+
47+
Returns:
48+
RocketPyEnvironment
49+
"""
50+
rocketpy_env = RocketPyEnvironment(
3351
latitude=env.latitude,
3452
longitude=env.longitude,
3553
elevation=env.elevation,
@@ -38,165 +56,230 @@ def __init__(self, env: Env):
3856
rocketpy_env.set_atmospheric_model(
3957
type=env.atmospheric_model_type, file=env.atmospheric_model_file
4058
)
41-
self.rocketpy_env = rocketpy_env
42-
self.env = env
59+
return rocketpy_env
4360

4461
async def create_env(self) -> "Union[EnvCreated, HTTPException]":
4562
"""
4663
Create a env in the database.
4764
4865
Returns:
49-
EnvCreated: Environment id.
66+
views.EnvCreated
5067
"""
51-
env = EnvRepository(environment=self.env)
52-
successfully_created_env = await env.create_env()
53-
if not successfully_created_env:
68+
env = self.env
69+
env_repo = EnvRepository(environment=env)
70+
try:
71+
await env_repo.create_env()
72+
except Exception as e:
73+
exc_str = parse_error(e)
74+
logging.error(
75+
f"[{datetime.now()}] controllers.environment.create_env: {exc_str}"
76+
)
5477
raise HTTPException(
5578
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
56-
detail="Failed to create environment",
79+
detail=f"Failed to create environment: {e}",
80+
) from e
81+
else:
82+
return EnvCreated(env_id=env_repo.env_id)
83+
finally:
84+
logging.info(
85+
f"[{datetime.now()}] Call to controllers.environment.create_env completed; params: Env {hash(env)}"
5786
)
5887

59-
return EnvCreated(env_id=str(env.env_id))
60-
6188
@staticmethod
62-
async def get_env(env_id: int) -> "Union[Env, HTTPException]":
89+
async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
6390
"""
6491
Get a env from the database.
6592
6693
Args:
67-
env_id (int): Environment id.
94+
env_id: int
6895
6996
Returns:
70-
env model object
97+
models.Env
7198
7299
Raises:
73100
HTTP 404 Not Found: If the env is not found in the database.
74101
"""
75-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
76-
if not successfully_read_env:
102+
env_repo = EnvRepository(env_id=env_id)
103+
try:
104+
read_env = await env_repo.env
105+
except Exception as e:
106+
exc_str = parse_error(e)
107+
logging.error(
108+
f"[{datetime.now()}] controllers.environment.get_env_by_id: {exc_str}"
109+
)
110+
raise HTTPException(
111+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
112+
detail=f"Failed to read environment: {e}",
113+
) from e
114+
else:
115+
if read_env:
116+
return read_env
77117
raise HTTPException(
78-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
118+
status_code=status.HTTP_404_NOT_FOUND,
119+
detail="Environment not found",
120+
)
121+
finally:
122+
logging.info(
123+
f"[{datetime.now()}] Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
79124
)
80125

81-
return successfully_read_env
82-
83-
@staticmethod
84-
async def get_rocketpy_env(env_id: int) -> "Union[EnvPickle, HTTPException]":
126+
@classmethod
127+
async def get_rocketpy_env_as_jsonpickle(
128+
cls,
129+
env_id: int,
130+
) -> "Union[EnvPickle, HTTPException]":
85131
"""
86-
Get a rocketpy env object encoded as jsonpickle string from the database.
132+
Get rocketpy.Environmnet as jsonpickle string.
87133
88134
Args:
89-
env_id (int): env id.
135+
env_id: int
90136
91137
Returns:
92-
str: jsonpickle string of the rocketpy env.
138+
views.EnvPickle
93139
94140
Raises:
95141
HTTP 404 Not Found: If the env is not found in the database.
96142
"""
97-
successfully_read_env = await EnvRepository(env_id=env_id).get_env()
98-
if not successfully_read_env:
143+
env_repo = EnvRepository(env_id=env_id)
144+
try:
145+
read_env = await env_repo.env
146+
except Exception as e:
147+
exc_str = parse_error(e)
148+
logging.error(
149+
f"[{datetime.now()}] controllers.environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
150+
)
151+
raise HTTPException(
152+
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
153+
detail=f"Failed to read environment: {e}",
154+
) from e
155+
else:
156+
if read_env:
157+
rocketpy_env = cls.get_rocketpy_env(read_env)
158+
return EnvPickle(
159+
jsonpickle_rocketpy_env=jsonpickle.encode(rocketpy_env)
160+
)
99161
raise HTTPException(
100-
status_code=status.HTTP_404_NOT_FOUND, detail="Environment not found"
162+
status_code=status.HTTP_404_NOT_FOUND,
163+
detail="Environment not found",
164+
)
165+
finally:
166+
logging.info(
167+
f"[{datetime.now()}] Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
101168
)
102169

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]":
170+
async def update_env(
171+
self, env_id: int
172+
) -> "Union[EnvUpdated, HTTPException]":
112173
"""
113174
Update a env in the database.
114175
115176
Args:
116-
env_id (int): env id.
177+
env_id: int
117178
118179
Returns:
119-
EnvUpdated: env id and message.
180+
views.EnvUpdated
120181
121182
Raises:
122183
HTTP 404 Not Found: If the env is not found in the database.
123184
"""
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"
185+
env = self.env
186+
env_repo = EnvRepository(environment=env, env_id=env_id)
187+
try:
188+
read_env = await env_repo.env
189+
if read_env:
190+
await env_repo.update_env()
191+
else:
192+
raise HTTPException(
193+
status_code=status.HTTP_404_NOT_FOUND,
194+
detail="Environment not found",
195+
)
196+
except Exception as e:
197+
exc_str = parse_error(e)
198+
logging.error(
199+
f"[{datetime.now()}] controllers.environment.update_env: {exc_str}"
128200
)
129-
130-
successfully_updated_env = await EnvRepository(
131-
environment=self.env, env_id=env_id
132-
).update_env()
133-
if not successfully_updated_env:
134201
raise HTTPException(
135202
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
136-
detail="Failed to update environment",
203+
detail=f"Failed to update environment: {e}",
204+
) from e
205+
else:
206+
return EnvUpdated(new_env_id=env_repo.env_id)
207+
finally:
208+
logging.info(
209+
f"[{datetime.now()}] Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {hash(env)}"
137210
)
138211

139-
return EnvUpdated(new_env_id=str(successfully_updated_env))
140-
141212
@staticmethod
142-
async def delete_env(env_id: int) -> "Union[EnvDeleted, HTTPException]":
213+
async def delete_env(env_id: str) -> "Union[EnvDeleted, HTTPException]":
143214
"""
144215
Delete a env from the database.
145216
146217
Args:
147-
env_id (int): Environment id.
218+
env_id: int
148219
149220
Returns:
150-
EnvDeleted: Environment id and message.
221+
views.EnvDeleted
151222
152223
Raises:
153224
HTTP 404 Not Found: If the env is not found in the database.
154225
"""
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"
226+
env_repo = EnvRepository(env_id=env_id)
227+
try:
228+
await env_repo.delete_env()
229+
except Exception as e:
230+
exc_str = parse_error(e)
231+
logging.error(
232+
f"[{datetime.now()}] controllers.environment.delete_env: {exc_str}"
159233
)
160-
161-
successfully_deleted_env = await EnvRepository(env_id=env_id).delete_env()
162-
if not successfully_deleted_env:
163234
raise HTTPException(
164235
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
165-
detail="Failed to delete environment",
236+
detail=f"Failed to delete environment: {e}",
237+
) from e
238+
else:
239+
return EnvDeleted(deleted_env_id=env_id)
240+
finally:
241+
logging.info(
242+
f"[{datetime.now()}] Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
166243
)
167244

168-
return EnvDeleted(deleted_env_id=str(env_id))
169-
170-
@staticmethod
171-
async def simulate(env_id: int) -> "Union[EnvSummary, HTTPException]":
245+
@classmethod
246+
async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
172247
"""
173248
Simulate a rocket environment.
174249
175250
Args:
176-
env_id (int): Env id.
251+
env_id: int.
177252
178253
Returns:
179-
Env summary view.
254+
views.EnvSummary
180255
181256
Raises:
182257
HTTP 404 Not Found: If the env does not exist in the database.
183258
"""
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-
259+
read_env = await cls.get_env_by_id(env_id)
190260
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())
261+
rocketpy_env = cls.get_rocketpy_env(read_env)
262+
env_simulation_numbers = EnvData.parse_obj(
263+
rocketpy_env.all_info_returned()
264+
)
265+
env_simulation_plots = EnvPlots.parse_obj(
266+
rocketpy_env.all_plot_info_returned()
267+
)
194268
env_summary = EnvSummary(
195269
env_data=env_simulation_numbers, env_plots=env_simulation_plots
196270
)
197-
return env_summary
198271
except Exception as e:
272+
exc_str = parse_error(e)
273+
logging.error(
274+
f"[{datetime.now()}] controllers.environment.simulate: {exc_str}"
275+
)
199276
raise HTTPException(
200277
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
201278
detail=f"Failed to simulate environment: {e}",
202279
) from e
280+
else:
281+
return env_summary
282+
finally:
283+
logging.info(
284+
f"[{datetime.now()}] Call to controllers.environment.simulate completed; params: EnvID {env_id}"
285+
)

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)