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,28 @@ 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
+ async def get_env (self ) -> Env :
39
+ return self ._env
40
+
41
+ @staticmethod
42
+ async def get_rocketpy_env (env : Env ) -> RocketPyEnvironment :
43
+ """
44
+ Get the rocketpy env object.
45
+
46
+ Returns:
47
+ RocketPyEnvironment
48
+ """
49
+ rocketpy_env = RocketPyEnvironment (
33
50
latitude = env .latitude ,
34
51
longitude = env .longitude ,
35
52
elevation = env .elevation ,
@@ -38,165 +55,230 @@ def __init__(self, env: Env):
38
55
rocketpy_env .set_atmospheric_model (
39
56
type = env .atmospheric_model_type , file = env .atmospheric_model_file
40
57
)
41
- self .rocketpy_env = rocketpy_env
42
- self .env = env
58
+ return rocketpy_env
43
59
44
60
async def create_env (self ) -> "Union[EnvCreated, HTTPException]" :
45
61
"""
46
62
Create a env in the database.
47
63
48
64
Returns:
49
- EnvCreated: Environment id.
65
+ views.EnvCreated
50
66
"""
51
- env = EnvRepository (environment = self .env )
52
- successfully_created_env = await env .create_env ()
53
- if not successfully_created_env :
67
+ env = self .get_env ()
68
+ env_repo = EnvRepository (environment = env )
69
+ try :
70
+ await env_repo .create_env ()
71
+ except Exception as e :
72
+ exc_str = parse_error (e )
73
+ logging .error (
74
+ f"[{ datetime .now ()} ] controllers.environment.create_env: { exc_str } "
75
+ )
54
76
raise HTTPException (
55
77
status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
56
- detail = "Failed to create environment" ,
78
+ detail = f"Failed to create environment: { e } " ,
79
+ ) from e
80
+ else :
81
+ return EnvCreated (env_id = env_repo .get_env_id ())
82
+ finally :
83
+ logging .info (
84
+ f"[{ datetime .now ()} ] Call to controllers.environment.create_env completed; params: Env { env .__hash__ ()} "
57
85
)
58
86
59
- return EnvCreated (env_id = str (env .env_id ))
60
-
61
87
@staticmethod
62
- async def get_env (env_id : int ) -> "Union[Env, HTTPException]" :
88
+ async def get_env_by_id (env_id : int ) -> "Union[Env, HTTPException]" :
63
89
"""
64
90
Get a env from the database.
65
91
66
92
Args:
67
- env_id (int): Environment id.
93
+ env_id: int
68
94
69
95
Returns:
70
- env model object
96
+ models.Env
71
97
72
98
Raises:
73
99
HTTP 404 Not Found: If the env is not found in the database.
74
100
"""
75
- successfully_read_env = await EnvRepository (env_id = env_id ).get_env ()
76
- if not successfully_read_env :
101
+ env_repo = EnvRepository (env_id = env_id )
102
+ try :
103
+ read_env = await env_repo .get_env ()
104
+ except Exception as e :
105
+ exc_str = parse_error (e )
106
+ logging .error (
107
+ f"[{ datetime .now ()} ] controllers.environment.get_env_by_id: { exc_str } "
108
+ )
109
+ raise HTTPException (
110
+ status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
111
+ detail = f"Failed to read environment: { e } " ,
112
+ ) from e
113
+ else :
114
+ if read_env :
115
+ return read_env
77
116
raise HTTPException (
78
- status_code = status .HTTP_404_NOT_FOUND , detail = "Environment not found"
117
+ status_code = status .HTTP_404_NOT_FOUND ,
118
+ detail = "Environment not found" ,
119
+ )
120
+ finally :
121
+ logging .info (
122
+ f"[{ datetime .now ()} ] Call to controllers.environment.get_env_by_id completed; params: EnvID { env_id } "
79
123
)
80
124
81
- return successfully_read_env
82
-
83
- @staticmethod
84
- async def get_rocketpy_env (env_id : int ) -> "Union[EnvPickle, HTTPException]" :
125
+ @classmethod
126
+ async def get_rocketpy_env_as_jsonpickle (
127
+ cls ,
128
+ env_id : int ,
129
+ ) -> "Union[EnvPickle, HTTPException]" :
85
130
"""
86
- Get a rocketpy env object encoded as jsonpickle string from the database .
131
+ Get rocketpy.Environmnet as jsonpickle string.
87
132
88
133
Args:
89
- env_id (int): env id.
134
+ env_id: int
90
135
91
136
Returns:
92
- str: jsonpickle string of the rocketpy env.
137
+ views.EnvPickle
93
138
94
139
Raises:
95
140
HTTP 404 Not Found: If the env is not found in the database.
96
141
"""
97
- successfully_read_env = await EnvRepository (env_id = env_id ).get_env ()
98
- if not successfully_read_env :
142
+ env_repo = EnvRepository (env_id = env_id )
143
+ try :
144
+ read_env = await env_repo .get_env ()
145
+ except Exception as e :
146
+ exc_str = parse_error (e )
147
+ logging .error (
148
+ f"[{ datetime .now ()} ] controllers.environment.get_rocketpy_env_as_jsonpickle: { exc_str } "
149
+ )
150
+ raise HTTPException (
151
+ status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
152
+ detail = f"Failed to read environment: { e } " ,
153
+ ) from e
154
+ else :
155
+ if read_env :
156
+ rocketpy_env = cls .get_rocketpy_env (read_env )
157
+ return EnvPickle (
158
+ jsonpickle_rocketpy_env = jsonpickle .encode (rocketpy_env )
159
+ )
99
160
raise HTTPException (
100
- status_code = status .HTTP_404_NOT_FOUND , detail = "Environment not found"
161
+ status_code = status .HTTP_404_NOT_FOUND ,
162
+ detail = "Environment not found" ,
163
+ )
164
+ finally :
165
+ logging .info (
166
+ f"[{ datetime .now ()} ] Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID { env_id } "
101
167
)
102
168
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]" :
169
+ async def update_env (
170
+ self , env_id : int
171
+ ) -> "Union[EnvUpdated, HTTPException]" :
112
172
"""
113
173
Update a env in the database.
114
174
115
175
Args:
116
- env_id (int): env id.
176
+ env_id: int
117
177
118
178
Returns:
119
- EnvUpdated: env id and message.
179
+ views.EnvUpdated
120
180
121
181
Raises:
122
182
HTTP 404 Not Found: If the env is not found in the database.
123
183
"""
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"
184
+ env = self .get_env ()
185
+ env_repo = EnvRepository (environment = env , env_id = env_id )
186
+ try :
187
+ read_env = await env_repo .get_env ()
188
+ if read_env :
189
+ await env_repo .update_env ()
190
+ else :
191
+ raise HTTPException (
192
+ status_code = status .HTTP_404_NOT_FOUND ,
193
+ detail = "Environment not found" ,
194
+ )
195
+ except Exception as e :
196
+ exc_str = parse_error (e )
197
+ logging .error (
198
+ f"[{ datetime .now ()} ] controllers.environment.update_env: { exc_str } "
128
199
)
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
200
raise HTTPException (
135
201
status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
136
- detail = "Failed to update environment" ,
202
+ detail = f"Failed to update environment: { e } " ,
203
+ ) from e
204
+ else :
205
+ return EnvUpdated (new_env_id = env_repo .get_env_id ())
206
+ finally :
207
+ logging .info (
208
+ f"[{ datetime .now ()} ] Call to controllers.environment.update_env completed; params: EnvID { env_id } , Env { env .__hash__ ()} "
137
209
)
138
210
139
- return EnvUpdated (new_env_id = str (successfully_updated_env ))
140
-
141
211
@staticmethod
142
- async def delete_env (env_id : int ) -> "Union[EnvDeleted, HTTPException]" :
212
+ async def delete_env (env_id : str ) -> "Union[EnvDeleted, HTTPException]" :
143
213
"""
144
214
Delete a env from the database.
145
215
146
216
Args:
147
- env_id (int): Environment id.
217
+ env_id: int
148
218
149
219
Returns:
150
- EnvDeleted: Environment id and message.
220
+ views.EnvDeleted
151
221
152
222
Raises:
153
223
HTTP 404 Not Found: If the env is not found in the database.
154
224
"""
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"
225
+ env_repo = EnvRepository (env_id = env_id )
226
+ try :
227
+ await env_repo .delete_env ()
228
+ except Exception as e :
229
+ exc_str = parse_error (e )
230
+ logging .error (
231
+ f"[{ datetime .now ()} ] controllers.environment.delete_env: { exc_str } "
159
232
)
160
-
161
- successfully_deleted_env = await EnvRepository (env_id = env_id ).delete_env ()
162
- if not successfully_deleted_env :
163
233
raise HTTPException (
164
234
status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
165
- detail = "Failed to delete environment" ,
235
+ detail = f"Failed to delete environment: { e } " ,
236
+ ) from e
237
+ else :
238
+ return EnvDeleted (deleted_env_id = env_id )
239
+ finally :
240
+ logging .info (
241
+ f"[{ datetime .now ()} ] Call to controllers.environment.delete_env completed; params: EnvID { env_id } "
166
242
)
167
243
168
- return EnvDeleted (deleted_env_id = str (env_id ))
169
-
170
- @staticmethod
171
- async def simulate (env_id : int ) -> "Union[EnvSummary, HTTPException]" :
244
+ @classmethod
245
+ async def simulate (cls , env_id : int ) -> "Union[EnvSummary, HTTPException]" :
172
246
"""
173
247
Simulate a rocket environment.
174
248
175
249
Args:
176
- env_id (int): Env id .
250
+ env_id: int .
177
251
178
252
Returns:
179
- Env summary view.
253
+ views.EnvSummary
180
254
181
255
Raises:
182
256
HTTP 404 Not Found: If the env does not exist in the database.
183
257
"""
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
-
258
+ read_env = await cls .get_env_by_id (env_id )
190
259
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 ())
260
+ rocketpy_env = cls .get_rocketpy_env (read_env )
261
+ env_simulation_numbers = EnvData .parse_obj (
262
+ rocketpy_env .all_info_returned ()
263
+ )
264
+ env_simulation_plots = EnvPlots .parse_obj (
265
+ rocketpy_env .all_plot_info_returned ()
266
+ )
194
267
env_summary = EnvSummary (
195
268
env_data = env_simulation_numbers , env_plots = env_simulation_plots
196
269
)
197
- return env_summary
198
270
except Exception as e :
271
+ exc_str = parse_error (e )
272
+ logging .error (
273
+ f"[{ datetime .now ()} ] controllers.environment.simulate: { exc_str } "
274
+ )
199
275
raise HTTPException (
200
276
status_code = status .HTTP_500_INTERNAL_SERVER_ERROR ,
201
277
detail = f"Failed to simulate environment: { e } " ,
202
278
) from e
279
+ else :
280
+ return env_summary
281
+ finally :
282
+ logging .info (
283
+ f"[{ datetime .now ()} ] Call to controllers.environment.simulate completed; params: EnvID { env_id } "
284
+ )
0 commit comments