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,230 @@ 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 = 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
+ )
54
81
raise HTTPException (
55
82
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 )} "
57
90
)
58
91
59
- return EnvCreated (env_id = str (env .env_id ))
60
-
61
92
@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]" :
63
94
"""
64
95
Get a env from the database.
65
96
66
97
Args:
67
- env_id (int): Environment id.
98
+ env_id: int
68
99
69
100
Returns:
70
- env model object
101
+ models.Env
71
102
72
103
Raises:
73
104
HTTP 404 Not Found: If the env is not found in the database.
74
105
"""
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
+ )
77
114
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 } "
79
128
)
80
129
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]" :
85
135
"""
86
- Get a rocketpy env object encoded as jsonpickle string from the database .
136
+ Get rocketpy.Environmnet as jsonpickle string.
87
137
88
138
Args:
89
- env_id (int): env id.
139
+ env_id: int
90
140
91
141
Returns:
92
- str: jsonpickle string of the rocketpy env.
142
+ views.EnvPickle
93
143
94
144
Raises:
95
145
HTTP 404 Not Found: If the env is not found in the database.
96
146
"""
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
+ )
99
165
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 } "
101
172
)
102
173
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]" :
112
177
"""
113
178
Update a env in the database.
114
179
115
180
Args:
116
- env_id (int): env id.
181
+ env_id: int
117
182
118
183
Returns:
119
- EnvUpdated: env id and message.
184
+ views.EnvUpdated
120
185
121
186
Raises:
122
187
HTTP 404 Not Found: If the env is not found in the database.
123
188
"""
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 } "
128
204
)
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
205
raise HTTPException (
135
206
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 )} "
137
214
)
138
215
139
- return EnvUpdated (new_env_id = str (successfully_updated_env ))
140
-
141
216
@staticmethod
142
- async def delete_env (env_id : int ) -> "Union[EnvDeleted, HTTPException]" :
217
+ async def delete_env (env_id : str ) -> "Union[EnvDeleted, HTTPException]" :
143
218
"""
144
219
Delete a env from the database.
145
220
146
221
Args:
147
- env_id (int): Environment id.
222
+ env_id: int
148
223
149
224
Returns:
150
- EnvDeleted: Environment id and message.
225
+ views.EnvDeleted
151
226
152
227
Raises:
153
228
HTTP 404 Not Found: If the env is not found in the database.
154
229
"""
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 } "
159
237
)
160
-
161
- successfully_deleted_env = await EnvRepository (env_id = env_id ).delete_env ()
162
- if not successfully_deleted_env :
163
238
raise HTTPException (
164
239
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 } "
166
247
)
167
248
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]" :
172
251
"""
173
252
Simulate a rocket environment.
174
253
175
254
Args:
176
- env_id (int): Env id .
255
+ env_id: int .
177
256
178
257
Returns:
179
- Env summary view.
258
+ views.EnvSummary
180
259
181
260
Raises:
182
261
HTTP 404 Not Found: If the env does not exist in the database.
183
262
"""
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 )
190
264
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
+ )
194
272
env_summary = EnvSummary (
195
273
env_data = env_simulation_numbers , env_plots = env_simulation_plots
196
274
)
197
- return env_summary
198
275
except Exception as e :
276
+ exc_str = parse_error (e )
277
+ logging .error (
278
+ f"[{ datetime .now ()} ] controllers.environment.simulate: { exc_str } "
279
+ )
199
280
raise HTTPException (
200
281
status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
201
282
detail = f"Failed to simulate environment: { e } " ,
202
283
) 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
+ )
0 commit comments