fix:login
This commit is contained in:
parent
33ebfa8318
commit
c88f5c6660
|
@ -2,13 +2,13 @@ import os
|
||||||
import bcrypt
|
import bcrypt
|
||||||
import jwt
|
import jwt
|
||||||
from datetime import datetime, timedelta
|
from datetime import datetime, timedelta
|
||||||
from fastapi import APIRouter, HTTPException, Query
|
from fastapi import APIRouter, HTTPException, Query, status
|
||||||
from pydantic import BaseModel
|
from pydantic import BaseModel
|
||||||
from config.db import conn
|
from config.db import conn
|
||||||
from models.index import users
|
from models.index import users
|
||||||
from dotenv import load_dotenv
|
from dotenv import load_dotenv
|
||||||
from sqlalchemy.sql import select
|
from sqlalchemy.sql import select
|
||||||
from sqlalchemy.exc import SQLAlchemyError
|
from sqlalchemy.exc import SQLAlchemyError, OperationalError
|
||||||
|
|
||||||
# Load environment variables
|
# Load environment variables
|
||||||
load_dotenv()
|
load_dotenv()
|
||||||
|
@ -31,14 +31,18 @@ class LoginRequest(BaseModel):
|
||||||
|
|
||||||
@auth_router.post("/login")
|
@auth_router.post("/login")
|
||||||
async def login(data: LoginRequest):
|
async def login(data: LoginRequest):
|
||||||
# Cek apakah user dengan email ini ada di database
|
try:
|
||||||
user = conn.execute(users.select().where(users.c.email == data.email)).fetchone()
|
# Eksekusi query untuk cek user
|
||||||
|
query = users.select().where(users.c.email == data.email)
|
||||||
|
user = conn.execute(query).fetchone()
|
||||||
|
|
||||||
|
# Validasi user
|
||||||
if not user:
|
if not user:
|
||||||
raise HTTPException(status_code=400, detail="Invalid email or password")
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid email or password")
|
||||||
|
|
||||||
# Verifikasi password
|
# Verifikasi password
|
||||||
if not bcrypt.checkpw(data.password.encode("utf-8"), user.password.encode("utf-8")):
|
if not bcrypt.checkpw(data.password.encode("utf-8"), user.password.encode("utf-8")):
|
||||||
raise HTTPException(status_code=400, detail="Invalid email or password")
|
raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="Invalid email or password")
|
||||||
|
|
||||||
# Buat token JWT
|
# Buat token JWT
|
||||||
payload = {
|
payload = {
|
||||||
|
@ -48,7 +52,6 @@ async def login(data: LoginRequest):
|
||||||
}
|
}
|
||||||
token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
|
token = jwt.encode(payload, SECRET_KEY, algorithm=ALGORITHM)
|
||||||
|
|
||||||
# Kembalikan token beserta data user
|
|
||||||
return {
|
return {
|
||||||
"access_token": token,
|
"access_token": token,
|
||||||
"token_type": "bearer",
|
"token_type": "bearer",
|
||||||
|
@ -60,6 +63,23 @@ async def login(data: LoginRequest):
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
except OperationalError:
|
||||||
|
# Jika koneksi DB putus, coba reconnect
|
||||||
|
try:
|
||||||
|
conn.close() # tutup koneksi lama (jika masih terbuka)
|
||||||
|
from config.db import engine # impor ulang engine
|
||||||
|
conn.connect() # buka koneksi baru
|
||||||
|
raise HTTPException(status_code=500, detail="Koneksi database sempat terputus, silakan coba lagi.")
|
||||||
|
except Exception as reconnect_error:
|
||||||
|
raise HTTPException(status_code=500, detail=f"Gagal reconnect ke database: {str(reconnect_error)}")
|
||||||
|
|
||||||
|
except SQLAlchemyError as e:
|
||||||
|
conn.rollback() # rollback jika error transaksi
|
||||||
|
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)}")
|
||||||
|
|
||||||
class ForgotPasswordRequest(BaseModel):
|
class ForgotPasswordRequest(BaseModel):
|
||||||
email: str
|
email: str
|
||||||
new_password: str
|
new_password: str
|
||||||
|
|
Loading…
Reference in New Issue