11import logging
22import uuid
33from datetime import datetime
4+ from datetime import timedelta
45
56import flask
7+ import sqlalchemy as sa
68import werkzeug .datastructures
79from flask import current_app as app
810from flask_login import logout_user
@@ -43,7 +45,10 @@ def get_user_with_id(user_id: str) -> users_models.User | None:
4345
4446 flask .session .permanent = True
4547 session_uuid = flask .session .get ("session_uuid" )
46- user_session = db .session .query (users_models .UserSession ).filter_by (userId = user_id , uuid = session_uuid ).one_or_none ()
48+ user_session = get_session (
49+ user_id = user_id ,
50+ session_uuid = session_uuid ,
51+ )
4752
4853 if not user_session :
4954 return None
@@ -70,11 +75,32 @@ def send_401() -> tuple[flask.Response, int]:
7075 return flask .jsonify (e .errors ), 401
7176
7277
73- def stamp_session (user : users_models .User ) -> None :
78+ def get_session (user_id : str , session_uuid : str | None ) -> users_models .UserSession | None :
79+ if not user_id or not session_uuid :
80+ return None
81+ return (
82+ db .session .query (users_models .UserSession )
83+ .filter (
84+ users_models .UserSession .userId == int (user_id ),
85+ users_models .UserSession .uuid == session_uuid ,
86+ sa .or_ (
87+ users_models .UserSession .expirationDatetime > date_utils .get_naive_utc_now (),
88+ users_models .UserSession .expirationDatetime == None ,
89+ ),
90+ )
91+ .one_or_none ()
92+ )
93+
94+
95+ def stamp_session (user : users_models .User , duration : timedelta ) -> None :
7496 session_uuid = uuid .uuid4 ()
7597 flask .session ["session_uuid" ] = session_uuid
7698 flask .session ["user_id" ] = user .id
77- db .session .add (users_models .UserSession (userId = user .id , uuid = session_uuid ))
99+ db .session .add (
100+ users_models .UserSession (
101+ userId = user .id , uuid = session_uuid , expirationDatetime = date_utils .get_naive_utc_now () + duration
102+ )
103+ )
78104 db .session .commit ()
79105
80106
@@ -101,6 +127,7 @@ def manage_pro_session(user: users_models.User | None) -> users_models.User | No
101127 current_timestamp = date_utils .get_naive_utc_now ().timestamp ()
102128 last_login = datetime .fromtimestamp (flask .session .get ("last_login" , current_timestamp ))
103129 last_api_call = datetime .fromtimestamp (flask .session .get ("last_api_call" , current_timestamp ))
130+
104131 valid_session = compute_pro_session_validity (last_login , last_api_call )
105132
106133 if "last_login" not in flask .session :
0 commit comments