55 enable_disable_user ,
66 get_current_user ,
77 keycloak_openid ,
8+ update_user ,
89)
910from app .models .datasets import DatasetDBViewList
10- from app .models .users import UserDB , UserIn , UserLogin , UserOut
11+ from app .models .users import UserDB , UserIn , UserLogin , UserOut , UserUpdate
12+ from app .routers .utils import save_refresh_token
1113from beanie import PydanticObjectId
1214from fastapi import APIRouter , Depends , HTTPException
1315from keycloak .exceptions import (
1416 KeycloakAuthenticationError ,
1517 KeycloakGetError ,
1618 KeycloakPostError ,
19+ KeycloakPutError ,
1720)
1821from passlib .hash import bcrypt
1922
@@ -69,6 +72,7 @@ async def save_user(userIn: UserIn):
6972async def login (userIn : UserLogin ):
7073 try :
7174 token = keycloak_openid .token (userIn .email , userIn .password )
75+ await save_refresh_token (token ["refresh_token" ], userIn .email )
7276 return {"token" : token ["access_token" ]}
7377 # bad credentials
7478 except KeycloakAuthenticationError as e :
@@ -95,6 +99,45 @@ async def authenticate_user(email: str, password: str):
9599 return user
96100
97101
102+ @router .patch ("/users/me" , response_model = UserOut )
103+ async def update_current_user (
104+ userUpdate : UserUpdate , current_user = Depends (get_current_user )
105+ ):
106+ try :
107+ await update_user (
108+ current_user .email ,
109+ None ,
110+ userUpdate .password ,
111+ userUpdate .first_name ,
112+ userUpdate .last_name ,
113+ )
114+ except KeycloakGetError as e :
115+ raise HTTPException (
116+ status_code = e .response_code ,
117+ detail = json .loads (e .error_message ),
118+ headers = {"WWW-Authenticate" : "Bearer" },
119+ )
120+ except KeycloakPutError as e :
121+ raise HTTPException (
122+ status_code = e .response_code ,
123+ detail = json .loads (e .error_message ),
124+ headers = {"WWW-Authenticate" : "Bearer" },
125+ )
126+
127+ # Update local user
128+ user = await UserDB .find_one (UserDB .email == current_user .email )
129+
130+ if userUpdate .first_name :
131+ user .first_name = userUpdate .first_name
132+ if userUpdate .last_name :
133+ user .last_name = userUpdate .last_name
134+ if userUpdate .password :
135+ user .hashed_password = bcrypt .hash (userUpdate .password )
136+
137+ await user .save ()
138+ return user .dict ()
139+
140+
98141@router .get ("/users/me/is_admin" , response_model = bool )
99142async def get_admin (
100143 dataset_id : str = None , current_username = Depends (get_current_user )
0 commit comments