diff --git a/Product_MicroService_Group3/app.yaml b/Product_MicroService_Group3/app.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..ab488dfb9077cfca361f84c8511c86b3ed935dbb
--- /dev/null
+++ b/Product_MicroService_Group3/app.yaml
@@ -0,0 +1,2 @@
+runtime: python312
+entrypoint: gunicorn -b :$PORT index:app
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/__init__.py b/Product_MicroService_Group3/app/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..e5da06c31592e6410ec992cae27f65004ade98d6
--- /dev/null
+++ b/Product_MicroService_Group3/app/__init__.py
@@ -0,0 +1,10 @@
+from flask import Flask
+
+from app.models import login
+
+app = Flask(__name__)
+
+from app import routes
+
+if __name__ == '__main__':
+    app.run(debug=True)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/__pycache__/config.cpython-311.pyc b/Product_MicroService_Group3/app/__pycache__/config.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f5dbbfc7766e0722ceb9c91c99c512ea13f2f156
Binary files /dev/null and b/Product_MicroService_Group3/app/__pycache__/config.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/config.py b/Product_MicroService_Group3/app/config.py
new file mode 100644
index 0000000000000000000000000000000000000000..c00614d76e76bd4f038472b1cffe8ef34b2415d7
--- /dev/null
+++ b/Product_MicroService_Group3/app/config.py
@@ -0,0 +1,7 @@
+import os
+
+
+DEBUG = True
+SECRET_KEY = "Group3"
+
+PORT = 5001
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/controllers/__init__.py b/Product_MicroService_Group3/app/controllers/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..83fe4b03fbf1ea1097fdec730685170c3a35cc8d
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/__init__.py
@@ -0,0 +1,3 @@
+from flask import Flask
+from flask import Blueprint
+
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/__init__.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5a4bfd8103bb4380305718ed59e96e027557a8a4
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/__init__.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0e51d65e2ae6279d43717f3f1f61d3ea671e160c
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/changePasswordController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/changePasswordController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..24490b5e77a15d00d5e34c42c5464eadaa725643
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/changePasswordController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/deleteProfileController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/deleteProfileController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f0bf9cd2f33585660325e6ee6fa5211a03cf5c3
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/deleteProfileController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/getProductController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/getProductController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..927290aca63a4c1d8b1ad3a1fa801dae5ce7413d
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/getProductController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/login.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/login.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..ee02eac64b23cc7222f821324eb85aa9d76b8dc0
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/login.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/loginController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/loginController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0ae33a0fab843db2a609b147bf8a5d6eaea25f24
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/loginController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/logoutController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/logoutController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fef5e24b0dc447c671daa0656ba2d91c90e66b0a
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/logoutController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/productHomeController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/productHomeController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..28e57e844880d4812c306d2a88329e736f9193a6
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/productHomeController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/signupController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/signupController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..d6315f975befa50cae416644dbce66638592358c
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/signupController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/updateProfileController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/updateProfileController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..99f644e6d21227d53f1b3576205412c1a32bf653
Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/updateProfileController.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/controllers/addReviewController.py b/Product_MicroService_Group3/app/controllers/addReviewController.py
new file mode 100644
index 0000000000000000000000000000000000000000..1a2b5d3518a69fe63d5c920051bdd94e6aa0455f
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/addReviewController.py
@@ -0,0 +1,98 @@
+from flask import Blueprint, jsonify, request, json, session
+from models.addReview import add_user_review
+
+import requests
+
+
+add_review_bp = Blueprint("addReview",__name__)
+
+
+@add_review_bp.route("/product/<int:productID>/addReview", methods=["GET"])
+def get_username_from_user_microservice(productID):
+
+    user_id = session.get("user_id")
+
+    if user_id:
+        if request.method == 'GET':
+
+
+            product_id = productID
+
+            response = requests.post('http://localhost:5000/user/getUsername', json={'id': user_id})
+            if response.status_code == 200:
+                username = response.json()['username']
+                userID = user_id
+                session['username'] = username
+                session['productID'] = product_id
+
+
+                rating_info = {
+                    "UserID" : userID,
+                    "ProductID" : product_id,
+                    "Username" : username
+                }
+
+                return rating_info
+            else:
+                return {"Error" : "Failed to retrieve username"}
+            
+            #return "You can review the product with ID: {}".format(product_id)
+        
+        else:
+            return {"error" : "null"}
+        
+    else:
+        return {"error" : "You need to be logged in to add a review"}
+    
+
+
+
+@add_review_bp.route("/product/<int:productID>/addReview", methods=["POST"])
+def add_review(productID):
+
+    user_id = session.get("user_id")
+
+    if user_id:
+        if request.method == 'POST':
+
+            data = request.get_json()
+            review = data.get("review")
+            rating = data.get("rating")
+            product_id = productID
+            username = session.get('username')
+            product_id = session.get('productID')
+
+            if review.strip() != "":
+
+                if username is None:
+                    return {"error": "Username is not available"}
+
+                # Check if product_id is available
+                if product_id is None:
+                    return {"error": "Product ID is not available"}
+
+                if isinstance(rating, int) and 1 <= rating <= 5:
+
+                    review_info = {
+                        "UserID" : user_id,
+                        "ProductID" : product_id,
+                        "Review" : review,
+                        "Rating" : rating,
+                        "Username" : username
+                    }
+
+                    user_review_message = add_user_review(review_info)
+                    return user_review_message
+                
+                else:
+                    return {"error" : "Rating must be an integer between 1 and 5"}
+                
+            else:
+                return {"error" : "Review cannot be empty"}
+            
+        
+        else:
+            return {"error" : "null"}
+        
+    else:
+        return {"error" : "You need to be logged in to add a review"}
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/controllers/getProductController.py b/Product_MicroService_Group3/app/controllers/getProductController.py
new file mode 100644
index 0000000000000000000000000000000000000000..88c9f2c6a960befdd847ab73ef534d0bc63b3582
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/getProductController.py
@@ -0,0 +1,30 @@
+from flask import Blueprint, jsonify, request, json, session
+from models.getProduct import get_product
+
+
+display_product_bp = Blueprint("product",__name__)
+
+
+@display_product_bp.route("/product/<int:productID>", methods=["GET"])
+def display_product(productID):
+
+    user_id = session.get("user_id")
+
+
+    if request.method == 'GET':
+
+
+        product_id = productID
+            
+
+        # Convert to JSON
+        #json_user_data = json.dumps(user_data)
+
+        product, images, reviews = get_product(product_id) #Send user info to database
+        customers = [review_data["CustomerID"] for review_data in reviews]
+
+
+        return jsonify(customers,{"product" : product, "images" : images, "reviews" : reviews, "session" : user_id})
+    
+    else:
+        return {"error" : "null"}
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/controllers/productHomeController.py b/Product_MicroService_Group3/app/controllers/productHomeController.py
new file mode 100644
index 0000000000000000000000000000000000000000..4acfaf5e5c3babe95574864bb08424664a0ca925
--- /dev/null
+++ b/Product_MicroService_Group3/app/controllers/productHomeController.py
@@ -0,0 +1,30 @@
+from flask import Blueprint, jsonify, request, json, session
+from models.productHome import get_product_by_section
+
+
+product_home_bp = Blueprint("home",__name__)
+
+
+@product_home_bp.route("/product/home", methods=["POST"])
+def product_section():
+
+    user_id = session.get("user_id")
+
+
+    if request.method == 'POST':
+
+        data = request.get_json()
+        category_id = data.get("category_id")
+            
+
+        # Convert to JSON
+        #json_user_data = json.dumps(user_data)
+
+        products = get_product_by_section(category_id) #Send user info to database
+        #customers = [review_data["CustomerID"] for review_data in reviews]
+
+
+        return jsonify({"products" : products, "session" : user_id})
+    
+    else:
+        return {"error" : "null"}
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/index.py b/Product_MicroService_Group3/app/index.py
new file mode 100644
index 0000000000000000000000000000000000000000..9f0267b580f95986bae3f617d8c23bbf4ddf994f
--- /dev/null
+++ b/Product_MicroService_Group3/app/index.py
@@ -0,0 +1,50 @@
+from flask import Flask, redirect, url_for, request, render_template, make_response, session, abort
+from flask_cors import CORS
+from flask import jsonify
+
+
+from config import DEBUG, SECRET_KEY, PORT
+import os
+import requests
+
+from controllers.getProductController import display_product_bp
+from controllers.addReviewController import add_review_bp
+from controllers.productHomeController import product_home_bp
+
+
+
+
+app = Flask(__name__)
+CORS(app)
+
+
+app.secret_key = SECRET_KEY
+
+
+# Read user microservice URL from environment variable
+USER_MICROSERVICE_URL = os.getenv('USER_MICROSERVICE_URL', 'http://127.0.0.1:5000')
+
+@app.route('/product', methods=['POST'])
+def get_session_id():
+    session_id = session.get('user_id')
+    if session_id:
+        return jsonify({'session_id': session_id})
+    else:
+        return jsonify({'message': 'Session ID not found'})
+
+
+
+@app.route('/')
+def index():
+    return render_template("index.html")
+
+
+
+app.register_blueprint(display_product_bp)
+app.register_blueprint(add_review_bp)
+app.register_blueprint(product_home_bp)
+
+
+
+if __name__ == '__main__':
+    app.run(debug=DEBUG, port=PORT)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/__init__.py b/Product_MicroService_Group3/app/models/__init__.py
new file mode 100644
index 0000000000000000000000000000000000000000..d55ce4a0c8e0748e87cd3ecae1b6fe12294bdae3
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/__init__.py
@@ -0,0 +1,15 @@
+from flask import Flask
+from flask_cors import CORS
+
+
+#from app.models import models
+
+app = Flask(__name__)
+CORS(app)
+
+#db = sqlAlchemy
+
+#from app import routes
+
+if __name__ == '__main__':
+    app.run(debug=True)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/__pycache__/__init__.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dfb0366dfbe4ee46a4cd5603bac50bd5dcb0efcf
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/__init__.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/addReview.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/addReview.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..9e72c77e0f1e3ecc5183d5731a8b0a948337a6a9
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/addReview.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/changePassword.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/changePassword.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3e2f696425d98b4acece898d09560e3b644ec81a
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/changePassword.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/database_connection.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/database_connection.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..005839d68435047d092e0b3a8b7c4d965cb7ff3d
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/database_connection.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/deleteProfile.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/deleteProfile.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..11cd5e31a86ac49992cc243db920bc089e02298a
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/deleteProfile.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/getProduct.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/getProduct.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a9147d61c3c536e412c3a60130eaf89b7d9581a8
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/getProduct.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/login.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/login.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..54f0eb17fc5e099f4eaf6dcc17f1775c07a610e1
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/login.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/models.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/models.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0c5497a917a5f33bfe0edde28b561ef47b6a7caf
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/models.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/productHome.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/productHome.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..491496f7b159eb7864c8ba8eaaddc449f296add3
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/productHome.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/signup.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/signup.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..94a888ae05aa3787387431d65168edf553a0a2cf
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/signup.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/__pycache__/updateProfile.cpython-311.pyc b/Product_MicroService_Group3/app/models/__pycache__/updateProfile.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e15076a9dadaac885919dee4330bc1ada1af79da
Binary files /dev/null and b/Product_MicroService_Group3/app/models/__pycache__/updateProfile.cpython-311.pyc differ
diff --git a/Product_MicroService_Group3/app/models/addReview.py b/Product_MicroService_Group3/app/models/addReview.py
new file mode 100644
index 0000000000000000000000000000000000000000..8f67372fa8e1e80281e735675913bf514855c42c
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/addReview.py
@@ -0,0 +1,41 @@
+import pyodbc
+from flask import jsonify
+from models.database_connection import connect_db
+
+
+
+def add_user_review(data):
+
+    try: #error handling
+
+        connection = connect_db()
+        cursor = connection.cursor()
+
+        
+        #insert data into reviews and ratings table
+        insert_user_query = '''INSERT INTO dbo.ReviewsAndRatings (CustomerID, ProductID, Review, rating, Username)
+VALUES (?, ?, ?, ?, ?);'''
+        cursor.execute(insert_user_query, (data["UserID"], data["ProductID"], data["Review"], data["Rating"], data["Username"]))
+        
+
+
+        #commit changes to database if no errors
+        connection.commit()
+
+        return {"message" : "Review added successfully"}
+    
+    except pyodbc.Error as e: #more error handling
+        print(f"Database error in add_review: {e}")
+        connection.rollback()
+        return {"Error" : "Database error"}
+    
+    except Exception as e: #more error handling
+        print(f"Unexpected error occured in add_review: {e}")
+        connection.rollback()
+        return {"Error" : "Unexpected error"}
+    
+    finally:
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/database_connection.py b/Product_MicroService_Group3/app/models/database_connection.py
new file mode 100644
index 0000000000000000000000000000000000000000..0986cea0aafc84365dceb7ca9170ffa9bbcdeb02
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/database_connection.py
@@ -0,0 +1,14 @@
+import pyodbc
+
+
+#Connect to database
+def connect_db():
+    
+    server = 'Chiamaka'
+    database = 'Products'
+    username = 'CHIAMAKA\amych'
+    password = ''
+
+    connection_string = f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};UID={username};PWD={password};Trusted_Connection=yes;'
+    
+    return pyodbc.connect(connection_string)
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/getProduct.py b/Product_MicroService_Group3/app/models/getProduct.py
new file mode 100644
index 0000000000000000000000000000000000000000..e66255704b9cba4288f27ebacfb872656be7d5ab
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/getProduct.py
@@ -0,0 +1,59 @@
+#from app import db
+import pyodbc
+from flask import jsonify
+from models.database_connection import connect_db
+
+#Function to get user info
+def get_product(data):
+
+    try: #error handling
+
+        connection = connect_db()
+        cursor = connection.cursor()
+
+        product_id = data
+
+        #Get image info from database
+        product_query = "SELECT * FROM dbo.ProductCatalog WHERE ProductID = ?"
+        cursor.execute(product_query, product_id)
+
+        row = cursor.fetchone() #fetch data
+
+        columns = [column[0] for column in cursor.description]
+        product_data = dict(zip(columns, row))
+
+        #Collect image information from database
+        image_query = "SELECT * FROM dbo.ProductImage WHERE ProductID = ?"
+        cursor.execute(image_query, product_id)
+        images = cursor.fetchall()
+
+        image_data = [{"ImageIdentifier": row[0], "ProductID": row[1]} for row in images]
+
+
+        #Get reviews from database
+        reviews_query = "SELECT CustomerID, Username, Review, rating FROM dbo.ReviewsAndRatings WHERE ProductID= ?"
+        cursor.execute(reviews_query, product_id)
+        reviews = cursor.fetchall()
+
+        reviews_data = [{"CustomerID": row[0], "Username": row[1], "Review": row[2], "rating" : row[3]} for row in reviews]
+
+
+
+        #connection.close()
+
+        return (product_data, image_data, reviews_data)
+    
+    except pyodbc.Error as e: #error handling
+        print(f"Database error in get_product: {e}")
+        return None
+    
+    except Exception as e: #error handling
+        print(f"Unexpected error occured in get_product: {e}")
+        return None
+    
+    finally:
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
+    
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/models/productHome.py b/Product_MicroService_Group3/app/models/productHome.py
new file mode 100644
index 0000000000000000000000000000000000000000..5370a1688ec61d24ae906b532764910788cb2357
--- /dev/null
+++ b/Product_MicroService_Group3/app/models/productHome.py
@@ -0,0 +1,80 @@
+#from app import db
+import pyodbc
+from flask import jsonify
+from models.database_connection import connect_db
+
+#Function to get user info
+def get_product_by_section(data):
+
+    try: #error handling
+
+        connection = connect_db()
+        cursor = connection.cursor()
+
+        category_id = data
+
+        #Get image info from database
+        product_section_query = """SELECT 
+    t1.ProductID, 
+    t1.ProductName, 
+    t1.ProductDesc, 
+    t1.Price, 
+    t3.ProductCategoryID, 
+    t3.CategoryName, 
+    COALESCE(AVG(t4.Rating), 0) AS AverageRating,
+    t5.ImageIdentifier
+FROM 
+    dbo.ProductCatalog AS t1 
+INNER JOIN 
+    dbo.ProductCategory AS t2 ON t1.ProductID = t2.ProductID  
+INNER JOIN 
+    dbo.Category AS t3 ON t2.ProductCategoryID = t3.ProductCategoryID
+LEFT JOIN 
+    dbo.ReviewsAndRatings AS t4 ON t1.ProductID = t4.ProductID
+LEFT JOIN 
+    dbo.ProductImage AS t5 ON t1.ProductID = t5.ProductID
+WHERE 
+    t3.ProductCategoryID = ?
+GROUP BY 
+    t1.ProductID, 
+    t1.ProductName, 
+    t1.ProductDesc, 
+    t1.Price, 
+    t3.ProductCategoryID, 
+    t3.CategoryName,
+    t5.ImageIdentifier;
+"""
+        
+        cursor.execute(product_section_query, category_id)
+
+        products = cursor.fetchall()#fetch data
+
+        products_data = [{"ProductID": row[0], 
+                          "ProductName": row[1], 
+                          "ProductDesc": row[2], 
+                          "Price" : row[3], 
+                          "ProductCategoryID" : row[4], 
+                          "CategoryName" : row[5], 
+                          "AverageRating" : row[6], 
+                          "ImageName" : row[7]} for row in products]
+
+
+
+        #connection.close()
+
+        return (products_data)
+    
+    except pyodbc.Error as e: #error handling
+        print(f"Database error in get_product_by_section: {e}")
+        return None
+    
+    except Exception as e: #error handling
+        print(f"Unexpected error occured in get_product_by_section: {e}")
+        return None
+    
+    finally:
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
+    
\ No newline at end of file
diff --git a/Product_MicroService_Group3/app/run.py b/Product_MicroService_Group3/app/run.py
new file mode 100644
index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391
diff --git a/Product_MicroService_Group3/app/templates/index.html b/Product_MicroService_Group3/app/templates/index.html
new file mode 100644
index 0000000000000000000000000000000000000000..6207c5207b735653b32e6ad59ac7d969cdfab4eb
--- /dev/null
+++ b/Product_MicroService_Group3/app/templates/index.html
@@ -0,0 +1,6 @@
+<html>
+    <head></head>
+    <body>
+        <p>HELLO</p>
+    </body>
+</html>
\ No newline at end of file
diff --git a/Product_MicroService_Group3/requirements.txt b/Product_MicroService_Group3/requirements.txt
new file mode 100644
index 0000000000000000000000000000000000000000..6da6fc6ef7722e29986acb00b7f1caba9b9e5545
--- /dev/null
+++ b/Product_MicroService_Group3/requirements.txt
@@ -0,0 +1,3 @@
+Flask==3.0.0
+gunicorn==21.2.0
+boto3==1.29.0
\ No newline at end of file