Spaces:
Sleeping
Sleeping
File size: 4,999 Bytes
478dec6 26ee27b 478dec6 26ee27b 478dec6 26ee27b 478dec6 26ee27b 478dec6 26ee27b | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 | from fastapi import HTTPException, status
from sqlalchemy.ext.asyncio import AsyncSession
from externals.databases.pg_crud import (
get_file_by_filename,
delete_file_by_filename,
set_file_deleted_by_filename,
)
from externals.storages.azure_blob import delete_blob_by_filename
from utils.logger import get_logger
logger = get_logger("knowledge-delete")
class KnowledgeDeleteService:
def __init__(self, db: AsyncSession, user):
self.db = db
self.user = user
async def delete(self, filename: str) -> None:
try:
logger.info(
"knowledge.delete.requested",
extra={
"cv_filename": filename,
"user_id": str(self.user.user_id),
"tenant_id": str(self.user.tenant_id),
},
)
# 1️⃣ Check DB record
cv_file = await get_file_by_filename(self.db,
filename=filename,
user_id=self.user.user_id)
if not cv_file:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"File '{filename}' not found",
)
# 2️⃣ Delete blob
blob_deleted = await delete_blob_by_filename(filename=filename,
tenant_id=self.user.tenant_id,
user_id=self.user.user_id)
if not blob_deleted:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to delete blob file",
)
# 3️⃣ Delete DB record
await delete_file_by_filename(self.db, filename)
logger.info(
"knowledge.delete.success",
extra={
"cv_filename": filename,
"user_id": str(self.user.user_id),
},
)
return {"status": "success",
"message": f"file '{filename}' has been deleted",
"data": {
"cv_filename": filename,
"user_id": str(self.user.user_id)}
}
except Exception as e:
logger.error(
"knowledge.delete.failed",
extra={
"cv_filename": filename,
"user_id": str(self.user.user_id),
"error": str(e),
},
)
raise HTTPException(status_code=500, detail=f"Failed to delete file '{filename}': {str(e)}")
async def set_deleted(self, filename: str) -> dict:
try:
logger.info(
"knowledge.set_deleted.requested",
extra={
"cv_filename": filename,
"user_id": str(self.user.user_id),
"tenant_id": str(self.user.tenant_id),
},
)
# 1️⃣ Check DB record
cv_file = await get_file_by_filename(self.db,
filename=filename,
user_id=self.user.user_id)
if not cv_file:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"File '{filename}' not found",
)
# 2️⃣ Mark as deleted
updated = await set_file_deleted_by_filename(self.db,
filename=filename,
user_id=self.user.user_id)
if not updated:
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to mark file as deleted",
)
logger.info(
"knowledge.set_deleted.success",
extra={
"cv_filename": filename,
"user_id": str(self.user.user_id),
},
)
return {
"status": "success",
"message": f"File '{filename}' marked as deleted",
"data": {
"cv_filename": filename,
"user_id": str(self.user.user_id),
},
}
except Exception as e:
logger.error(
"knowledge.set_deleted.failed",
extra={
"cv_filename": filename,
"user_id": str(self.user.user_id),
"error": str(e),
},
)
raise HTTPException(status_code=500, detail=f"Failed to mark file '{filename}' as deleted: {str(e)}") |