11import logging
2+ import string
23from datetime import datetime
34from typing import Literal
4- import string
5- from fastapi import APIRouter , Query , Depends
5+
6+ from fastapi import APIRouter , Depends , Query
67from fastapi_sqlalchemy import db
7- from starlette .responses import JSONResponse
88from sqlalchemy import not_
9+ from starlette .responses import JSONResponse
10+
911from auth_backend .base import ResponseModel
10- from auth_backend .exceptions import SessionExpired , ObjectNotFound
11- from auth_backend .schemas .models import Session
12- from auth_backend .models .db import AuthMethod , UserSession , User
12+ from auth_backend .exceptions import ObjectNotFound , SessionExpired
13+ from auth_backend .models .db import AuthMethod , User , UserSession
1314from auth_backend .schemas .models import (
15+ Session ,
16+ SessionPost ,
17+ SessionScopes ,
1418 UserAuthMethods ,
19+ UserGet ,
1520 UserGroups ,
1621 UserIndirectGroups ,
1722 UserInfo ,
18- UserGet ,
1923 UserScopes ,
20- SessionScopes ,
21- SessionPost ,
2224)
23- from auth_backend .utils .security import UnionAuth
2425from auth_backend .utils import user_session_control
26+ from auth_backend .utils .security import UnionAuth
2527
2628
2729user_session = APIRouter (prefix = "" , tags = ["User session" ])
@@ -83,7 +85,9 @@ async def me(
8385async def create_session (
8486 new_session : SessionPost , session : UserSession = Depends (UnionAuth (scopes = [], allow_none = False , auto_error = True ))
8587):
86- return await user_session_control .create_session (session .user , new_session .scopes , db_session = db .session )
88+ return await user_session_control .create_session (
89+ session .user , new_session .scopes , new_session .expires , db_session = db .session
90+ )
8791
8892
8993@user_session .delete ("/session/{token}" )
@@ -108,13 +112,14 @@ async def delete_sessions(
108112 delete_current : bool = Query (default = False ),
109113 current_session : UserSession = Depends (UnionAuth (scopes = [], allow_none = False , auto_error = True )),
110114):
111- other_sessions = current_session .user .active_sessions
112- for session in other_sessions :
113- if session .token == current_session .token and not delete_current :
114- continue
115- if session .expired :
116- raise SessionExpired (session .token )
117- session .expires = datetime .utcnow ()
115+ query = (
116+ db .session .query (UserSession )
117+ .filter (UserSession .user_id == current_session .user_id )
118+ .filter (not_ (UserSession .expired ))
119+ )
120+ if not delete_current :
121+ query = query .filter (UserSession .token != current_session .token )
122+ query .update ({"expires" : datetime .utcnow ()})
118123 db .session .commit ()
119124
120125
0 commit comments