change folder name

This commit is contained in:
2025-07-23 16:33:47 +02:00
parent dbfd518cd2
commit 2d18861299
21 changed files with 485 additions and 284 deletions

View File

@@ -1,11 +1,16 @@
from fastapi import APIRouter, HTTPException
from fastapi import APIRouter, HTTPException, status
from sqlalchemy import desc
from sqlalchemy.orm import Session
from pydantic import BaseModel
from datetime import datetime
import database
import mih_database.mihDbConnections
from mih_database.mihDbObjects import User, Business, BusinessRating
from supertokens_python.recipe.session.framework.fastapi import verify_session
from supertokens_python.recipe.session import SessionContainer
from fastapi import Depends
router = APIRouter()
# class BusinessRatingUserGet(BaseModel):
@@ -37,200 +42,254 @@ class BusinessRatingUpdateRequest(BaseModel):
@router.get("/mzansi-directory/business-ratings/user/{app_id}/{business_id}", tags=["Mzansi Directory"])
async def read_all_ratings_by_business_id(app_id: str,business_id: str, session: SessionContainer = Depends(verify_session())): # , session: SessionContainer = Depends(verify_session())
db = database.dbConnection.dbAllConnect()
cursor = db.cursor()
query = ""
query += "SELECT business_ratings.idbusiness_ratings, business_ratings.app_id, business_ratings.business_id, "
query += "business_ratings.rating_title, business_ratings.rating_description, business_ratings.rating_score, "
query += "business_ratings.date_time, users.username as 'reviewer' "
query += "FROM mzansi_directory.business_ratings "
query += "inner join app_data.users "
query += "on business_ratings.app_id = users.app_id "
query += "where business_ratings.business_id = %s and business_ratings.app_id = %s;"
cursor.execute(query, (business_id,
app_id,))
item = cursor.fetchone() # Get only one row
cursor.close()
db.close()
dbEngine = mih_database.mihDbConnections.dbAllConnect()
dbSession = Session(dbEngine)
try:
queryResults = dbSession.query(BusinessRating, User).\
join(User, BusinessRating.app_id == User.app_id).\
filter(
BusinessRating.business_id == business_id,
BusinessRating.app_id == app_id
).first()
if queryResults:
rating_obj, user_obj = queryResults
# Return a single dictionary
return {
"idbusiness_ratings": rating_obj.idbusiness_ratings,
"app_id": rating_obj.app_id,
"business_id": rating_obj.business_id,
"rating_title": rating_obj.rating_title,
"rating_description": rating_obj.rating_description,
"rating_score": rating_obj.rating_score,
"date_time": rating_obj.date_time,
"reviewer": user_obj.username,
}
else:
# Return an empty response or a specific message
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Business rating not found for the given app_id and business_id."
)
except HTTPException as http_exc:
# Re-raise HTTPException directly if it was raised within the try block
raise http_exc
except Exception as e:
print(f"An error occurred during the ORM query: {e}")
if dbSession.is_active:
dbSession.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to retrieve records due to an internal server error."
)
finally:
dbSession.close()
if item:
# Return a single dictionary
return {
"idbusiness_ratings": item[0],
"app_id": item[1],
"business_id": item[2],
"rating_title": item[3],
"rating_description": item[4],
"rating_score": item[5],
"date_time": item[6],
"reviewer": item[7],
}
else:
# Return an empty response or a specific message
return None
# items = [
# {
# "idbusiness_ratings": item[0],
# "app_id": item[1],
# "business_id": item[2],
# "rating_title": item[3],
# "rating_description": item[4],
# "rating_score": item[5],
# "date_time": item[6],
# "reviewer": item[7],
# }
# for item in cursor.fetchall()
# ]
# cursor.close()
# db.close()
# return items[0]
@router.get("/mzansi-directory/business-ratings/all/{business_id}", tags=["Mzansi Directory"])
async def read_all_ratings_by_business_id(business_id: str, session: SessionContainer = Depends(verify_session())): # , session: SessionContainer = Depends(verify_session())
db = database.dbConnection.dbAllConnect()
cursor = db.cursor()
query = ""
query += "SELECT business_ratings.idbusiness_ratings, business_ratings.app_id, business_ratings.business_id, "
query += "business_ratings.rating_title, business_ratings.rating_description, business_ratings.rating_score, "
query += "business_ratings.date_time, users.username as 'reviewer' "
query += "FROM mzansi_directory.business_ratings "
query += "inner join app_data.users "
query += "on business_ratings.app_id = users.app_id "
query += "where business_ratings.business_id = %s "
query += "order by business_ratings.date_time desc;"
cursor.execute(query, (business_id,))
items = [
{
"idbusiness_ratings": item[0],
"app_id": item[1],
"business_id": item[2],
"rating_title": item[3],
"rating_description": item[4],
"rating_score": item[5],
"date_time": item[6],
"reviewer": item[7],
}
for item in cursor.fetchall()
]
cursor.close()
db.close()
return items
dbEngine = mih_database.mihDbConnections.dbAllConnect()
dbSession = Session(dbEngine)
try:
queryResults = dbSession.query(BusinessRating, User).\
join(User, BusinessRating.app_id == User.app_id).\
filter(
BusinessRating.business_id == business_id,
).order_by(
desc(BusinessRating.date_time)
).all()
response_data = []
for rating_obj, user_obj in queryResults:
response_data.append({
"idbusiness_ratings": rating_obj.idbusiness_ratings,
"app_id": rating_obj.app_id,
"business_id": rating_obj.business_id,
"rating_title": rating_obj.rating_title,
"rating_description": rating_obj.rating_description,
"rating_score": rating_obj.rating_score,
"date_time": rating_obj.date_time,
"reviewer": user_obj.username,
})
if len(response_data) > 0:
return response_data
else:
# Return an empty response or a specific message
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Business rating not found for the given business_id."
)
except HTTPException as http_exc:
# Re-raise HTTPException directly if it was raised within the try block
raise http_exc
except Exception as e:
print(f"An error occurred during the ORM query: {e}")
if dbSession.is_active:
dbSession.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to retrieve records due to an internal server error."
)
finally:
dbSession.close()
@router.post("/mzansi-directory/business-rating/insert/", tags=["Mzansi Directory"], status_code=201)
async def insert_loyalty_card(itemRequest : BusinessRatingInsertRequest): #, session: SessionContainer = Depends(verify_session())
db = database.dbConnection.dbAllConnect()
dbEngine = mih_database.mihDbConnections.dbAllConnect()
nowDateTime = datetime.now()
formatedDateTime = nowDateTime.strftime("%Y-%m-%d %H:%M:%S")
cursor = db.cursor()
dbSession = Session(dbEngine)
try:
# Get No Of reviews for business
businessReviewCountQuery = "select count(*) from mzansi_directory.business_ratings where business_ratings.business_id = %s"
countData = (itemRequest.business_id,)
cursor.execute(businessReviewCountQuery, countData)
countResult = cursor.fetchone()
row_count = countResult[0] if countResult else 0
print(f"Number of rows in business_ratings: {row_count}")
businessReviewCountQueryResults = dbSession.query(BusinessRating).\
filter(
BusinessRating.business_id == itemRequest.business_id,
).all()
businessReviewCount = len(businessReviewCountQueryResults)
print(f"Number of rows in business_ratings: {businessReviewCount}")
dbSession.flush() # Ensure the session is flushed before adding new records
# add business rating
addQuery = "insert into mzansi_directory.business_ratings "
addQuery += "(business_ratings.app_id, business_ratings.business_id, business_ratings.rating_title, business_ratings.rating_description, business_ratings.rating_score, business_ratings.date_time) "
addQuery += "values (%s, %s, %s, %s, %s, %s)"
addQueryData = (itemRequest.app_id,
itemRequest.business_id,
itemRequest.rating_title,
itemRequest.rating_description,
itemRequest.rating_score,
formatedDateTime,
)
cursor.execute(addQuery, addQueryData)
new_rating = BusinessRating(
app_id=itemRequest.app_id,
business_id=itemRequest.business_id,
rating_title=itemRequest.rating_title,
rating_description=itemRequest.rating_description,
rating_score=itemRequest.rating_score,
date_time=formatedDateTime
)
dbSession.add(new_rating)
dbSession.flush() # Ensure the new rating is added to the session
# Calc New Rating and update business rating
newRating = ((float(itemRequest.current_rating) * row_count) + float(itemRequest.rating_score)) / (row_count + 1)
print(f"New Rating: {newRating}")
updateBusinessQuery = "update app_data.business "
updateBusinessQuery += "set rating = %s "
updateBusinessQuery += "where business_id = %s"
updateBusinessData = (newRating, itemRequest.business_id)
cursor.execute(updateBusinessQuery, updateBusinessData)
db.commit()
except Exception as error:
print(error)
raise HTTPException(status_code=404, detail="Failed to Create Record")
# return {"message": error}
cursor.close()
db.close()
return {"message": "Successfully Created Record"}
newRating = ((float(itemRequest.current_rating) * businessReviewCount) + float(itemRequest.rating_score)) / (businessReviewCount + 1)
businessToUpdate = dbSession.query(Business).filter(Business.business_id == itemRequest.business_id).first()
if businessToUpdate:
businessToUpdate.rating = str(newRating)
dbSession.commit()
else:
# Return an empty response or a specific message
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Business not found for the given business_id."
)
except HTTPException as http_exc:
# Re-raise HTTPException directly if it was raised within the try block
raise http_exc
except Exception as e:
print(f"An error occurred during the ORM query: {e}")
if dbSession.is_active:
dbSession.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to insert records due to an internal server error."
)
finally:
dbSession.close()
return {"message": "Successfully Created Record"}
@router.delete("/mzansi-directory/business-rating/delete/", tags=["Mzansi Directory"])
async def Delete_loyalty_card(itemRequest : BusinessRatingDeleteRequest, session: SessionContainer = Depends(verify_session())): #, session: SessionContainer = Depends(verify_session())
db = database.dbConnection.dbAllConnect()
cursor = db.cursor()
dbEngine = mih_database.mihDbConnections.dbAllConnect()
dbSession = Session(dbEngine)
try:
# Get No Of reviews for business
businessReviewCountQuery = "select count(*) from mzansi_directory.business_ratings where business_ratings.business_id = %s"
countData = (itemRequest.business_id,)
cursor.execute(businessReviewCountQuery, countData)
countResult = cursor.fetchone()
row_count = countResult[0] if countResult else 0
print(f"Number of rows in business_ratings: {row_count}")
# Delete business rating
query = "delete from mzansi_directory.business_ratings "
query += "where business_ratings.idbusiness_ratings=%s"
cursor.execute(query, (str(itemRequest.idbusiness_ratings),))
businessReviewCountQueryResults = dbSession.query(BusinessRating).\
filter(
BusinessRating.business_id == itemRequest.business_id,
).all()
businessReviewCount = len(businessReviewCountQueryResults)
print(f"Number of rows in business_ratings: {businessReviewCount}")
dbSession.flush() # Ensure the session is flushed before adding new records
# delete business rating
rating_to_delete = dbSession.query(BusinessRating).\
get(
itemRequest.idbusiness_ratings
)
if not rating_to_delete:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Business rating with ID {itemRequest.idbusiness_ratings} not found."
)
dbSession.delete(rating_to_delete)
dbSession.flush() # Ensure the new rating is added to the session
# Calc New Rating and update business rating
if(row_count <= 1):
newRating = 0.0
newRating = ((float(itemRequest.current_rating) * businessReviewCount) - float(itemRequest.rating_score)) / (businessReviewCount - 1)
businessToUpdate = dbSession.query(Business).filter(Business.business_id == itemRequest.business_id).first()
if businessToUpdate:
businessToUpdate.rating = str(newRating)
dbSession.commit()
else:
newRating = ((float(itemRequest.current_rating) * row_count) - float(itemRequest.rating_score)) / (row_count - 1)
print(f"New Rating: {newRating}")
updateBusinessQuery = "update app_data.business "
updateBusinessQuery += "set rating = %s "
updateBusinessQuery += "where business_id = %s"
updateBusinessData = (newRating, itemRequest.business_id)
cursor.execute(updateBusinessQuery, updateBusinessData)
db.commit()
except Exception as error:
print(error)
raise HTTPException(status_code=404, detail="Failed to Delete Record")
cursor.close()
db.close()
return {"message": "Successfully deleted Record"}
# Return an empty response or a specific message
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Business not found for the given business_id."
)
except HTTPException as http_exc:
# Re-raise HTTPException directly if it was raised within the try block
raise http_exc
except Exception as e:
print(f"An error occurred during the ORM query: {e}")
if dbSession.is_active:
dbSession.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to insert records due to an internal server error."
)
finally:
dbSession.close()
return {"message": "Successfully Deleted Record"}
@router.put("/mzansi-directory/business-rating/update/", tags=["Mzansi Directory"])
async def UpdatePatient(itemRequest : BusinessRatingUpdateRequest, session: SessionContainer = Depends(verify_session())):
db = database.dbConnection.dbMzansiDirectoryConnect()
cursor = db.cursor()
dbEngine = mih_database.mihDbConnections.dbAllConnect()
nowDateTime = datetime.now()
formatedDateTime = nowDateTime.strftime("%Y-%m-%d %H:%M:%S")
dbSession = Session(dbEngine)
try:
# Get No Of reviews for business
businessReviewCountQuery = "select count(*) from mzansi_directory.business_ratings where business_ratings.business_id = %s"
countData = (itemRequest.business_id,)
cursor.execute(businessReviewCountQuery, countData)
countResult = cursor.fetchone()
row_count = countResult[0] if countResult else 0
print(f"Number of rows in business_ratings: {row_count}")
businessReviewCountQueryResults = dbSession.query(BusinessRating).\
filter(
BusinessRating.business_id == itemRequest.business_id,
).all()
businessReviewCount = len(businessReviewCountQueryResults)
print(f"Number of rows in business_ratings: {businessReviewCount}")
dbSession.flush() # Ensure the session is flushed before adding new records
# Update business rating
query = "update business_ratings "
query += "set rating_title=%s, rating_description=%s, rating_score=%s, date_time=%s "
query += "where idbusiness_ratings=%s"
notetData = (itemRequest.rating_title,
itemRequest.rating_description,
itemRequest.rating_new_score,
formatedDateTime,
itemRequest.idbusiness_ratings,
)
cursor.execute(query, notetData)
# Calc New Rating and update business rating
# add new rating and old rating params
newRating = ((float(itemRequest.current_rating) * row_count) - float(itemRequest.rating_old_score) + float(itemRequest.rating_new_score)) / (row_count)
print(f"New Rating: {newRating}")
updateBusinessQuery = "update app_data.business "
updateBusinessQuery += "set rating = %s "
updateBusinessQuery += "where business_id = %s"
updateBusinessData = (newRating, itemRequest.business_id)
cursor.execute(updateBusinessQuery, updateBusinessData)
db.commit()
except Exception as error:
raise HTTPException(status_code=404, detail="Failed to Update Record")
cursor.close()
db.close()
return {"message": "Successfully Updated Record"}
rating_to_update = dbSession.query(BusinessRating).\
get(
itemRequest.idbusiness_ratings
)
if rating_to_update:
rating_to_update.rating_title = itemRequest.rating_title
rating_to_update.rating_description = itemRequest.rating_description
rating_to_update.rating_score = itemRequest.rating_new_score
rating_to_update.date_time = formatedDateTime
dbSession.flush() # Ensure the new rating is added to the session
else:
# Return an empty response or a specific message
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Business not found for the given business_id."
)
# Calc New Rating and update business rating
newRating = ((float(itemRequest.current_rating) * businessReviewCount) - float(itemRequest.rating_old_score) + float(itemRequest.rating_new_score)) / (businessReviewCount)
businessToUpdate = dbSession.query(Business).filter(Business.business_id == itemRequest.business_id).first()
if businessToUpdate:
businessToUpdate.rating = str(newRating)
dbSession.commit()
else:
# Return an empty response or a specific message
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail="Business not found for the given business_id."
)
except HTTPException as http_exc:
# Re-raise HTTPException directly if it was raised within the try block
raise http_exc
except Exception as e:
print(f"An error occurred during the ORM query: {e}")
if dbSession.is_active:
dbSession.rollback()
raise HTTPException(
status_code=status.HTTP_500_INTERNAL_SERVER_ERROR,
detail="Failed to insert records due to an internal server error."
)
finally:
dbSession.close()
return {"message": "Successfully wUpdated Record"}