<!-- .github/pull_request_template.md --> ## Description Modify endpoints to allow better security for different infrastructure needs and setups ## DCO Affirmation I affirm that all code in every commit of this pull request conforms to the terms of the Topoteretes Developer Certificate of Origin.
90 lines
3.6 KiB
Python
90 lines
3.6 KiB
Python
from fastapi import Form, UploadFile, Depends
|
|
from fastapi.responses import JSONResponse
|
|
from fastapi import APIRouter
|
|
from typing import List
|
|
from uuid import UUID
|
|
import subprocess
|
|
from cognee.shared.logging_utils import get_logger
|
|
import requests
|
|
from cognee.modules.users.models import User
|
|
from cognee.modules.users.methods import get_authenticated_user
|
|
|
|
logger = get_logger()
|
|
|
|
|
|
def get_delete_router() -> APIRouter:
|
|
router = APIRouter()
|
|
|
|
@router.delete("", response_model=None)
|
|
async def delete(
|
|
data: List[UploadFile],
|
|
dataset_name: str = Form("main_dataset"),
|
|
dataset_id: UUID = None,
|
|
mode: str = Form("soft"),
|
|
user: User = Depends(get_authenticated_user),
|
|
):
|
|
"""This endpoint is responsible for deleting data from the graph.
|
|
|
|
Args:
|
|
data: The data to delete (files, URLs, or text)
|
|
dataset_name: Name of the dataset to delete from (default: "main_dataset")
|
|
mode: "soft" (default) or "hard" - hard mode also deletes degree-one entity nodes
|
|
user: Authenticated user
|
|
"""
|
|
from cognee.api.v1.delete import delete as cognee_delete
|
|
|
|
try:
|
|
# Handle each file in the list
|
|
results = []
|
|
for file in data:
|
|
# TODO: Add check if HTTP Requests are enabled before allowing requests and git clone
|
|
if file.filename.startswith("http"):
|
|
if "github" in file.filename:
|
|
# For GitHub repos, we need to get the content hash of each file
|
|
repo_name = file.filename.split("/")[-1].replace(".git", "")
|
|
subprocess.run(
|
|
["git", "clone", file.filename, f".data/{repo_name}"], check=True
|
|
)
|
|
# Note: This would need to be implemented to get content hashes of all files
|
|
# For now, we'll just return an error
|
|
return JSONResponse(
|
|
status_code=400,
|
|
content={"error": "Deleting GitHub repositories is not yet supported"},
|
|
)
|
|
else:
|
|
# Fetch and delete the data from other types of URL
|
|
response = requests.get(file.filename)
|
|
response.raise_for_status()
|
|
file_data = response.content
|
|
result = await cognee_delete(
|
|
file_data,
|
|
dataset_name=dataset_name,
|
|
dataset_id=dataset_id,
|
|
mode=mode,
|
|
user=user,
|
|
)
|
|
results.append(result)
|
|
else:
|
|
# Handle uploaded file by accessing its file attribute
|
|
result = await cognee_delete(
|
|
file.file,
|
|
dataset_name=dataset_name,
|
|
dataset_id=dataset_id,
|
|
mode=mode,
|
|
user=user,
|
|
)
|
|
results.append(result)
|
|
|
|
if len(results) == 1:
|
|
return results[0]
|
|
else:
|
|
return {
|
|
"status": "success",
|
|
"message": "Multiple documents deleted",
|
|
"results": results,
|
|
}
|
|
except Exception as error:
|
|
logger.error(f"Error during deletion: {str(error)}")
|
|
return JSONResponse(status_code=409, content={"error": str(error)})
|
|
|
|
return router
|