Skip to content

Commit 1d72909

Browse files
authored
Merge pull request #8 from tanzilahmed0/task-b11-minio-integration
Task B11: Complete MinIO integration for file storage
2 parents 58ae7b0 + 94aa9ee commit 1d72909

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

backend/api/projects.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -208,6 +208,13 @@ async def delete_project(
208208
if not project_service.check_project_ownership(project_uuid, user_uuid):
209209
raise HTTPException(status_code=404, detail="Project not found")
210210

211+
# Get project to find the file path before deletion
212+
project_db = project_service.get_project_by_id(project_uuid)
213+
if project_db and project_db.csv_path:
214+
# Delete file from MinIO storage
215+
object_name = f"{user_id}/{project_id}/data.csv"
216+
storage_service.delete_file(object_name)
217+
211218
# Delete project from database
212219
success = project_service.delete_project(project_uuid)
213220

backend/services/storage_service.py

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,6 +102,51 @@ def file_exists(self, object_name: str) -> bool:
102102
logger.error(f"Error checking file existence for {object_name}: {str(e)}")
103103
return False
104104

105+
def download_file(self, object_name: str) -> Optional[bytes]:
106+
"""Download file from storage"""
107+
try:
108+
client = self.get_client()
109+
response = client.get_object(self.bucket_name, object_name)
110+
return response.read()
111+
except S3Error as e:
112+
logger.error(f"File not found in storage: {object_name}")
113+
return None
114+
except Exception as e:
115+
logger.error(f"Error downloading file {object_name}: {str(e)}")
116+
return None
117+
118+
def delete_file(self, object_name: str) -> bool:
119+
"""Delete file from storage"""
120+
try:
121+
client = self.get_client()
122+
client.remove_object(self.bucket_name, object_name)
123+
logger.info(f"Deleted file: {object_name}")
124+
return True
125+
except S3Error as e:
126+
logger.error(f"File not found for deletion: {object_name}")
127+
return False
128+
except Exception as e:
129+
logger.error(f"Error deleting file {object_name}: {str(e)}")
130+
return False
131+
132+
def get_file_info(self, object_name: str) -> Optional[Dict[str, Any]]:
133+
"""Get file information (size, last modified, etc.)"""
134+
try:
135+
client = self.get_client()
136+
stat = client.stat_object(self.bucket_name, object_name)
137+
return {
138+
"size": stat.size,
139+
"last_modified": stat.last_modified,
140+
"etag": stat.etag,
141+
"content_type": stat.content_type,
142+
}
143+
except S3Error as e:
144+
logger.error(f"File not found: {object_name}")
145+
return None
146+
except Exception as e:
147+
logger.error(f"Error getting file info for {object_name}: {str(e)}")
148+
return None
149+
105150

106151
# Global storage service instance
107152
storage_service = StorageService()

0 commit comments

Comments
 (0)