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)}")