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