From 94c69eb8e3060e4e6ef73719d2ab15c6910e0ecf Mon Sep 17 00:00:00 2001 From: Debanjum Singh Solanky Date: Sun, 7 Apr 2024 20:49:02 +0530 Subject: [PATCH] Create API endpoint to get authenticated user information This help clients render UI with user information --- src/khoj/database/adapters/__init__.py | 11 +++++++++++ src/khoj/routers/api.py | 25 ++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 1 deletion(-) diff --git a/src/khoj/database/adapters/__init__.py b/src/khoj/database/adapters/__init__.py index 8b57c18e..95a75b7d 100644 --- a/src/khoj/database/adapters/__init__.py +++ b/src/khoj/database/adapters/__init__.py @@ -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() diff --git a/src/khoj/routers/api.py b/src/khoj/routers/api.py index 357a04e5..06dca0db 100644 --- a/src/khoj/routers/api.py +++ b/src/khoj/routers/api.py @@ -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)