From ab9882823b80ab090be755d5ddf59bea1174b97a Mon Sep 17 00:00:00 2001 From: pratyushkrsahu <ps01598@surrey.ac.uk> Date: Mon, 6 May 2024 20:25:28 +0100 Subject: [PATCH] Updated User api --- requirements.txt | 1 + users_service/main.py | 137 ++++++++++++++++++++++++++---------------- 2 files changed, 86 insertions(+), 52 deletions(-) diff --git a/requirements.txt b/requirements.txt index 6c5d0fd..f299081 100644 --- a/requirements.txt +++ b/requirements.txt @@ -32,3 +32,4 @@ uvicorn==0.29.0 uvloop==0.19.0 watchfiles==0.21.0 websockets==12.0 +mysql-connector-python diff --git a/users_service/main.py b/users_service/main.py index 7824bf9..ed5fc1f 100644 --- a/users_service/main.py +++ b/users_service/main.py @@ -6,6 +6,7 @@ import sqlite3 import mysql.connector from pathlib import Path from typing import Optional +from datetime import datetime app = FastAPI() @@ -18,36 +19,7 @@ app.add_middleware( allow_headers=["*"], ) -# # SQLite connection -# parent_directory = Path(__file__).resolve().parent.parent -# db_file_path = parent_directory / "my_ride.db" -# # print(db_file_path) -# conn = sqlite3.connect(db_file_path) - -# cursor = conn.cursor() - -# # Create the Users table if it doesn't exist -# cursor.execute(''' -# CREATE TABLE IF NOT EXISTS Users ( -# user_id INTEGER PRIMARY KEY, -# username TEXT, -# password TEXT, -# email TEXT, -# phone_number TEXT, -# credit_card_info TEXT, -# registration_date DATETIME, -# last_login DATETIME -# ) -# ''') -# conn.commit() - -# db_connection = mysql.connector.connect( -# host='database_mysql', # or '127.0.0.1' for IPv4 loopback -# port='3306', # Specify the port number here -# user='root', -# password='root_password', -# database='your_database' -# ) + db_connection = mysql.connector.connect( host='database-1.cz0ucmk42cu5.us-east-1.rds.amazonaws.com', # or '127.0.0.1' for IPv4 loopback @@ -67,6 +39,16 @@ class User(BaseModel): credit_card_info: Optional[str] = None registration_date: str last_login: Optional[str] = None + wallet_balance:Optional[float] = None +class UpdateUserModel(BaseModel): + username: Optional[str] = None + password: Optional[str] = None + email: Optional[str] = None + phone_number: Optional[str] = None + credit_card_info: Optional[str] = None + registration_date: Optional[str] = None + last_login: Optional[str] = None + wallet_balance:Optional[float] = None class UserResponse(BaseModel): @@ -75,12 +57,14 @@ class UserResponse(BaseModel): email: str phone_number: str registration_date: str + last_login: Optional[str] = None + wallet_balance:float # Modify the read_users() function to return a list of UserResponse objects @app.get("/users/", response_model=List[UserResponse]) async def read_users(): - cursor.execute('SELECT user_id, username, email, phone_number, registration_date FROM Users') + cursor.execute('SELECT user_id, username, email, phone_number, registration_date, wallet_balance FROM Users') print("got record") users = cursor.fetchall() user_objects = [] @@ -90,12 +74,16 @@ async def read_users(): username=user[1], email=user[2], phone_number=user[3], - registration_date=user[4].strftime('%Y-%m-%d %H:%M:%S') + registration_date=user[4].strftime('%Y-%m-%d %H:%M:%S') , + wallet_balance=user[5] ) user_objects.append(user_obj) return user_objects + + + # Routes @app.post("/users/", response_model=User) async def create_user(user: User): @@ -114,7 +102,7 @@ async def create_user(user: User): cursor.execute(''' INSERT INTO Users (username, password, email, phone_number, registration_date, last_login) - VALUES (%s, %s, %s, %s, %s) + VALUES (%s, %s, %s, %s, %s, %s) ''', ( user.username, user.password, user.email, user.phone_number, user.registration_date, user.last_login @@ -123,7 +111,7 @@ async def create_user(user: User): cursor.execute(''' INSERT INTO Users (username, password, email, phone_number, credit_card_info, registration_date) - VALUES (%s, %s, %s, %s, %s) + VALUES (%s, %s, %s, %s, %s, %s) ''', ( user.username, user.password, user.email, user.phone_number, user.credit_card_info, user.registration_date @@ -132,7 +120,7 @@ async def create_user(user: User): cursor.execute(''' INSERT INTO Users (username, password, email, phone_number, credit_card_info, registration_date, last_login) - VALUES (%s, %s, %s, %s, %s) + VALUES (%s, %s, %s, %s, %s, %s, %s) ''', ( user.username, user.password, user.email, user.phone_number, user.credit_card_info, user.registration_date, user.last_login @@ -142,28 +130,73 @@ async def create_user(user: User): -@app.get("/users/{user_id}", response_model=User) -async def read_user(user_id: int): - cursor.execute('SELECT * FROM Users WHERE user_id = ?', (user_id,)) + + +@app.get("/users/{username}", response_model=UserResponse) +async def read_user_by_username(username: str): + cursor.execute('SELECT user_id, username, email, phone_number, registration_date, last_login, wallet_balance FROM Users WHERE username = %s', (username,)) user = cursor.fetchone() if user is None: raise HTTPException(status_code=404, detail="User not found") - return user - + + # Format datetime fields as strings + registration_date = user[4].strftime('%Y-%m-%d %H:%M:%S') if user[4] else None + last_login = user[5].strftime('%Y-%m-%d %H:%M:%S') if user[5] else None + + return UserResponse( + user_id=user[0], + username=user[1], + email=user[2], + phone_number=user[3], + registration_date=registration_date, + last_login=last_login, + wallet_balance=user[6] + ) + + +@app.put("/users/{user_id}", response_model=UserResponse) +async def update_user(user_id: int, update_data: UpdateUserModel): + # Fetch the existing user data first to compare what needs to be updated + cursor.execute('SELECT * FROM Users WHERE user_id = %s', (user_id,)) + existing_user = cursor.fetchone() + if not existing_user: + raise HTTPException(status_code=404, detail="User not found") -@app.put("/users/{user_id}", response_model=User) -async def update_user(user_id: int, user: User): - cursor.execute(''' - UPDATE Users - SET username = %s, password = %s, email = %s, phone_number = %s, - credit_card_info = %s, registration_date = %s, last_login = %s - WHERE user_id = %s - ''', ( - user.username, user.password, user.email, user.phone_number, - user.credit_card_info, user.registration_date, user.last_login, user_id - )) + # Prepare the SQL query to update only provided fields + updates = [] + params = [] + for field, value in update_data.dict(exclude_none=True).items(): + if value is not None: + updates.append(f"{field} = %s") + if field in ["registration_date", "last_login"]: + params.append(value.strftime('%Y-%m-%d %H:%M:%S')) + else: + params.append(value) + + if not updates: + raise HTTPException(status_code=400, detail="No valid fields provided for update") + + # Execute the update query + params.append(user_id) + update_stmt = f"UPDATE Users SET {', '.join(updates)} WHERE user_id = %s" + cursor.execute(update_stmt, params) db_connection.commit() - return user + + # Fetch and return the updated user data + cursor.execute('SELECT user_id, username, email, phone_number, registration_date, last_login, wallet_balance FROM Users WHERE user_id = %s', (user_id,)) + updated_user = cursor.fetchone() + if updated_user: + return UserResponse( + user_id=updated_user[0], + username=updated_user[1], + email=updated_user[2], + phone_number=updated_user[3], + registration_date=updated_user[4].strftime('%Y-%m-%d %H:%M:%S') if updated_user[4] else None, + last_login=updated_user[5].strftime('%Y-%m-%d %H:%M:%S') if updated_user[5] else None, + wallet_balance=updated_user[6] + ) + else: + raise HTTPException(status_code=404, detail="Error updating user.") @app.delete("/users/{user_id}") -- GitLab