From 3ff9446d54c7d79e462ac8287eb9c323dde4ab3f Mon Sep 17 00:00:00 2001 From: muhamad fais aizat Date: Fri, 16 May 2025 23:35:48 +0700 Subject: [PATCH] fix:memperbaiki koneksi database --- backend/routes/auth.py | 6 +- backend/routes/riwayatPengujian.py | 120 ++++++++++++++++++----------- backend/routes/settingPredict.py | 25 +++--- backend/routes/user.py | 33 ++++---- 4 files changed, 106 insertions(+), 78 deletions(-) diff --git a/backend/routes/auth.py b/backend/routes/auth.py index 3a7de56e..f47a4bdf 100644 --- a/backend/routes/auth.py +++ b/backend/routes/auth.py @@ -85,8 +85,8 @@ async def forgot_password(data: ForgotPasswordRequest, db: Session = Depends(get hashed_password = bcrypt.hashpw(data.new_password.encode("utf-8"), bcrypt.gensalt()).decode("utf-8") # Update password di database - conn.execute(users.update().where(users.c.email == data.email).values(password=hashed_password)) - conn.commit() + db.execute(users.update().where(users.c.email == data.email).values(password=hashed_password)) + db.commit() return {"message": "Password berhasil diperbarui"} @@ -107,7 +107,7 @@ async def check_email(email: str = Query(..., description="Email yang akan dicek except SQLAlchemyError as e: try: - conn.rollback() # Jika sebelumnya ada transaksi yang belum selesai + db.rollback() # Jika sebelumnya ada transaksi yang belum selesai except: pass raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") diff --git a/backend/routes/riwayatPengujian.py b/backend/routes/riwayatPengujian.py index fb557d93..59203a9f 100644 --- a/backend/routes/riwayatPengujian.py +++ b/backend/routes/riwayatPengujian.py @@ -32,57 +32,83 @@ async def get_all_riwayat(db: Session = Depends(get_db)): raise HTTPException(status_code=500, detail=f"Terjadi kesalahan: {str(e)}") -# Get riwayat pengujian by ID +# Get riwayat pengujian by ID @riwayat_router.get("/{id}", dependencies=[Depends(verify_token)]) -async def get_riwayat_by_id(id: int): - query = select(riwayatPengujian).where(riwayatPengujian.c.id == id) - result = conn.execute(query).fetchone() - if result: - return dict(result._mapping) - raise HTTPException(status_code=404, detail="Riwayat Pengujian tidak ditemukan") +async def get_riwayat_by_id(id: int, db: Session = Depends(get_db)): + try: + query = select(riwayatPengujian).where(riwayatPengujian.c.id == id) + result = db.execute(query).fetchone() + if result: + return dict(result._mapping) + raise HTTPException(status_code=404, detail="Riwayat Pengujian tidak ditemukan") + except SQLAlchemyError as e: + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + except Exception as e: + raise HTTPException(status_code=500, detail=f"Unexpected error: {str(e)}") -# Create new riwayat pengujian +# Create new riwayat pengujian @riwayat_router.post("/", dependencies=[Depends(verify_token)]) -async def create_riwayat(data: RiwayatPengujian): - query = insert(riwayatPengujian).values( - id_kernel=data.id_kernel, - tanggal=data.tanggal, - infoHyperparameter=data.infoHyperparameter, - MAE=data.MAE, - RMSE=data.RMSE, - MAPE=data.MAPE - ) - conn.execute(query) - conn.commit() - return {"message": "Riwayat Pengujian berhasil ditambahkan"} +async def create_riwayat(data: RiwayatPengujian, db: Session = Depends(get_db)): + try: + query = insert(riwayatPengujian).values( + id_kernel=data.id_kernel, + tanggal=data.tanggal, + infoHyperparameter=data.infoHyperparameter, + MAE=data.MAE, + RMSE=data.RMSE, + MAPE=data.MAPE + ) + db.execute(query) + db.commit() + return {"message": "Riwayat Pengujian berhasil ditambahkan"} + except SQLAlchemyError as e: + db.rollback() + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + except Exception as e: + db.rollback() + raise HTTPException(status_code=500, detail=f"Unexpected error: {str(e)}") -# Update riwayat pengujian by ID +# Update riwayat pengujian by ID @riwayat_router.put("/{id}", dependencies=[Depends(verify_token)]) -async def update_riwayat(id: int, data: RiwayatPengujian): - query = update(riwayatPengujian).where(riwayatPengujian.c.id == id).values( - id_kernel=data.id_kernel, - tanggal=data.tanggal, - infoHyperparameter=data.infoHyperparameter, - MAE=data.MAE, - RMSE=data.RMSE, - MAPE=data.MAPE - ) - result = conn.execute(query) - conn.commit() - - if result.rowcount == 0: - raise HTTPException(status_code=404, detail="Riwayat Pengujian tidak ditemukan") - - return {"message": "Riwayat Pengujian berhasil diperbarui"} +async def update_riwayat(id: int, data: RiwayatPengujian, db: Session = Depends(get_db)): + try: + query = update(riwayatPengujian).where(riwayatPengujian.c.id == id).values( + id_kernel=data.id_kernel, + tanggal=data.tanggal, + infoHyperparameter=data.infoHyperparameter, + MAE=data.MAE, + RMSE=data.RMSE, + MAPE=data.MAPE + ) + result = db.execute(query) + db.commit() + + if result.rowcount == 0: + raise HTTPException(status_code=404, detail="Riwayat Pengujian tidak ditemukan") + + return {"message": "Riwayat Pengujian berhasil diperbarui"} + except SQLAlchemyError as e: + db.rollback() + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + except Exception as e: + db.rollback() + raise HTTPException(status_code=500, detail=f"Unexpected error: {str(e)}") -# Delete riwayat pengujian by ID +# Delete riwayat pengujian by ID @riwayat_router.delete("/{id}", dependencies=[Depends(verify_token)]) -async def delete_riwayat(id: int): - query = delete(riwayatPengujian).where(riwayatPengujian.c.id == id) - result = conn.execute(query) - conn.commit() - - if result.rowcount == 0: - raise HTTPException(status_code=404, detail="Riwayat Pengujian tidak ditemukan") - - return {"message": "Riwayat Pengujian berhasil dihapus"} +async def delete_riwayat(id: int, db: Session = Depends(get_db)): + try: + query = delete(riwayatPengujian).where(riwayatPengujian.c.id == id) + result = db.execute(query) + db.commit() + + if result.rowcount == 0: + raise HTTPException(status_code=404, detail="Riwayat Pengujian tidak ditemukan") + + return {"message": "Riwayat Pengujian berhasil dihapus"} + except SQLAlchemyError as e: + db.rollback() + raise HTTPException(status_code=500, detail=f"Database error: {str(e)}") + except Exception as e: + db.rollback() + raise HTTPException(status_code=500, detail=f"Unexpected error: {str(e)}") diff --git a/backend/routes/settingPredict.py b/backend/routes/settingPredict.py index c0ac0809..aa800748 100644 --- a/backend/routes/settingPredict.py +++ b/backend/routes/settingPredict.py @@ -36,17 +36,17 @@ DEFAULT_VALUES = [ ] @settingPredict_router.post("/seed",dependencies=[Depends(verify_token)]) -async def seed_database(): +async def seed_database(db: Session = Depends(get_db)): """Endpoint untuk menjalankan seeder secara manual via API.""" query = select(settingPredict) - result = conn.execute(query).fetchall() + result = db.execute(query).fetchall() if result: raise HTTPException(status_code=400, detail="Seeder sudah dijalankan, data sudah ada.") query = insert(settingPredict).values(DEFAULT_VALUES) - conn.execute(query) - conn.commit() + db.execute(query) + db.commit() return {"message": " Seeder berhasil dijalankan: Data setting_predict sudah diisi."} @@ -68,11 +68,11 @@ async def update_setting( nilai_epsilon: str = Query(None), nilai_degree: str = Query(None), nilai_coef: str = Query(None), - + db: Session = Depends(get_db) ): # Cek apakah setting dengan ID tersebut ada query = select(settingPredict.c.nama_kernel).where(settingPredict.c.id == setting_id) - result = conn.execute(query).fetchone() + result = db.execute(query).fetchone() if not result: raise HTTPException(status_code=404, detail="Setting not found") @@ -98,32 +98,33 @@ async def update_setting( # Buat query update berdasarkan field yang diperbolehkan query = update(settingPredict).where(settingPredict.c.id == setting_id).values(**update_data) - result = conn.execute(query) + result = db.execute(query) if result.rowcount == 0: raise HTTPException(status_code=404, detail="Failed to update setting") - conn.commit() + db.commit() return {"message": "Setting updated successfully", "updated_fields": update_data} @settingPredict_router.put("/update-status/{setting_id}", dependencies=[Depends(verify_token)]) async def update_status_setting( setting_id: int, - status: bool = Query(...) + status: bool = Query(...), + db: Session = Depends(get_db) ): # Cek apakah setting dengan ID tersebut ada query = select(settingPredict.c.id).where(settingPredict.c.id == setting_id) - result = conn.execute(query).fetchone() + result = db.execute(query).fetchone() if not result: raise HTTPException(status_code=404, detail="Setting not found") # Update hanya status query = update(settingPredict).where(settingPredict.c.id == setting_id).values(status=status) - result = conn.execute(query) + result = db.execute(query) if result.rowcount == 0: raise HTTPException(status_code=400, detail="Failed to update status") - conn.commit() + db.commit() return {"message": "Status updated successfully", "updated_status": status} diff --git a/backend/routes/user.py b/backend/routes/user.py index 938848d5..6623d708 100644 --- a/backend/routes/user.py +++ b/backend/routes/user.py @@ -1,9 +1,10 @@ import bcrypt from fastapi import APIRouter, HTTPException, Depends -from config.db import conn +from config.db import conn, get_db from models.index import users from schemas.index import User from middleware.index import verify_token +from sqlalchemy.orm import Session # # Seeder untuk Admin # def seed_admin(): @@ -40,18 +41,18 @@ user_router = APIRouter( # READ ALL USERS @user_router.get("/",dependencies=[Depends(verify_token)]) -async def read_data(): +async def read_data(db: Session = Depends(get_db)): try: - result = conn.execute(users.select()).fetchall() + result = db.execute(users.select()).fetchall() return [dict(row._mapping) for row in result] except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # READ USER BY ID @user_router.get("/{id}",dependencies=[Depends(verify_token)]) -async def read_data(id: int): +async def read_data(id: int, db: Session = Depends(get_db)): try: - result = conn.execute(users.select().where(users.c.id == id)).fetchone() + result = db.execute(users.select().where(users.c.id == id)).fetchone() if result is None: raise HTTPException(status_code=404, detail="User not found") return dict(result._mapping) @@ -60,42 +61,42 @@ async def read_data(id: int): # CREATE USER @user_router.post("/",dependencies=[Depends(verify_token)]) -async def write_data(user: User): +async def write_data(user: User, db: Session = Depends(get_db)): try: new_user = {"email": user.email, "password": user.password} - conn.execute(users.insert().values(new_user)) - conn.commit() + db.execute(users.insert().values(new_user)) + db.commit() return {"message": "User created successfully"} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # UPDATE USER @user_router.put("/{id}",dependencies=[Depends(verify_token)]) -async def update_data(id: int, user: User): +async def update_data(id: int, user: User, db: Session = Depends(get_db)): try: - result = conn.execute(users.select().where(users.c.id == id)).fetchone() + result = db.execute(users.select().where(users.c.id == id)).fetchone() if result is None: raise HTTPException(status_code=404, detail="User not found") - conn.execute(users.update().where(users.c.id == id).values( + db.execute(users.update().where(users.c.id == id).values( email=user.email, password=user.password )) - conn.commit() + db.commit() return {"message": "User updated successfully"} except Exception as e: raise HTTPException(status_code=500, detail=str(e)) # DELETE USER @user_router.delete("/{id}",dependencies=[Depends(verify_token)]) -async def delete_data(id: int): +async def delete_data(id: int, db: Session = Depends(get_db)): try: - result = conn.execute(users.select().where(users.c.id == id)).fetchone() + result = db.execute(users.select().where(users.c.id == id)).fetchone() if result is None: raise HTTPException(status_code=404, detail="User not found") - conn.execute(users.delete().where(users.c.id == id)) - conn.commit() + db.execute(users.delete().where(users.c.id == id)) + db.commit() return {"message": "User deleted successfully"} except Exception as e: raise HTTPException(status_code=500, detail=str(e))