1
1
from typing import Union
2
+ from datetime import datetime
2
3
4
+ import logging
3
5
import jsonpickle
4
- from rocketpy .environment .environment import Environment
6
+ from rocketpy .environment .environment import Environment as RocketPyEnvironment
5
7
from fastapi import HTTPException , status
6
8
9
+ from lib .controllers import parse_error
7
10
from lib .models .environment import Env
8
11
from lib .repositories .environment import EnvRepository
9
12
from lib .views .environment import (
@@ -22,14 +25,33 @@ class EnvController:
22
25
Controller for the Environment model.
23
26
24
27
Init Attributes:
25
- env ( models.Env): Environment model object.
28
+ env: models.Env
26
29
27
30
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
29
33
"""
30
34
31
35
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 (
33
55
latitude = env .latitude ,
34
56
longitude = env .longitude ,
35
57
elevation = env .elevation ,
@@ -38,165 +60,228 @@ def __init__(self, env: Env):
38
60
rocketpy_env .set_atmospheric_model (
39
61
type = env .atmospheric_model_type , file = env .atmospheric_model_file
40
62
)
41
- self .rocketpy_env = rocketpy_env
42
- self .env = env
63
+ return rocketpy_env
43
64
44
65
async def create_env (self ) -> "Union[EnvCreated, HTTPException]" :
45
66
"""
46
67
Create a env in the database.
47
68
48
69
Returns:
49
- EnvCreated: Environment id.
70
+ views.EnvCreated
50
71
"""
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
+ )
54
80
raise HTTPException (
55
81
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 )} "
57
89
)
58
90
59
- return EnvCreated (env_id = str (env .env_id ))
60
-
61
91
@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]" :
63
93
"""
64
94
Get a env from the database.
65
95
66
96
Args:
67
- env_id (int): Environment id.
97
+ env_id: int
68
98
69
99
Returns:
70
- env model object
100
+ models.Env
71
101
72
102
Raises:
73
103
HTTP 404 Not Found: If the env is not found in the database.
74
104
"""
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
+ )
77
113
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 } "
79
127
)
80
128
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]" :
85
134
"""
86
- Get a rocketpy env object encoded as jsonpickle string from the database .
135
+ Get rocketpy.Environmnet as jsonpickle string.
87
136
88
137
Args:
89
- env_id (int): env id.
138
+ env_id: int
90
139
91
140
Returns:
92
- str: jsonpickle string of the rocketpy env.
141
+ views.EnvPickle
93
142
94
143
Raises:
95
144
HTTP 404 Not Found: If the env is not found in the database.
96
145
"""
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
+ )
99
164
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 } "
101
171
)
102
172
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]" :
112
176
"""
113
177
Update a env in the database.
114
178
115
179
Args:
116
- env_id (int): env id.
180
+ env_id: int
117
181
118
182
Returns:
119
- EnvUpdated: env id and message.
183
+ views.EnvUpdated
120
184
121
185
Raises:
122
186
HTTP 404 Not Found: If the env is not found in the database.
123
187
"""
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 } "
128
202
)
129
-
130
- successfully_updated_env = await EnvRepository (
131
- environment = self .env , env_id = env_id
132
- ).update_env ()
133
- if not successfully_updated_env :
134
203
raise HTTPException (
135
204
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 )} "
137
212
)
138
213
139
- return EnvUpdated (new_env_id = str (successfully_updated_env ))
140
-
141
214
@staticmethod
142
- async def delete_env (env_id : int ) -> "Union[EnvDeleted, HTTPException]" :
215
+ async def delete_env (env_id : str ) -> "Union[EnvDeleted, HTTPException]" :
143
216
"""
144
217
Delete a env from the database.
145
218
146
219
Args:
147
- env_id (int): Environment id.
220
+ env_id: int
148
221
149
222
Returns:
150
- EnvDeleted: Environment id and message.
223
+ views.EnvDeleted
151
224
152
225
Raises:
153
226
HTTP 404 Not Found: If the env is not found in the database.
154
227
"""
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 } "
159
235
)
160
-
161
- successfully_deleted_env = await EnvRepository (env_id = env_id ).delete_env ()
162
- if not successfully_deleted_env :
163
236
raise HTTPException (
164
237
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 } "
166
245
)
167
246
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]" :
172
249
"""
173
250
Simulate a rocket environment.
174
251
175
252
Args:
176
- env_id (int): Env id .
253
+ env_id: int .
177
254
178
255
Returns:
179
- Env summary view.
256
+ views.EnvSummary
180
257
181
258
Raises:
182
259
HTTP 404 Not Found: If the env does not exist in the database.
183
260
"""
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 )
190
262
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
+ )
194
270
env_summary = EnvSummary (
195
271
env_data = env_simulation_numbers , env_plots = env_simulation_plots
196
272
)
197
- return env_summary
198
273
except Exception as e :
274
+ exc_str = parse_error (e )
275
+ logging .error (
276
+ f"[{ datetime .now ()} ] controllers.environment.simulate: { exc_str } "
277
+ )
199
278
raise HTTPException (
200
279
status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
201
280
detail = f"Failed to simulate environment: { e } " ,
202
281
) 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
+ )
0 commit comments