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,29 @@ 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
+ @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 (
33
51
latitude = env .latitude ,
34
52
longitude = env .longitude ,
35
53
elevation = env .elevation ,
@@ -38,165 +56,230 @@ def __init__(self, env: Env):
38
56
rocketpy_env .set_atmospheric_model (
39
57
type = env .atmospheric_model_type , file = env .atmospheric_model_file
40
58
)
41
- self .rocketpy_env = rocketpy_env
42
- self .env = env
59
+ return rocketpy_env
43
60
44
61
async def create_env (self ) -> "Union[EnvCreated, HTTPException]" :
45
62
"""
46
63
Create a env in the database.
47
64
48
65
Returns:
49
- EnvCreated: Environment id.
66
+ views.EnvCreated
50
67
"""
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
+ )
54
77
raise HTTPException (
55
78
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 )} "
57
86
)
58
87
59
- return EnvCreated (env_id = str (env .env_id ))
60
-
61
88
@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]" :
63
90
"""
64
91
Get a env from the database.
65
92
66
93
Args:
67
- env_id (int): Environment id.
94
+ env_id: int
68
95
69
96
Returns:
70
- env model object
97
+ models.Env
71
98
72
99
Raises:
73
100
HTTP 404 Not Found: If the env is not found in the database.
74
101
"""
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
77
117
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 } "
79
124
)
80
125
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]" :
85
131
"""
86
- Get a rocketpy env object encoded as jsonpickle string from the database .
132
+ Get rocketpy.Environmnet as jsonpickle string.
87
133
88
134
Args:
89
- env_id (int): env id.
135
+ env_id: int
90
136
91
137
Returns:
92
- str: jsonpickle string of the rocketpy env.
138
+ views.EnvPickle
93
139
94
140
Raises:
95
141
HTTP 404 Not Found: If the env is not found in the database.
96
142
"""
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
+ )
99
161
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 } "
101
168
)
102
169
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]" :
112
173
"""
113
174
Update a env in the database.
114
175
115
176
Args:
116
- env_id (int): env id.
177
+ env_id: int
117
178
118
179
Returns:
119
- EnvUpdated: env id and message.
180
+ views.EnvUpdated
120
181
121
182
Raises:
122
183
HTTP 404 Not Found: If the env is not found in the database.
123
184
"""
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 } "
128
200
)
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
201
raise HTTPException (
135
202
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 )} "
137
210
)
138
211
139
- return EnvUpdated (new_env_id = str (successfully_updated_env ))
140
-
141
212
@staticmethod
142
- async def delete_env (env_id : int ) -> "Union[EnvDeleted, HTTPException]" :
213
+ async def delete_env (env_id : str ) -> "Union[EnvDeleted, HTTPException]" :
143
214
"""
144
215
Delete a env from the database.
145
216
146
217
Args:
147
- env_id (int): Environment id.
218
+ env_id: int
148
219
149
220
Returns:
150
- EnvDeleted: Environment id and message.
221
+ views.EnvDeleted
151
222
152
223
Raises:
153
224
HTTP 404 Not Found: If the env is not found in the database.
154
225
"""
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 } "
159
233
)
160
-
161
- successfully_deleted_env = await EnvRepository (env_id = env_id ).delete_env ()
162
- if not successfully_deleted_env :
163
234
raise HTTPException (
164
235
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 } "
166
243
)
167
244
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]" :
172
247
"""
173
248
Simulate a rocket environment.
174
249
175
250
Args:
176
- env_id (int): Env id .
251
+ env_id: int .
177
252
178
253
Returns:
179
- Env summary view.
254
+ views.EnvSummary
180
255
181
256
Raises:
182
257
HTTP 404 Not Found: If the env does not exist in the database.
183
258
"""
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 )
190
260
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
+ )
194
268
env_summary = EnvSummary (
195
269
env_data = env_simulation_numbers , env_plots = env_simulation_plots
196
270
)
197
- return env_summary
198
271
except Exception as e :
272
+ exc_str = parse_error (e )
273
+ logging .error (
274
+ f"[{ datetime .now ()} ] controllers.environment.simulate: { exc_str } "
275
+ )
199
276
raise HTTPException (
200
277
status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
201
278
detail = f"Failed to simulate environment: { e } " ,
202
279
) 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
+ )
0 commit comments