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 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]: def get_user_subscription(email: str) -> Optional[Subscription]:
return Subscription.objects.filter(user__email=email).first() 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 import APIRouter, Depends, File, HTTPException, Request, UploadFile
from fastapi.requests import Request from fastapi.requests import Request
from fastapi.responses import Response 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.configure import initialize_content
from khoj.database.adapters import ( from khoj.database.adapters import (
ConversationAdapters, ConversationAdapters,
EntryAdapters, EntryAdapters,
get_user_photo,
get_user_search_model_or_default, get_user_search_model_or_default,
) )
from khoj.database.models import ChatModelOptions, KhojUser, SpeechToTextModelOptions from khoj.database.models import ChatModelOptions, KhojUser, SpeechToTextModelOptions
@@ -368,3 +369,25 @@ async def extract_references_and_questions(
def health_check(request: Request) -> Response: def health_check(request: Request) -> Response:
response_obj = {"email": request.user.object.email} response_obj = {"email": request.user.object.email}
return Response(content=json.dumps(response_obj), media_type="application/json", status_code=200) 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)