Skip to content

Commit 16009b9

Browse files
fixes async issues
1 parent d0d1fe3 commit 16009b9

File tree

5 files changed

+84
-102
lines changed

5 files changed

+84
-102
lines changed

lib/__init__.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,10 @@
11
# lib/__init__.py
2+
import logging
23
from .api import app
4+
5+
logging.basicConfig(
6+
level=logging.INFO,
7+
filename='app.log',
8+
filemode='a',
9+
format='%(asctime)s - %(levelname)s - %(message)s',
10+
)

lib/api.py

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22
This is the main API file for the RocketPy API.
33
"""
44

5-
import logging
6-
75
from fastapi import FastAPI, Request, status
86
from fastapi.exceptions import RequestValidationError
97
from fastapi.middleware.cors import CORSMiddleware
108
from fastapi.openapi.utils import get_openapi
119
from fastapi.responses import RedirectResponse, JSONResponse
1210

11+
from lib import logging
1312
from lib.routes import flight, environment, motor, rocket
1413

14+
logger = logging.getLogger(__name__)
15+
1516
app = FastAPI(
1617
swagger_ui_parameters={
1718
"defaultModelsExpandDepth": 0,
@@ -84,7 +85,7 @@ async def validation_exception_handler(
8485
request: Request, exc: RequestValidationError
8586
):
8687
exc_str = f"{exc}".replace("\n", " ").replace(" ", " ")
87-
logging.error(f"{request}: {exc_str}")
88+
logger.error(f"{request}: {exc_str}")
8889
content = {"status_code": 10422, "message": exc_str, "data": None}
8990
return JSONResponse(
9091
content=content, status_code=status.HTTP_422_UNPROCESSABLE_ENTITY

lib/controllers/environment.py

Lines changed: 45 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,10 @@
11
from typing import Union
2-
from datetime import datetime
32

4-
import logging
53
import jsonpickle
64
from rocketpy.environment.environment import Environment as RocketPyEnvironment
75
from fastapi import HTTPException, status
86

7+
from lib import logging
98
from lib.controllers import parse_error
109
from lib.models.environment import Env
1110
from lib.repositories.environment import EnvRepository
@@ -19,6 +18,8 @@
1918
EnvPickle,
2019
)
2120

21+
logger = logging.getLogger(__name__)
22+
2223

2324
class EnvController:
2425
"""
@@ -69,23 +70,22 @@ async def create_env(self) -> "Union[EnvCreated, HTTPException]":
6970
Returns:
7071
views.EnvCreated
7172
"""
72-
env_repo = EnvRepository(environment=self.env)
7373
try:
74-
await env_repo.create_env()
74+
created_env = await EnvRepository(
75+
environment=self.env
76+
).create_env()
7577
except Exception as e:
7678
exc_str = parse_error(e)
77-
logging.error(
78-
f"[{datetime.now()}] controllers.environment.create_env: {exc_str}"
79-
)
79+
logger.error(f"controllers.environment.create_env: {exc_str}")
8080
raise HTTPException(
8181
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
8282
detail=f"Failed to create environment: {e}",
8383
) from e
8484
else:
85-
return EnvCreated(env_id=env_repo.env_id)
85+
return EnvCreated(env_id=created_env.env_id)
8686
finally:
87-
logging.info(
88-
f"[{datetime.now()}] Call to controllers.environment.create_env completed; params: Env {hash(self.env)}"
87+
logger.info(
88+
f"Call to controllers.environment.create_env completed; params: Env {hash(self.env)}"
8989
)
9090

9191
@staticmethod
@@ -102,14 +102,11 @@ async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
102102
Raises:
103103
HTTP 404 Not Found: If the env is not found in the database.
104104
"""
105-
env_repo = EnvRepository(env_id=env_id)
106105
try:
107-
read_env = await env_repo.get_env()
106+
read_env = await EnvRepository(env_id=env_id).get_env()
108107
except Exception as e:
109108
exc_str = parse_error(e)
110-
logging.error(
111-
f"[{datetime.now()}] controllers.environment.get_env_by_id: {exc_str}"
112-
)
109+
logger.error(f"controllers.environment.get_env_by_id: {exc_str}")
113110
raise HTTPException(
114111
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
115112
detail=f"Failed to read environment: {e}",
@@ -122,8 +119,8 @@ async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
122119
detail="Environment not found",
123120
)
124121
finally:
125-
logging.info(
126-
f"[{datetime.now()}] Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
122+
logger.info(
123+
f"Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
127124
)
128125

129126
@classmethod
@@ -143,31 +140,27 @@ async def get_rocketpy_env_as_jsonpickle(
143140
Raises:
144141
HTTP 404 Not Found: If the env is not found in the database.
145142
"""
146-
env_repo = EnvRepository(env_id=env_id)
147143
try:
148-
read_env = await env_repo.get_env()
144+
read_env = await cls.get_env_by_id(env_id)
145+
except HTTPException as e:
146+
raise e from e
149147
except Exception as e:
150148
exc_str = parse_error(e)
151-
logging.error(
152-
f"[{datetime.now()}] controllers.environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
149+
logger.error(
150+
f"controllers.environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
153151
)
154152
raise HTTPException(
155153
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
156154
detail=f"Failed to read environment: {e}",
157155
) from e
158156
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-
)
164-
raise HTTPException(
165-
status_code=status.HTTP_404_NOT_FOUND,
166-
detail="Environment not found",
157+
rocketpy_env = await cls.get_rocketpy_env(read_env)
158+
return EnvPickle(
159+
jsonpickle_rocketpy_env=jsonpickle.encode(rocketpy_env)
167160
)
168161
finally:
169-
logging.info(
170-
f"[{datetime.now()}] Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
162+
logger.info(
163+
f"Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
171164
)
172165

173166
async def update_env(
@@ -185,30 +178,25 @@ async def update_env(
185178
Raises:
186179
HTTP 404 Not Found: If the env is not found in the database.
187180
"""
188-
env_repo = EnvRepository(environment=self.env, env_id=env_id)
189181
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-
)
182+
await EnvController.get_env_by_id(env_id)
183+
updated_env = await EnvRepository(
184+
environment=self.env, env_id=env_id
185+
).update_env()
186+
except HTTPException as e:
187+
raise e from e
198188
except Exception as e:
199189
exc_str = parse_error(e)
200-
logging.error(
201-
f"[{datetime.now()}] controllers.environment.update_env: {exc_str}"
202-
)
190+
logger.error(f"controllers.environment.update_env: {exc_str}")
203191
raise HTTPException(
204192
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
205193
detail=f"Failed to update environment: {e}",
206194
) from e
207195
else:
208-
return EnvUpdated(new_env_id=env_repo.env_id)
196+
return EnvUpdated(new_env_id=updated_env.env_id)
209197
finally:
210-
logging.info(
211-
f"[{datetime.now()}] Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {hash(self.env)}"
198+
logger.info(
199+
f"Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {hash(self.env)}"
212200
)
213201

214202
@staticmethod
@@ -225,23 +213,20 @@ async def delete_env(env_id: str) -> "Union[EnvDeleted, HTTPException]":
225213
Raises:
226214
HTTP 404 Not Found: If the env is not found in the database.
227215
"""
228-
env_repo = EnvRepository(env_id=env_id)
229216
try:
230-
await env_repo.delete_env()
217+
await EnvRepository(env_id=env_id).delete_env()
231218
except Exception as e:
232219
exc_str = parse_error(e)
233-
logging.error(
234-
f"[{datetime.now()}] controllers.environment.delete_env: {exc_str}"
235-
)
220+
logger.error(f"controllers.environment.delete_env: {exc_str}")
236221
raise HTTPException(
237222
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
238223
detail=f"Failed to delete environment: {e}",
239224
) from e
240225
else:
241226
return EnvDeleted(deleted_env_id=env_id)
242227
finally:
243-
logging.info(
244-
f"[{datetime.now()}] Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
228+
logger.info(
229+
f"Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
245230
)
246231

247232
@classmethod
@@ -258,9 +243,9 @@ async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
258243
Raises:
259244
HTTP 404 Not Found: If the env does not exist in the database.
260245
"""
261-
read_env = await cls.get_env_by_id(env_id)
262246
try:
263-
rocketpy_env = cls.get_rocketpy_env(read_env)
247+
read_env = await cls.get_env_by_id(env_id)
248+
rocketpy_env = await cls.get_rocketpy_env(read_env)
264249
env_simulation_numbers = EnvData.parse_obj(
265250
rocketpy_env.all_info_returned()
266251
)
@@ -270,18 +255,18 @@ async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
270255
env_summary = EnvSummary(
271256
env_data=env_simulation_numbers, env_plots=env_simulation_plots
272257
)
258+
except HTTPException as e:
259+
raise e from e
273260
except Exception as e:
274261
exc_str = parse_error(e)
275-
logging.error(
276-
f"[{datetime.now()}] controllers.environment.simulate: {exc_str}"
277-
)
262+
logger.error(f"controllers.environment.simulate: {exc_str}")
278263
raise HTTPException(
279264
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
280265
detail=f"Failed to simulate environment: {e}",
281266
) from e
282267
else:
283268
return env_summary
284269
finally:
285-
logging.info(
286-
f"[{datetime.now()}] Call to controllers.environment.simulate completed; params: EnvID {env_id}"
270+
logger.info(
271+
f"Call to controllers.environment.simulate completed; params: EnvID {env_id}"
287272
)

lib/repositories/environment.py

Lines changed: 26 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
import logging
2-
from datetime import datetime
31
from typing import Union
2+
from lib import logging
43
from lib.repositories import parse_error
54
from lib.models.environment import Env
65
from lib.repositories.repo import Repository
76

7+
logger = logging.getLogger(__name__)
8+
89

910
class EnvRepository(Repository):
1011
"""
@@ -22,7 +23,7 @@ def __init__(self, environment: Env = None, env_id: str = None):
2223
if env_id:
2324
self._env_id = env_id
2425
else:
25-
self._env_id = hash(self._env)
26+
self._env_id = str(hash(self._env))
2627

2728
@property
2829
def env(self) -> "Env":
@@ -45,55 +46,49 @@ async def create_env(self):
4546
Creates a non-existing models.Env in the database
4647
4748
Returns:
48-
None
49+
self
4950
"""
50-
env_exists = await self.get_env()
51-
if env_exists:
52-
return
53-
5451
try:
5552
environment_to_dict = self.env.dict()
5653
environment_to_dict["env_id"] = self.env_id
5754
await self.collection.insert_one(environment_to_dict)
5855
except Exception as e:
5956
exc_str = parse_error(e)
60-
logging.error(
61-
f"[{datetime.now()}] repositories.environment.create_env: {exc_str}"
62-
)
57+
logger.error(f"repositories.environment.create_env: {exc_str}")
6358
raise Exception(f"Error creating environment: {str(e)}") from e
59+
else:
60+
return self
6461
finally:
65-
logging.info(
66-
f"[{datetime.now()}] Call to repositories.environment.create_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
62+
logger.info(
63+
f"Call to repositories.environment.create_env completed; states: EnvID {self.env_id}"
6764
)
68-
self.close_connection()
65+
await self.close_connection()
6966

7067
async def update_env(self):
7168
"""
7269
Updates a models.Env in the database
7370
7471
Returns:
75-
None
72+
self
7673
"""
7774
try:
7875
environment_to_dict = self.env.dict()
79-
environment_to_dict["env_id"] = hash(self.env)
76+
environment_to_dict["env_id"] = str(hash(self.env))
8077
await self.collection.update_one(
8178
{"env_id": self.env_id}, {"$set": environment_to_dict}
8279
)
8380
self.env_id = environment_to_dict["env_id"]
8481
except Exception as e:
8582
exc_str = parse_error(e)
86-
logging.error(
87-
f"[{datetime.now()}] repositories.environment.update_env: {exc_str}"
88-
)
83+
logger.error(f"repositories.environment.update_env: {exc_str}")
8984
raise Exception(f"Error updating environment: {str(e)}") from e
9085
else:
91-
return
86+
return self
9287
finally:
93-
logging.info(
94-
f"[{datetime.now()}] Call to repositories.environment.update_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
88+
logger.info(
89+
f"Call to repositories.environment.update_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
9590
)
96-
self.close_connection()
91+
await self.close_connection()
9792

9893
async def get_env(self) -> "Union[Env, None]":
9994
"""
@@ -105,17 +100,15 @@ async def get_env(self) -> "Union[Env, None]":
105100
try:
106101
read_env = await self.collection.find_one({"env_id": self.env_id})
107102
except Exception as e:
108-
logging.error(
109-
f"[{datetime.now()}] repositories.environment.get_env: {str(e)}"
110-
)
103+
logger.error(f"repositories.environment.get_env: {str(e)}")
111104
raise Exception(f"Error getting environment: {str(e)}") from e
112105
else:
113106
return Env.parse_obj(read_env) if read_env else None
114107
finally:
115-
logging.info(
116-
f"[{datetime.now()}] Call to repositories.environment.get_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
108+
logger.info(
109+
f"Call to repositories.environment.get_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
117110
)
118-
self.close_connection()
111+
await self.close_connection()
119112

120113
async def delete_env(self):
121114
"""
@@ -127,12 +120,10 @@ async def delete_env(self):
127120
try:
128121
await self.collection.delete_one({"env_id": self.env_id})
129122
except Exception as e:
130-
logging.error(
131-
f"[{datetime.now()}] repositories.environment.delete_env: {str(e)}"
132-
)
123+
logger.error(f"repositories.environment.delete_env: {str(e)}")
133124
raise Exception(f"Error deleting environment: {str(e)}") from e
134125
finally:
135-
logging.info(
136-
f"[{datetime.now()}] Call to repositories.environment.delete_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
126+
logger.info(
127+
f"Call to repositories.environment.delete_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
137128
)
138-
self.close_connection()
129+
await self.close_connection()

0 commit comments

Comments
 (0)