From d9c758bcd2c9631aa918f38e4efa3ee6c53fd420 Mon Sep 17 00:00:00 2001 From: Debanjum Date: Mon, 24 Mar 2025 17:37:08 +0530 Subject: [PATCH] Create API endpoint to unshare a public conversation Pass isOwner field from the get shared conversation API endpoint if the currently authenticated user created the requested public conversation --- src/khoj/database/adapters/__init__.py | 4 ++++ src/khoj/routers/api_chat.py | 31 +++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/khoj/database/adapters/__init__.py b/src/khoj/database/adapters/__init__.py index 8fe5787f..572e1f83 100644 --- a/src/khoj/database/adapters/__init__.py +++ b/src/khoj/database/adapters/__init__.py @@ -908,6 +908,10 @@ class PublicConversationAdapters: # Public conversations are viewable by anyone, but not editable. return f"/share/chat/{public_conversation.slug}/" + @staticmethod + def delete_public_conversation_by_slug(user: KhojUser, slug: str): + return PublicConversation.objects.filter(source_owner=user, slug=slug).first().delete() + class ConversationAdapters: @staticmethod diff --git a/src/khoj/routers/api_chat.py b/src/khoj/routers/api_chat.py index acdf48b5..e1961b96 100644 --- a/src/khoj/routers/api_chat.py +++ b/src/khoj/routers/api_chat.py @@ -11,7 +11,7 @@ from urllib.parse import unquote from asgiref.sync import sync_to_async from fastapi import APIRouter, Depends, HTTPException, Request -from fastapi.responses import Response, StreamingResponse +from fastapi.responses import RedirectResponse, Response, StreamingResponse from starlette.authentication import has_required_scope, requires from khoj.app.settings import ALLOWED_HOSTS @@ -255,6 +255,7 @@ def chat_history( "conversation_id": conversation.id, "slug": conversation.title if conversation.title else conversation.slug, "agent": agent_metadata, + "is_owner": conversation.user == user, } ) @@ -332,6 +333,7 @@ def get_shared_chat( "conversation_id": conversation.id, "slug": scrubbed_title, "agent": agent_metadata, + "is_owner": conversation.source_owner == user, } ) @@ -449,6 +451,33 @@ def duplicate_chat_history_public_conversation( ) +@api_chat.delete("/share") +@requires(["authenticated"]) +def delete_public_conversation( + request: Request, + common: CommonQueryParams, + public_conversation_slug: str, +): + user = request.user.object + + # Delete Public Conversation + PublicConversationAdapters.delete_public_conversation_by_slug(user=user, slug=public_conversation_slug) + + update_telemetry_state( + request=request, + telemetry_type="api", + api="delete_chat_share", + **common.__dict__, + ) + + # Redirect to the main chat page + redirect_uri = str(request.app.url_path_for("chat_page")) + return RedirectResponse( + url=redirect_uri, + status_code=301, + ) + + @api_chat.get("/sessions") @requires(["authenticated"]) def chat_sessions(