Adisri99 commited on
Commit
e4f17b3
·
verified ·
1 Parent(s): 5922ed1

Update backend/app/api/datasets.py

Browse files
Files changed (1) hide show
  1. backend/app/api/datasets.py +61 -16
backend/app/api/datasets.py CHANGED
@@ -1,30 +1,75 @@
1
- import json
 
 
2
  import pandas as pd
3
  from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
4
  from sqlalchemy.orm import Session
 
5
  from backend.app.db import get_db
6
  from backend.app.repositories.dataset_repo import create_dataset, get_dataset
7
- from backend.app.schemas.dataset import DatasetProfileResponse, DatasetUploadResponse
8
  from backend.app.services.profiling_service import profile_dataframe
9
- from backend.app.services.storage_service import dumps, save_upload
 
 
10
 
11
- router = APIRouter(prefix="/datasets", tags=["datasets"])
 
12
 
13
- @router.post("/upload", response_model=DatasetUploadResponse)
 
14
  async def upload_dataset(file: UploadFile = File(...), db: Session = Depends(get_db)):
15
- if not file.filename.lower().endswith(".csv"):
16
- raise HTTPException(status_code=400, detail="Only CSV files are supported.")
17
- content = await file.read()
18
- dataset_id, path = save_upload(file.filename, content)
19
- df = pd.read_csv(path)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  profile = profile_dataframe(df)
21
- create_dataset(db, id=dataset_id, name=file.filename, file_path=str(path), row_count=len(df), column_count=len(df.columns), schema_json=dumps({"columns": list(df.columns)}), profile_json=dumps(profile))
22
- return DatasetUploadResponse(dataset_id=dataset_id, name=file.filename, row_count=len(df), column_count=len(df.columns))
23
 
24
- @router.get("/{dataset_id}/profile", response_model=DatasetProfileResponse)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  def dataset_profile(dataset_id: str, db: Session = Depends(get_db)):
26
  dataset = get_dataset(db, dataset_id)
27
  if not dataset:
28
- raise HTTPException(status_code=404, detail="Dataset not found.")
29
- profile = json.loads(dataset.profile_json)
30
- return DatasetProfileResponse(dataset_id=dataset_id, columns=profile["columns"], recommended_algorithms=profile["recommended_algorithms"])
 
 
 
 
 
 
 
 
1
+ from json import dumps
2
+ from pathlib import Path
3
+
4
  import pandas as pd
5
  from fastapi import APIRouter, Depends, File, HTTPException, UploadFile
6
  from sqlalchemy.orm import Session
7
+
8
  from backend.app.db import get_db
9
  from backend.app.repositories.dataset_repo import create_dataset, get_dataset
 
10
  from backend.app.services.profiling_service import profile_dataframe
11
+ from backend.app.utils.ids import make_dataset_id
12
+
13
+ router = APIRouter(tags=["datasets"])
14
 
15
+ UPLOAD_DIR = Path("/data/uploads")
16
+ UPLOAD_DIR.mkdir(parents=True, exist_ok=True)
17
 
18
+
19
+ @router.post("/datasets/upload")
20
  async def upload_dataset(file: UploadFile = File(...), db: Session = Depends(get_db)):
21
+ if not file.filename:
22
+ raise HTTPException(status_code=400, detail="Missing file name")
23
+
24
+ suffix = Path(file.filename).suffix.lower()
25
+ if suffix not in {".csv", ".xlsx", ".xls"}:
26
+ raise HTTPException(status_code=400, detail="Only CSV and Excel files are supported")
27
+
28
+ dataset_id = make_dataset_id()
29
+
30
+ if suffix == ".csv":
31
+ content = await file.read()
32
+ path = UPLOAD_DIR / f"{dataset_id}.csv"
33
+ path.write_bytes(content)
34
+ df = pd.read_csv(path)
35
+ else:
36
+ content = await file.read()
37
+ path = UPLOAD_DIR / f"{dataset_id}{suffix}"
38
+ path.write_bytes(content)
39
+ df = pd.read_excel(path)
40
+
41
  profile = profile_dataframe(df)
 
 
42
 
43
+ create_dataset(
44
+ db,
45
+ id=dataset_id,
46
+ name=file.filename,
47
+ file_path=str(path),
48
+ row_count=len(df),
49
+ column_count=len(df.columns),
50
+ schema_json=dumps({"columns": list(df.columns)}),
51
+ profile_json=dumps(profile),
52
+ )
53
+
54
+ return {
55
+ "dataset_id": dataset_id,
56
+ "name": file.filename,
57
+ "row_count": int(len(df)),
58
+ "column_count": int(len(df.columns)),
59
+ }
60
+
61
+
62
+ @router.get("/datasets/{dataset_id}/profile")
63
  def dataset_profile(dataset_id: str, db: Session = Depends(get_db)):
64
  dataset = get_dataset(db, dataset_id)
65
  if not dataset:
66
+ raise HTTPException(status_code=404, detail="Dataset not found")
67
+
68
+ return {
69
+ "dataset_id": dataset.id,
70
+ "name": dataset.name,
71
+ "row_count": dataset.row_count,
72
+ "column_count": dataset.column_count,
73
+ "schema_json": dataset.schema_json,
74
+ "profile_json": dataset.profile_json,
75
+ }