Skip to content

Commit 30ff742

Browse files
committed
Add error handling middleware
1 parent 3f0e23d commit 30ff742

File tree

1 file changed

+35
-6
lines changed

1 file changed

+35
-6
lines changed

genotype_api/api/middleware.py

Lines changed: 35 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,51 @@
1+
import logging
2+
13
from fastapi import Request
4+
from fastapi.responses import JSONResponse
5+
from sqlalchemy.exc import OperationalError, PendingRollbackError
26
from starlette.middleware.base import BaseHTTPMiddleware
37

48
from genotype_api.database.database import close_session, get_session
59
from genotype_api.exceptions import GenotypeDBError
610

11+
LOG = logging.getLogger(__name__)
12+
713

814
class DBSessionMiddleware(BaseHTTPMiddleware):
915
def __init__(self, app):
1016
super().__init__(app)
1117

1218
async def dispatch(self, request: Request, call_next):
19+
session = None
20+
error_message = JSONResponse(
21+
status_code=500, content={"message": "Internal server error: database session error."}
22+
)
23+
1324
try:
14-
response = await call_next(request)
15-
return response
16-
except Exception:
1725
session = get_session()
18-
if session.is_active:
26+
if session is None:
27+
return error_message
28+
elif session.dirty:
29+
session.flush()
30+
else:
31+
response = await call_next(request)
32+
return response
33+
34+
except PendingRollbackError as e:
35+
if session and session.is_active:
36+
session.rollback()
37+
LOG.debug(f"DB session error occurred: {e}")
38+
return error_message
39+
40+
except OperationalError as e:
41+
LOG.debug(f"Database connection lost: {e}")
42+
return error_message
43+
44+
except Exception as e:
45+
if session and session.is_active:
1946
session.rollback()
20-
raise GenotypeDBError
47+
LOG.debug(f"DB session occurred: {e}")
48+
return error_message
2149
finally:
22-
close_session()
50+
if session:
51+
close_session()

0 commit comments

Comments
 (0)