Skip to content

Commit 0810902

Browse files
fixes async issues
1 parent d0d1fe3 commit 0810902

File tree

5 files changed

+66
-90
lines changed

5 files changed

+66
-90
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: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,13 @@
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

1514
app = FastAPI(

lib/controllers/environment.py

Lines changed: 36 additions & 53 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
@@ -69,23 +68,22 @@ async def create_env(self) -> "Union[EnvCreated, HTTPException]":
6968
Returns:
7069
views.EnvCreated
7170
"""
72-
env_repo = EnvRepository(environment=self.env)
7371
try:
74-
await env_repo.create_env()
72+
created_env = await EnvRepository(
73+
environment=self.env
74+
).create_env()
7575
except Exception as e:
7676
exc_str = parse_error(e)
77-
logging.error(
78-
f"[{datetime.now()}] controllers.environment.create_env: {exc_str}"
79-
)
77+
logging.error(f"controllers.environment.create_env: {exc_str}")
8078
raise HTTPException(
8179
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
8280
detail=f"Failed to create environment: {e}",
8381
) from e
8482
else:
85-
return EnvCreated(env_id=env_repo.env_id)
83+
return EnvCreated(env_id=created_env.env_id)
8684
finally:
8785
logging.info(
88-
f"[{datetime.now()}] Call to controllers.environment.create_env completed; params: Env {hash(self.env)}"
86+
f"Call to controllers.environment.create_env completed; params: Env {hash(self.env)}"
8987
)
9088

9189
@staticmethod
@@ -102,14 +100,11 @@ async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
102100
Raises:
103101
HTTP 404 Not Found: If the env is not found in the database.
104102
"""
105-
env_repo = EnvRepository(env_id=env_id)
106103
try:
107-
read_env = await env_repo.get_env()
104+
read_env = await EnvRepository(env_id=env_id).get_env()
108105
except Exception as e:
109106
exc_str = parse_error(e)
110-
logging.error(
111-
f"[{datetime.now()}] controllers.environment.get_env_by_id: {exc_str}"
112-
)
107+
logging.error(f"controllers.environment.get_env_by_id: {exc_str}")
113108
raise HTTPException(
114109
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
115110
detail=f"Failed to read environment: {e}",
@@ -123,7 +118,7 @@ async def get_env_by_id(env_id: int) -> "Union[Env, HTTPException]":
123118
)
124119
finally:
125120
logging.info(
126-
f"[{datetime.now()}] Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
121+
f"Call to controllers.environment.get_env_by_id completed; params: EnvID {env_id}"
127122
)
128123

129124
@classmethod
@@ -143,31 +138,27 @@ async def get_rocketpy_env_as_jsonpickle(
143138
Raises:
144139
HTTP 404 Not Found: If the env is not found in the database.
145140
"""
146-
env_repo = EnvRepository(env_id=env_id)
147141
try:
148-
read_env = await env_repo.get_env()
142+
read_env = await cls.get_env_by_id(env_id)
143+
except HTTPException as e:
144+
raise e from e
149145
except Exception as e:
150146
exc_str = parse_error(e)
151147
logging.error(
152-
f"[{datetime.now()}] controllers.environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
148+
f"controllers.environment.get_rocketpy_env_as_jsonpickle: {exc_str}"
153149
)
154150
raise HTTPException(
155151
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
156152
detail=f"Failed to read environment: {e}",
157153
) from e
158154
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",
155+
rocketpy_env = await cls.get_rocketpy_env(read_env)
156+
return EnvPickle(
157+
jsonpickle_rocketpy_env=jsonpickle.encode(rocketpy_env)
167158
)
168159
finally:
169160
logging.info(
170-
f"[{datetime.now()}] Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
161+
f"Call to controllers.environment.get_rocketpy_env_as_jsonpickle completed; params: EnvID {env_id}"
171162
)
172163

173164
async def update_env(
@@ -185,30 +176,25 @@ async def update_env(
185176
Raises:
186177
HTTP 404 Not Found: If the env is not found in the database.
187178
"""
188-
env_repo = EnvRepository(environment=self.env, env_id=env_id)
189179
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-
)
180+
await EnvController.get_env_by_id(env_id)
181+
updated_env = await EnvRepository(
182+
environment=self.env, env_id=env_id
183+
).update_env()
184+
except HTTPException as e:
185+
raise e from e
198186
except Exception as e:
199187
exc_str = parse_error(e)
200-
logging.error(
201-
f"[{datetime.now()}] controllers.environment.update_env: {exc_str}"
202-
)
188+
logging.error(f"controllers.environment.update_env: {exc_str}")
203189
raise HTTPException(
204190
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
205191
detail=f"Failed to update environment: {e}",
206192
) from e
207193
else:
208-
return EnvUpdated(new_env_id=env_repo.env_id)
194+
return EnvUpdated(new_env_id=updated_env.env_id)
209195
finally:
210196
logging.info(
211-
f"[{datetime.now()}] Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {hash(self.env)}"
197+
f"Call to controllers.environment.update_env completed; params: EnvID {env_id}, Env {hash(self.env)}"
212198
)
213199

214200
@staticmethod
@@ -225,14 +211,11 @@ async def delete_env(env_id: str) -> "Union[EnvDeleted, HTTPException]":
225211
Raises:
226212
HTTP 404 Not Found: If the env is not found in the database.
227213
"""
228-
env_repo = EnvRepository(env_id=env_id)
229214
try:
230-
await env_repo.delete_env()
215+
await EnvRepository(env_id=env_id).delete_env()
231216
except Exception as e:
232217
exc_str = parse_error(e)
233-
logging.error(
234-
f"[{datetime.now()}] controllers.environment.delete_env: {exc_str}"
235-
)
218+
logging.error(f"controllers.environment.delete_env: {exc_str}")
236219
raise HTTPException(
237220
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
238221
detail=f"Failed to delete environment: {e}",
@@ -241,7 +224,7 @@ async def delete_env(env_id: str) -> "Union[EnvDeleted, HTTPException]":
241224
return EnvDeleted(deleted_env_id=env_id)
242225
finally:
243226
logging.info(
244-
f"[{datetime.now()}] Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
227+
f"Call to controllers.environment.delete_env completed; params: EnvID {env_id}"
245228
)
246229

247230
@classmethod
@@ -258,9 +241,9 @@ async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
258241
Raises:
259242
HTTP 404 Not Found: If the env does not exist in the database.
260243
"""
261-
read_env = await cls.get_env_by_id(env_id)
262244
try:
263-
rocketpy_env = cls.get_rocketpy_env(read_env)
245+
read_env = await cls.get_env_by_id(env_id)
246+
rocketpy_env = await cls.get_rocketpy_env(read_env)
264247
env_simulation_numbers = EnvData.parse_obj(
265248
rocketpy_env.all_info_returned()
266249
)
@@ -270,11 +253,11 @@ async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
270253
env_summary = EnvSummary(
271254
env_data=env_simulation_numbers, env_plots=env_simulation_plots
272255
)
256+
except HTTPException as e:
257+
raise e from e
273258
except Exception as e:
274259
exc_str = parse_error(e)
275-
logging.error(
276-
f"[{datetime.now()}] controllers.environment.simulate: {exc_str}"
277-
)
260+
logging.error(f"controllers.environment.simulate: {exc_str}")
278261
raise HTTPException(
279262
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
280263
detail=f"Failed to simulate environment: {e}",
@@ -283,5 +266,5 @@ async def simulate(cls, env_id: int) -> "Union[EnvSummary, HTTPException]":
283266
return env_summary
284267
finally:
285268
logging.info(
286-
f"[{datetime.now()}] Call to controllers.environment.simulate completed; params: EnvID {env_id}"
269+
f"Call to controllers.environment.simulate completed; params: EnvID {env_id}"
287270
)

lib/repositories/environment.py

Lines changed: 20 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
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
@@ -22,7 +21,7 @@ def __init__(self, environment: Env = None, env_id: str = None):
2221
if env_id:
2322
self._env_id = env_id
2423
else:
25-
self._env_id = hash(self._env)
24+
self._env_id = str(hash(self._env))
2625

2726
@property
2827
def env(self) -> "Env":
@@ -45,55 +44,49 @@ async def create_env(self):
4544
Creates a non-existing models.Env in the database
4645
4746
Returns:
48-
None
47+
self
4948
"""
50-
env_exists = await self.get_env()
51-
if env_exists:
52-
return
53-
5449
try:
5550
environment_to_dict = self.env.dict()
5651
environment_to_dict["env_id"] = self.env_id
5752
await self.collection.insert_one(environment_to_dict)
5853
except Exception as e:
5954
exc_str = parse_error(e)
60-
logging.error(
61-
f"[{datetime.now()}] repositories.environment.create_env: {exc_str}"
62-
)
55+
logging.error(f"repositories.environment.create_env: {exc_str}")
6356
raise Exception(f"Error creating environment: {str(e)}") from e
57+
else:
58+
return self
6459
finally:
6560
logging.info(
66-
f"[{datetime.now()}] Call to repositories.environment.create_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
61+
f"Call to repositories.environment.create_env completed; states: EnvID {self.env_id}"
6762
)
68-
self.close_connection()
63+
await self.close_connection()
6964

7065
async def update_env(self):
7166
"""
7267
Updates a models.Env in the database
7368
7469
Returns:
75-
None
70+
self
7671
"""
7772
try:
7873
environment_to_dict = self.env.dict()
79-
environment_to_dict["env_id"] = hash(self.env)
74+
environment_to_dict["env_id"] = str(hash(self.env))
8075
await self.collection.update_one(
8176
{"env_id": self.env_id}, {"$set": environment_to_dict}
8277
)
8378
self.env_id = environment_to_dict["env_id"]
8479
except Exception as e:
8580
exc_str = parse_error(e)
86-
logging.error(
87-
f"[{datetime.now()}] repositories.environment.update_env: {exc_str}"
88-
)
81+
logging.error(f"repositories.environment.update_env: {exc_str}")
8982
raise Exception(f"Error updating environment: {str(e)}") from e
9083
else:
91-
return
84+
return self
9285
finally:
9386
logging.info(
94-
f"[{datetime.now()}] Call to repositories.environment.update_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
87+
f"Call to repositories.environment.update_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
9588
)
96-
self.close_connection()
89+
await self.close_connection()
9790

9891
async def get_env(self) -> "Union[Env, None]":
9992
"""
@@ -105,17 +98,15 @@ async def get_env(self) -> "Union[Env, None]":
10598
try:
10699
read_env = await self.collection.find_one({"env_id": self.env_id})
107100
except Exception as e:
108-
logging.error(
109-
f"[{datetime.now()}] repositories.environment.get_env: {str(e)}"
110-
)
101+
logging.error(f"repositories.environment.get_env: {str(e)}")
111102
raise Exception(f"Error getting environment: {str(e)}") from e
112103
else:
113104
return Env.parse_obj(read_env) if read_env else None
114105
finally:
115106
logging.info(
116-
f"[{datetime.now()}] Call to repositories.environment.get_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
107+
f"Call to repositories.environment.get_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
117108
)
118-
self.close_connection()
109+
await self.close_connection()
119110

120111
async def delete_env(self):
121112
"""
@@ -127,12 +118,10 @@ async def delete_env(self):
127118
try:
128119
await self.collection.delete_one({"env_id": self.env_id})
129120
except Exception as e:
130-
logging.error(
131-
f"[{datetime.now()}] repositories.environment.delete_env: {str(e)}"
132-
)
121+
logging.error(f"repositories.environment.delete_env: {str(e)}")
133122
raise Exception(f"Error deleting environment: {str(e)}") from e
134123
finally:
135124
logging.info(
136-
f"[{datetime.now()}] Call to repositories.environment.delete_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
125+
f"Call to repositories.environment.delete_env completed; states: Env {hash(self.env)}, EnvID {self.env_id}"
137126
)
138-
self.close_connection()
127+
await self.close_connection()

lib/repositories/repo.py

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
import logging
2-
from datetime import datetime
31
from motor.motor_asyncio import AsyncIOMotorClient
42
from pymongo.server_api import ServerApi
53
from lib.secrets import secrets_instance
@@ -27,6 +25,5 @@ def __init__(self, collection: str):
2725
self.db = self.client.rocketpy
2826
self.collection = self.db[collection]
2927

30-
def close_connection(self) -> None:
31-
logging.info(f"[{datetime.now()}] Closing connection to database")
28+
async def close_connection(self) -> None:
3229
self.client.close()

0 commit comments

Comments
 (0)