Create API endpoint to get authenticated user information

This help clients render UI with user information
This commit is contained in:
Debanjum Singh Solanky 2024-04-07 20:49:02 +05:30
parent 377e979800
commit 94c69eb8e3
2 changed files with 35 additions and 1 deletions

View file

@ -196,6 +196,17 @@ def get_user_name(user: KhojUser):
return None
def get_user_photo(user: KhojUser):
full_name = user.get_full_name()
if not is_none_or_empty(full_name):
return full_name
google_profile: GoogleUser = GoogleUser.objects.filter(user=user).first()
if google_profile:
return google_profile.picture
return None
def get_user_subscription(email: str) -> Optional[Subscription]:
return Subscription.objects.filter(user__email=email).first()

View file

@ -11,12 +11,13 @@ from asgiref.sync import sync_to_async
from fastapi import APIRouter, Depends, File, HTTPException, Request, UploadFile
from fastapi.requests import Request
from fastapi.responses import Response
from starlette.authentication import requires
from starlette.authentication import has_required_scope, requires
from khoj.configure import initialize_content
from khoj.database.adapters import (
ConversationAdapters,
EntryAdapters,
get_user_photo,
get_user_search_model_or_default,
)
from khoj.database.models import ChatModelOptions, KhojUser, SpeechToTextModelOptions
@ -368,3 +369,25 @@ async def extract_references_and_questions(
def health_check(request: Request) -> Response:
response_obj = {"email": request.user.object.email}
return Response(content=json.dumps(response_obj), media_type="application/json", status_code=200)
@api.get("/v1/user", response_class=Response)
@requires(["authenticated"])
def user_info(request: Request) -> Response:
# Get user information
user: KhojUser = request.user.object
user_picture = get_user_photo(user=user)
is_active = has_required_scope(request, ["premium"])
has_documents = EntryAdapters.user_has_entries(user=user)
# Collect user information in a dictionary
user_info = {
"email": user.email,
"username": user.username,
"photo": user_picture,
"is_active": is_active,
"has_documents": has_documents,
}
# Return user information as a JSON response
return Response(content=json.dumps(user_info), media_type="application/json", status_code=200)