File tree Expand file tree Collapse file tree 1 file changed +35
-6
lines changed Expand file tree Collapse file tree 1 file changed +35
-6
lines changed Original file line number Diff line number Diff line change
1
+ import logging
2
+
1
3
from fastapi import Request
4
+ from fastapi .responses import JSONResponse
5
+ from sqlalchemy .exc import OperationalError , PendingRollbackError
2
6
from starlette .middleware .base import BaseHTTPMiddleware
3
7
4
8
from genotype_api .database .database import close_session , get_session
5
9
from genotype_api .exceptions import GenotypeDBError
6
10
11
+ LOG = logging .getLogger (__name__ )
12
+
7
13
8
14
class DBSessionMiddleware (BaseHTTPMiddleware ):
9
15
def __init__ (self , app ):
10
16
super ().__init__ (app )
11
17
12
18
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
+
13
24
try :
14
- response = await call_next (request )
15
- return response
16
- except Exception :
17
25
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 :
19
46
session .rollback ()
20
- raise GenotypeDBError
47
+ LOG .debug (f"DB session occurred: { e } " )
48
+ return error_message
21
49
finally :
22
- close_session ()
50
+ if session :
51
+ close_session ()
You can’t perform that action at this time.
0 commit comments