From 834136cabc0e9af34215f956acf3f706c26dad51 Mon Sep 17 00:00:00 2001
From: unknown <fc00617@surrey.ac.uk>
Date: Sat, 4 May 2024 14:07:39 +0100
Subject: [PATCH] Updated Orders Microservice. This includes the kafka
 functionality

---
 Order_Microservice_Group3/Dockerfile          |  31 +++
 .../__pycache__/config.cpython-311.pyc        | Bin 0 -> 346 bytes
 Order_Microservice_Group3/app/__init__.py     |  34 ++-
 .../app/__pycache__/__init__.cpython-311.pyc  | Bin 0 -> 1617 bytes
 .../app/__pycache__/__init__.cpython-312.pyc  | Bin 0 -> 963 bytes
 .../app/__pycache__/config.cpython-311.pyc    | Bin 0 -> 337 bytes
 Order_Microservice_Group3/app/config.py       |  11 +-
 .../app/controllers/AddToCartController.py    |  53 ++--
 .../app/controllers/CheckOutController.py     |  37 ++-
 .../controllers/DeleteFromItemController.py   |  17 +-
 .../app/controllers/FetchCartController.py    |   6 +-
 .../app/controllers/OrderHistoryController.py |  18 ++
 .../controllers/UpdateProductController.py    |   7 +
 .../__pycache__/AddToCart.cpython-312.pyc     | Bin 0 -> 1337 bytes
 .../AddToCartController.cpython-311.pyc       | Bin 0 -> 2207 bytes
 .../AddToCartController.cpython-312.pyc       | Bin 0 -> 1911 bytes
 .../CheckOutController.cpython-311.pyc        | Bin 0 -> 1927 bytes
 .../CheckOutController.cpython-312.pyc        | Bin 0 -> 1688 bytes
 .../DeleteFromItemController.cpython-311.pyc  | Bin 0 -> 1214 bytes
 .../DeleteFromItemController.cpython-312.pyc  | Bin 0 -> 1068 bytes
 .../FetchCartController.cpython-311.pyc       | Bin 0 -> 1149 bytes
 .../FetchCartController.cpython-312.pyc       | Bin 0 -> 1079 bytes
 .../OrderHistoryController.cpython-311.pyc    | Bin 0 -> 1171 bytes
 .../UpdateProductController.cpython-311.pyc   | Bin 0 -> 606 bytes
 Order_Microservice_Group3/app/index.py        | 121 +++++++++
 .../app/models/AddToCart.py                   |   7 +-
 .../app/models/CheckOut.py                    | 241 +++++++++++++-----
 .../app/models/CheckPriceAndQuantity.py       | 240 +++++++++++++++++
 .../app/models/DeleteItemCartModel.py         |   2 +-
 .../app/models/FetchKart.py                   |  83 +++---
 .../app/models/UpdateProduct.py               |  18 +-
 .../__pycache__/AddToCart.cpython-311.pyc     | Bin 0 -> 2525 bytes
 .../__pycache__/AddToCart.cpython-312.pyc     | Bin 0 -> 2279 bytes
 .../__pycache__/CheckOut.cpython-311.pyc      | Bin 0 -> 5389 bytes
 .../__pycache__/CheckOut.cpython-312.pyc      | Bin 0 -> 4606 bytes
 .../CheckPriceAndQuantity.cpython-311.pyc     | Bin 0 -> 3370 bytes
 .../CheckPriceAndQuantity.cpython-312.pyc     | Bin 0 -> 2444 bytes
 .../DeleteItemCartModel.cpython-311.pyc       | Bin 0 -> 2612 bytes
 .../DeleteItemCartModel.cpython-312.pyc       | Bin 0 -> 2212 bytes
 .../__pycache__/FetchKart.cpython-311.pyc     | Bin 0 -> 2282 bytes
 .../__pycache__/FetchKart.cpython-312.pyc     | Bin 0 -> 4020 bytes
 .../__pycache__/UpdateProduct.cpython-311.pyc | Bin 0 -> 2984 bytes
 .../__pycache__/__init__.cpython-311.pyc      | Bin 0 -> 554 bytes
 .../__pycache__/__init__.cpython-312.pyc      | Bin 0 -> 470 bytes
 .../database_connection.cpython-311.pyc       | Bin 0 -> 791 bytes
 .../database_connection.cpython-312.pyc       | Bin 0 -> 624 bytes
 .../__pycache__/order_history.cpython-311.pyc | Bin 0 -> 2437 bytes
 .../app/models/database_connection.py         |  22 +-
 .../app/models/order_history.py               |  59 +++++
 .../kafkaPublishers.cpython-311.pyc           | Bin 0 -> 2302 bytes
 .../kafkaPublishers.cpython-312.pyc           | Bin 0 -> 2023 bytes
 .../app/publishers/kafkaPublishers.py         |   1 -
 Order_Microservice_Group3/app/run.py          |   7 +
 .../app/subscriber/UpdateProductSubscriber.py |   8 +-
 .../app/subscriber/__init__.py                |   5 +
 .../UpdateProductSubscriber.cpython-311.pyc   | Bin 0 -> 2255 bytes
 .../__pycache__/__init__.cpython-311.pyc      | Bin 0 -> 481 bytes
 Order_Microservice_Group3/config.py           |   8 +
 Order_Microservice_Group3/docker-compose.yml  |  58 +++++
 Order_Microservice_Group3/requirements.txt    | Bin 21 -> 588 bytes
 Order_Microservice_Group3/run.py              |  36 +++
 61 files changed, 935 insertions(+), 195 deletions(-)
 create mode 100644 Order_Microservice_Group3/Dockerfile
 create mode 100644 Order_Microservice_Group3/__pycache__/config.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/__pycache__/__init__.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/__pycache__/__init__.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/__pycache__/config.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/OrderHistoryController.py
 create mode 100644 Order_Microservice_Group3/app/controllers/UpdateProductController.py
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/AddToCart.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/AddToCartController.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/AddToCartController.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/CheckOutController.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/CheckOutController.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/DeleteFromItemController.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/DeleteFromItemController.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/FetchCartController.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/FetchCartController.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/OrderHistoryController.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/controllers/__pycache__/UpdateProductController.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/index.py
 create mode 100644 Order_Microservice_Group3/app/models/CheckPriceAndQuantity.py
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/AddToCart.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/AddToCart.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/CheckOut.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/CheckOut.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/CheckPriceAndQuantity.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/CheckPriceAndQuantity.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/DeleteItemCartModel.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/DeleteItemCartModel.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/FetchKart.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/FetchKart.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/UpdateProduct.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/__init__.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/__init__.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/database_connection.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/database_connection.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/models/__pycache__/order_history.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/models/order_history.py
 create mode 100644 Order_Microservice_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-312.pyc
 create mode 100644 Order_Microservice_Group3/app/run.py
 create mode 100644 Order_Microservice_Group3/app/subscriber/__pycache__/UpdateProductSubscriber.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/app/subscriber/__pycache__/__init__.cpython-311.pyc
 create mode 100644 Order_Microservice_Group3/config.py
 create mode 100644 Order_Microservice_Group3/docker-compose.yml
 create mode 100644 Order_Microservice_Group3/run.py

diff --git a/Order_Microservice_Group3/Dockerfile b/Order_Microservice_Group3/Dockerfile
new file mode 100644
index 00000000..7e35c011
--- /dev/null
+++ b/Order_Microservice_Group3/Dockerfile
@@ -0,0 +1,31 @@
+FROM python:3.11.4
+
+# Set the working directory in the container to /app
+WORKDIR /app
+
+# Copy the current directory contents into the container at /app
+COPY . /app
+
+# Install any needed packages specified in requirements.txt
+RUN pip install --no-cache-dir -r requirements.txt
+
+RUN apt-get update && apt-get install -y \
+
+    unixodbc \
+    unixodbc-dev \
+    freetds-dev \
+    tdsodbc \
+    && rm -rf /var/lib/apt/lists/*
+
+# Set environment variables for ODBC configuration if needed
+ENV ODBCINI=/etc/odbc.iniS
+ENV ODBCSYSINI=/etc
+
+
+# Make port 5000 available to the world outside this container
+EXPOSE 5000
+
+ENV START_KAFKA_CONSUMER=true
+
+# Run app.py when the container launches
+CMD ["python", "index.py"]
\ No newline at end of file
diff --git a/Order_Microservice_Group3/__pycache__/config.cpython-311.pyc b/Order_Microservice_Group3/__pycache__/config.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..101ebab0c3bf83308915c60456759b6a5076dd5b
GIT binary patch
literal 346
zcmZ3^%ge<81UAp4(vpGnV-N=hn4pZ$azMs(h7^Vr#vFzyh7_hK#uVl#rWBSa<`mW_
zmK4Td22Hk?AjN(mx7gf^@=FVhGdqPD7^?Vk@{<#DGV+T{tSk*IjWk(rG36KEVs&wK
z3U$B573}I9<Qfw1?HYNDCBQ!@<Q9*&qno#5e6VX!m}}5VhR+})e-%4h#e^2878S?1
zW#+|%=4F-v*_kDk3i)XY#id0>sg*H~DP@Uy$*Cy{;i*XqA*sn3dHFf{>6I~wP;uSz
z)Fj=4qWrAX<dPWwq7<M3@xGbKMfpHu%QBNw;~{R2NzTtp%S_iRsQkrYlbfGXnv-f*
y!~=8#BM=v>0f`UHjEsyo7&sfi@Bs%;1M3Z5(FU#u?A#435BTI7ctEfS6r=!nn`Bb}

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/__init__.py b/Order_Microservice_Group3/app/__init__.py
index bbf16556..ef81f69f 100644
--- a/Order_Microservice_Group3/app/__init__.py
+++ b/Order_Microservice_Group3/app/__init__.py
@@ -1,14 +1,44 @@
+# from flask import Flask
+
+# from .controllers.AddToCartController import AddToCart_bp
+# from .controllers.CheckOutController import checkout_bp
+# from .controllers.DeleteFromItemController import DeleteCart_bp
+# from .controllers.FetchCartController import cart_bp
+
+
+# def create_app():
+#     app = Flask(__name__)
+#     app.register_blueprint(AddToCart_bp)
+#     app.register_blueprint(checkout_bp)
+#     app.register_blueprint(DeleteCart_bp)
+#     app.register_blueprint(cart_bp)
+
+
+#     return app
+
 from flask import Flask
+from flask_cors import CORS
+import os
 
-from .controllers.AddToCartController import AddToCart_bp
-from .controllers.CheckOutController import checkout_bp
+from app.controllers.AddToCartController import AddToCart_bp
+from app.controllers.CheckOutController import checkout_bp
 from .controllers.DeleteFromItemController import DeleteCart_bp
 from .controllers.FetchCartController import cart_bp
+from .subscriber.UpdateProductSubscriber import start_kafka_consumer
 
 def create_app():
     app = Flask(__name__)
+    CORS(app)
+    
+    app.config.from_object('config')
+
     app.register_blueprint(AddToCart_bp)
     app.register_blueprint(checkout_bp)
     app.register_blueprint(DeleteCart_bp)
     app.register_blueprint(cart_bp)
+
+    # Optionally start Kafka consumer based on configuration
+    if app.config.get('START_KAFKA_CONSUMER', False):
+        start_kafka_consumer()
+
     return app
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/__pycache__/__init__.cpython-311.pyc b/Order_Microservice_Group3/app/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..45f09827829da5b30358373d313d7bf931794085
GIT binary patch
literal 1617
zcmbVM-D?wB6u*<XNv27fiq;R*Z9`jZ1KK`VP-=Av(JWPLrD+j{z-2OX(~h0VggZBt
zh)R@#E9~o{FM{kt-QE5(lO?cWpiuD1w?N-~^4v+A4+Rm=oH_i?nRCv)_nb5L!|-qn
z0o`iNl@`JXeH6+ug^s}CCV)4{K!#)?TT&%S;E)xvWmOKaY+)6H4O?M5qDBH+*oxYU
zssN4{QESMKsj&bnR@_dgi2x5-!*)_l0*>t<b;OYKC>{SKmQ723IA>|@766=GS<Np4
zNMsCS&B<zvlVSz*xV}mCEvG8fPf{mp_%^jDr#+{r-t`}KxxiamX-gxzQ+BI1Wx81I
zm@oht-ow8j-5bP3(j(%><p6yb?0emB&k%>w9n;gVzDnpRdL(iN^j@s+4H?p4MiKMA
zFJ~`+CwlmYW0F4+bK)mrPJS<@uLi-$^?W<X2pRG&)OfF3XO`q=dtSQ$_qwX65DW`m
z_9M{9lDXlJ=GQW-Yvf)gcP~S-E6e%y`*&7z=>!wC_Z33QnoS8|q5(`)(T|syV-u(N
zi0a%w$>@gZa>_{2s?rKG%bbZ0u!s<f5JMtJ-k_X`1Hk;rTBYKOF-U!`WfuzTE@f^Z
zXO;`=Wpf*_$!jU6lya+#(OMy6Y-?qm8mWi0m|COyX4$cvjaorFvR`>ji&rYl5!)%O
zFar{h`=-tuNV{$7l>Ek=YUOGH7A+8BmQ7B`Y^CPMbVfB!3E0^vY~~ku-G4#U(SB^?
zPv!O8A9MBWK30A|^<rsfslIf8qdRy1$LIgU=igp$;Hf5_^6(T`JGOU=4LsAtGajC4
zb!|5qc)E$FJv`mB-E81=6Q@0#?%A$2@MIHDdU&!OK}vk*$*botpL=I6|4kdw`DS#!
zjim7SzH+glj5U=pPZ>LiC+l|)VYeuK!Vj0kFW>1{EWq%aGB@a%A97rO5)L^F4d=|U
zEGW=y_eRKejX~S|iLX7g;;vY!@;*n=T7RlPUFY)1!CWkHYWKN{0r1EBU2~M{o8p@3
z^9m+p!mSovotZ_-X4fkQwB`YGjH=G_U3)M<L9_lr>@=iir$BsG7Hx2}=q)x5su(Qy
z1BkXPNmBa~lFoVPY(KZq1#ggBXs8}M2WZh7<Q7`+2DycP^#-|x=Dk5~q1)adxABNH
L(njBk;2>WBmA8cC

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/__pycache__/__init__.cpython-312.pyc b/Order_Microservice_Group3/app/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..58ee95c249f77ea8b7a423614344f4c1dee19f9e
GIT binary patch
literal 963
zcma)4&x_MQ6rMCmleXKfcu?#?0}9&1?j95tbyb#1{Q>SC+(ih1A)QRO*_~v<WKs#N
z(1SOx!e0Cb#6LwZLct~2lZfn1=xtBVq|LU1q7U-&y*FRpy!YjOtk<hRSo82)?}q}w
zHyIRGnt@42fFs}mPaz;sY()WH$x}%wP;E8G8qosX)^n_ra$wj-j?2UhDt1L+<2A6W
zsoAQW$f7MJ(>uhC4^G6LGFsa7ydBzh8He3S#5L5%=zu1(u>KGe%<=r(KvOD`)e2Ju
zkk90ka7Td4+PU#!67XS`dj$@`zFwTq-@IJlf~owCY5q4eS6H(DS##-6HJ=NCwps?0
zqh%(9p&MWbv-1q^`7y@~c1eOG=7*fgiI^OL8PdrXg_x=vMX?;*I!)VmoZT3+*y;G8
zvm5#YfqkA@v}eT$V>op-y@4Ad>{%~x*V@6TA5ud1QpcU;S6<@oO2p_sM%>wEo+tpH
z`G`?bcHkonA2FIlHyv@Q1EC-K9KzKo&8moDmt!dMY*{oTn~NU{Hw0g+jko5TwPE{M
zGrnle&sy`{#z?y{kM54N>+|T|NNdfb^^tb<xVAieIuW(NR;!ljJ-J#_y{;fCbfJWZ
zHdoJ<tbLZuCCe@^vf6U>wiCWUl9FcE7D>~E>@XTU;W${JO5wBLZtY->`f_y_SaSGW
zh4+9pB(4j0YHkG7O9;NtE{IV6vG|g3KUGCh#^B<2aC;2a$Kb&j+?r@*rICO73(yzm
Apa1{>

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/__pycache__/config.cpython-311.pyc b/Order_Microservice_Group3/app/__pycache__/config.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..3bad8faed0c0ef554720b32d280772a832bc8c8e
GIT binary patch
literal 337
zcmZ3^%ge<81kYX?q(uYi#~=<2FhUuhrGSj-3@Hpz3@MCJj44b}Oh7hs3Ud@o3QI79
zCTqwohRhCO28Jq5LnCuN10Xc?(`3EH>f-7Y>VAtW*ws16H6-5KHS!iqfPYZPEs@|5
z#~`49qno#5ytBVwaHy|q&@C1Z|KO0744*-^{wjC2iU}=FEh>(2%gl=j&C4tUvNKC6
z74p**ic5=%QY&K|Q_2$al2cO@!c&tJLQ<16^73=?(<@^Vq2jvbsY$v8Mfq8&$t5xV
zMJYf7;(ardi}HcSmSrZV#=95gmlhbuBo-9JB<JU)Wv1&DRQ}?y$<0qG%}KQ@;s&|{
v6a>Y}K;i>4BO~Jt4xR?q8@&7tTsPRc8(40LOJ86Rxxp^fzyg9roIrH|B#L2(

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/config.py b/Order_Microservice_Group3/app/config.py
index 0092cdd5..4eaa0139 100644
--- a/Order_Microservice_Group3/app/config.py
+++ b/Order_Microservice_Group3/app/config.py
@@ -1,8 +1,5 @@
-import os
-
 DEBUG = True
-SECRET_KEY = "Group3"
-
-PORT = 5001
-
-KAFKA_SERVER= "localhost:9092"
+SECRET_KEY = ''
+PORT = 5000
+START_KAFKA_CONSUMER = True
+HOST = '127.0.0.1'
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/controllers/AddToCartController.py b/Order_Microservice_Group3/app/controllers/AddToCartController.py
index fb556c87..ab120a78 100644
--- a/Order_Microservice_Group3/app/controllers/AddToCartController.py
+++ b/Order_Microservice_Group3/app/controllers/AddToCartController.py
@@ -1,49 +1,38 @@
 from flask import Blueprint, jsonify, request, json, session
-from app.models.AddToCart import add_item_shopping_cart
-import requests
-
-AddToCart_bp = Blueprint("AddToCart", __name__)
-
-# @AddToCart_bp.route("/cart/AddToCart", methods=["POST"])
-# def add_item():
-#     user_id = session.get("user_id")
-
-#     if user_id:
-#         data = request.get_json()
-#         ProductID = data.get("ProductID")
-#         CartQuantity = data.get("CartQuantity")
-#         UnitPrice = data.get("UnitPrice")
-
-#         if not ProductID or not CartQuantity:
-#             return jsonify({"error": "Product ID and quantity are required."}), 400
 
-#         cart_item_data = {
-#             "UserID": user_id,
-#             "ProductID": ProductID,
-#             "UnitPrice": UnitPrice,
-#             CartQuantity": CartQuantity
-#         }
+from models.AddToCart import add_item_shopping_cart
+from models.CheckPriceAndQuantity import check_availability_and_price
 
-#         add_cart_item_message = add_item_shopping_cart(cart_item_data)
-#         return jsonify(add_cart_item_message)
+import requests
 
-#     else:
-#         return jsonify({"error": "You need to be logged in to add items to the cart."}), 
+AddToCart_bp = Blueprint("AddToCart", __name__)
 
-#This one to test
+#user_id = session.get("user_id")
 
 @AddToCart_bp.route("/cart/AddToCart", methods=["POST"])
 def add_item():
-    
-    user_id = 1  
+    user_id = 1  # Temporarily bypass authentication for testing
+
     data = request.get_json()
     ProductID = data.get("ProductID")
     CartQuantity = data.get("CartQuantity")
     UnitPrice = data.get("UnitPrice")
 
+    # Check for required data
     if not ProductID or not CartQuantity or UnitPrice is None:
         return jsonify({"error": "Product ID, quantity, and unit price are required."}), 400
 
+    # Call the CheckPriceAndQuantity function
+    inventory_check = check_availability_and_price(ProductID, CartQuantity, UnitPrice, user_id)
+
+    # If there's an issue with availability or price, return the message from the inventory check
+    if not inventory_check.get("available") or not inventory_check.get("price_correct"):
+        return jsonify({
+            "error": inventory_check.get("message"),  # Message from inventory check
+            "available_quantity": inventory_check.get("available_quantity"),
+            "current_price": inventory_check.get("current_price")
+        }), 400
+
     cart_item_data = {
         "UserID": user_id,
         "ProductID": ProductID,
@@ -51,5 +40,9 @@ def add_item():
         "CartQuantity": CartQuantity
     }
 
+    # Update cart item data with the current price
+    cart_item_data["UnitPrice"] = inventory_check["current_price"]
+
+    # If the checks pass, add the item to the shopping cart
     add_cart_item_message = add_item_shopping_cart(cart_item_data)
     return jsonify(add_cart_item_message)
diff --git a/Order_Microservice_Group3/app/controllers/CheckOutController.py b/Order_Microservice_Group3/app/controllers/CheckOutController.py
index 5f48e6f4..6aa7dd8d 100644
--- a/Order_Microservice_Group3/app/controllers/CheckOutController.py
+++ b/Order_Microservice_Group3/app/controllers/CheckOutController.py
@@ -1,29 +1,38 @@
 from flask import Blueprint, request, jsonify, session
-from app.models.CheckOut import checkout_cart  
-from app.models.FetchKart import get_user_cart_items
+from models.CheckOut import checkout_cart
+from publishers.kafkaPublishers import publish_product_updated_event
 
 checkout_bp = Blueprint('checkout', __name__)
 
 @checkout_bp.route('/cart/checkout', methods=['POST'])
 def handle_checkout():
-
+    #user_id = session.get("user_id")  # Retrieve the user ID from session; ensure the user is logged in
     user_id = 1
     if not user_id:
         return jsonify({"error": "User not logged in"}), 401
 
     data = request.get_json()
-    
-    if not data or 'cart_items' not in data or 'location' not in data:
-        return jsonify({"error": "Missing cart items or location"}), 400
+    if not data or 'address' not in data:
+        return jsonify({"error": "Missing required fields: address"}), 400
 
-    cart_items = data['cart_items']
-    location = data['location']
-    
-    total_price = data.get('total_price', 0)
+    address = data['address']
 
-    checkout_result = checkout_cart(user_id, cart_items, location, total_price)
+    # Call the checkout function with the provided data
+    checkout_result = checkout_cart(user_id, address)
 
+    # Check for errors in the result and return appropriate responses
     if 'error' in checkout_result:
-        return jsonify({"error": checkout_result["error"]}), 500
-
-    return jsonify(checkout_result), 200
\ No newline at end of file
+        return jsonify({"error": checkout_result["error"]}), 500  # or another appropriate status code
+
+    # If checkout is successful, publish an event to Kafka for each item purchased
+    for item in checkout_result.get('item_details', []):  # Ensure that item_details are included in checkout_result
+        event_data = {
+            "ProductID": item['ProductID'],
+            "QuantityPurchased": item['Quantity']
+        }
+        publish_product_updated_event(event_data)
+
+    return jsonify({
+        "message": "Checkout completed successfully",
+        "TransactionID": checkout_result.get("TransactionID", "Unknown")
+    }), 200
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/controllers/DeleteFromItemController.py b/Order_Microservice_Group3/app/controllers/DeleteFromItemController.py
index 8a824602..1e72cb1d 100644
--- a/Order_Microservice_Group3/app/controllers/DeleteFromItemController.py
+++ b/Order_Microservice_Group3/app/controllers/DeleteFromItemController.py
@@ -1,24 +1,13 @@
-from app.models.DeleteItemCartModel import delete_item_from_cart
+from models.DeleteItemCartModel import delete_item_from_cart
 from flask import Blueprint, jsonify, request, json, session
 
 DeleteCart_bp = Blueprint("delete", __name__)
 
-# @DeleteCart_bp.route("/cart/delete", methods=['DELETE'])
-# def delete_item(cart_item_id):
 #     user_id = session.get("user_id")
-#     if not user_id:
-#         return jsonify({"error": "You need to be logged in to delete items from the cart."}), 401
-
-#     # Call the function to delete the item from the cart
-#     result = delete_item_from_cart(user_id, cart_item_id)
-
-#     if "error" in result:
-#         return jsonify(result), 404  
-#     return jsonify(result), 200
 
 @DeleteCart_bp.route("/cart/delete/<int:cart_item_id>", methods=['DELETE'])
 def delete_item(cart_item_id):
-    user_id = 5
+    user_id = 1
     if not user_id:
         return jsonify({"error": "You need to be logged in to delete items from the cart."}), 401
 
@@ -26,5 +15,5 @@ def delete_item(cart_item_id):
     result = delete_item_from_cart(user_id, cart_item_id)
 
     if "error" in result:
-        return jsonify(result), 404  
+        return jsonify(result), 404  # Or another appropriate status code based on the error
     return jsonify(result), 200
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/controllers/FetchCartController.py b/Order_Microservice_Group3/app/controllers/FetchCartController.py
index 242ec04a..bf9e944a 100644
--- a/Order_Microservice_Group3/app/controllers/FetchCartController.py
+++ b/Order_Microservice_Group3/app/controllers/FetchCartController.py
@@ -1,5 +1,5 @@
 from flask import Blueprint, jsonify, request, json, session
-from app.models.FetchKart import get_user_cart_items
+from models.FetchKart import get_user_cart_items
 import requests
 
 # cart_bp = Blueprint("cart", __name__)
@@ -24,10 +24,10 @@ cart_bp = Blueprint("cart", __name__)
 @cart_bp.route("/cart", methods=["GET"])
 def fetch_user_cart():
     
-    user_id = request.args.get("user_id")
+    user_id = 5
 
     if not user_id:
-        return jsonify({"error": "You need to be logged in to view the cart."}), 400
+        return jsonify({"error": "User ID is required."}), 400
 
     cart_data = get_user_cart_items(user_id)
     if "error" in cart_data:
diff --git a/Order_Microservice_Group3/app/controllers/OrderHistoryController.py b/Order_Microservice_Group3/app/controllers/OrderHistoryController.py
new file mode 100644
index 00000000..c2ceb9ea
--- /dev/null
+++ b/Order_Microservice_Group3/app/controllers/OrderHistoryController.py
@@ -0,0 +1,18 @@
+from flask import Blueprint, jsonify, session
+from models.order_history import fetch_order_history
+
+order_history_bp = Blueprint('order_history', __name__)
+
+@order_history_bp.route('/order/history', methods=['GET'])
+def order_history():
+    #user_id = session.get('user_id')
+    user_id = 1
+    if not user_id:
+        return jsonify({"error": "Authentication required to view order history."}), 401
+    
+    order_history_data = fetch_order_history(user_id)
+    
+    if 'error' in order_history_data:
+        return jsonify({"error": order_history_data["error"]}), 500
+
+    return jsonify({"order_history": order_history_data}), 200
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/controllers/UpdateProductController.py b/Order_Microservice_Group3/app/controllers/UpdateProductController.py
new file mode 100644
index 00000000..fab0307e
--- /dev/null
+++ b/Order_Microservice_Group3/app/controllers/UpdateProductController.py
@@ -0,0 +1,7 @@
+from flask import Blueprint, jsonify, request, json, session
+from models.UpdateProduct import UpdateProduct
+from subscriber.UpdateProductSubscriber import consume_product_updated_event
+
+import requests
+
+
diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/AddToCart.cpython-312.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/AddToCart.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..61f056c0c6c1d44e3037c3caa6a159cbe1c2d4dd
GIT binary patch
literal 1337
zcmZ`&&2QX96rb_8cbhD2K3dW&H9~wCC0mJJDjHR^joK86G$=_6D@&HMGrRHPua3Q;
z8@$pYAwEuoQ-j2zM^HHMe{eBcp+-X`sNlk_Rf>dqV#d2pRHTmVH*e<s=Djz+_vYuZ
zu@Yco{rq_I!Z85;<cnfRBjsS5DR%(^2ztPWb?6Iq!58bIFV!VquFH_y1W)nRx|-{v
zr`0t9V2C8F?+HUc^%5?%PZrLPW+Wq}1%Ffv9MV1mdn0rGSXVUlzxm3Pseak(;E1?E
zLe+L025z%URf2DKaGX$y?@%?yaqNbH3F)+hknJYex8uz)irk=OHyn~IQ;AR8`dL1m
zWgsf8+*n;>CsZFNn<0uDN67&ovxUh1gMXP|EWjQ}U;${4?pCb%T;$$^DQxr8{~Jiy
z8=db7&q0WX2=O@x=@22M0+CXY2&vSsBx(_iv+BYEh19073Q~|VR4O9vJE<opdVx*l
z0@qWHJfupoy9!Kwnd%9n+3v)c&{9M~)M+HPi>P+H;{=JDbZMy*xQWf`)4){5goI@K
zt(76rxV|`N6u>#d36R0TMh-R{f(>3qmta(LcNjaSM3r?G>G~qoM=rR!&d#jl{<Zf<
zQB9d}j;YqdiJiBA$TY%xmuO6wDph&TJXHxfi9^P@slvqzOwe)O2E#t#W;(^&=4j7n
z{p7T8%!xII<LT#D-nMvlv31oAESA(3(-{Ls*fin}A-HQ@LR(JIz{t3TH;gsh*bG81
zY;`SXv_Jnb-k4`Bws9k|ZV<#A*zdUw5;C`2j6nMu2|Lj_%ZVbZ5e5kfJ&y;xgwR@e
zg=Jiex>PGVoK#tMyqxh46MgVV0hO8lwZF<I?w3#hQa(K>SNn_m$EWU|`sUQ`+~D}@
z{de~(6JOu?>dtOyP<f@l^sMb+dFtB_zMsj=3lA#OyK46GdUo>WpmHnw(8?-SrdiDY
z#LWKG8U9VqKGx-FrN8`S98}N!ba60yIg?&|P(G1OyfG-7nPeWYoPaq-<)-Jv9})hT
zhV|ivBMKLsT{_7wTk}JNy|{LG&%B6K8@=+FYPKCXKDKSD=0)0wsLZHJaL&OGfV{;0
z%`)*+TVT#Q9==FkV@v+#;&+&MBti&(2MfP~g?|(P&;JH04@(m}S9g~NrC0mvA5i<E
f`f2scPww5kx74o=;QV7@625sL0-=^`d4&G}{X$@%

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/AddToCartController.cpython-311.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/AddToCartController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a9e7891fcf777abbfada512843ea4f1a1a85e2a
GIT binary patch
literal 2207
zcma)7O>7fK6rQzr{gbt0H^xqAVlW0&+ynwxRH3C*`6(!chEzbKT5eYx&n8(|@0!_l
zT2n{$p@$w37jodhDGf>wIri9NkGs)Iu|`6QRQ15ki1xy%Z`O{%RFN3(zJ2rNn>X{`
zd~f_~G}?!teK2%xX)=h=U#zp=_>S`OF({7^Mwru3nJaK*U%^-Q7yM<uz?X%Bz_Br(
z7AOY`K~MK<p>nto_H<tBEA;u0!eK!XH+%?f!P{<yh!S}c-S55m#Q_{#=6(zH;&J$A
zv;nZKF0{~(`I{)$_ncXB0u4`TRi#2y-J-!erlG4#H5w$!y{ckblxG$iG!@fS4L!%v
zl#H>YT1r_mSBy$U)t9A`Oe`1~DXl1_yOO*rtD3y1YN}O}WF1T3x}?m}@Fd2!jA_8$
zkBze_<6Q&g=WpD+1ulYR#ac12S?X>U6i6}h!~1d`k^m{?){w=$2HffDy<x6#b?!+w
zZLjeN(!K$6wz~7yd<P=^Zz25$BKfzFeBDR*x}W&!d?R787&;9LIG}R9XdGPf-9%P+
zAA?ZcSNGTXI@$n2ZS9i^tqFDEfS5wP9!c^*WVjb;&b_(2184R1&N>h$z9TNui^I{!
zZ{@n3lRC=;<PrBj=GOvs0Y?sZlT;62{u1;ov1>y0K(F7mU{7?x-ccxn*xYkQ1R9<v
z2CkN@*%=yPB>k!?>lRR$hHvYtHP1Lq1%(iU+&|xeW@cx`GWR;Tu?%oMQw40sBYZ|C
zN`_UDN)&uXeE^HlaHlpjg+@J)R5A!rN>F%ZC@^_hp#xorwC|ZlOI1MWR=bjNelh?X
zCMhNcLF9NExNRzAc80{5?L8*qY#=}c_|VX@Vo6>d`#~d&O@vX6gcvA9gH@O<shILu
zw&b=GHsA9^W2(LiiyNdSc?C}US@E{70EVYYb|bvDbs{mD^Gv6`dNBQQk?qkeUQzWT
zWONmD$Zp11%9t#=T5%Gu%6dt`nFVDrb4w|$=!Rx2*NSq-e)@Z5@pOe4cOYNI8w7&`
z=}Wal3~;*&rz2e@MzxYJ%9Tp7Wat(#G>t9Ty=A7m#xs=~4Y6IbdyE`|jYi-#WjLb-
z+Ut)suKq0!xZ<!Qrd=`Jm}$ljJqkSxtq(i#lWzQEW44(Xd^GWJVtvj@jJk=@#`XUp
zS^*SEwh$+L%dKB;e>Z3Cu}`1HQtLtc*lm08YbUng#un^vigv7Mhl>9O&|rT1;_up@
zv-ZMwPD*l9QsV~mGrTJv*%6Pd|LBOLt~lC4f)L;SY&U;pCx7LSpPc-Hn_uvZ;JleU
zv70=#lRUL~*h%KyWWJd_x0}7Nlf7Vn^o5hX=4P)o(__2ovpeat+ee-Bq??{>1^J=A
z76S1C@p17VCR!mBjkm&lJPrflc&i^J-ft$4uxIE*D=ee}uwp9Em}|w+@$=i`Zg#3M
z_uvzUKMHZA^V^r5ktug%%H|J069??XDM!q?V$SAsFCo)VbyQf=Wb-az7kitLjH)ES
z1iLJ0ylh}aGtYF7&toec>6oY4e~nj_lRDn7Rgcv))cNl+X-JZExvWSMjda~eixnyW
zQ!K?h_@{_u*_s&;uR@o=dsR~|lTqlhYr%X9qUGl}u8A($@AmAWyxsdW(dTyWvxj00
z@3$8l`lYr${A9(6jk~e&Mg$V?>)+)PJ6ys(baFee`Gd_R9B#tpCR)DZ+=nd$;)Ngi
LF7{YFvlq&LEA=Im

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/AddToCartController.cpython-312.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/AddToCartController.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0f2978378b85343616505d320886ec0171822f64
GIT binary patch
literal 1911
zcmah~O>7fK6rNr0Z*0dV#tAe8mH-kiA)#1Qfu>X;5y&kKR3xBUmR6gcNwQ(RYi8GJ
zO&!&Ts%JQnN*sEm4Tl_i?6Fc0wPh+tBdY$;3pYn;FPu8F_BvE*)RA}g?YwW^-+XWU
zV?5pm==k>1_|i`@058}_IE1dS`y~|~0SF*xgCdvbihQ0gM)HxOkQa(#UgVgLx22+-
zmjgLsD@8T02C`uH<@<PmI4Gj%Cf~7{kD=J=aOi074J9Zqb5E5J2h}gYW>=l>uLzmG
zm+UJe67`B*MkQ=HK9N^F*Rhr=M8@b|8F@Yt*b0$7<aw6sWH>TtK&V?jD(c>fTPj)3
zvThpKr<x<?3Nr8N#+qT-#-e3genmGNs8iD>nj`8og!AqU#okX$uq_k41tQ$MaciEM
zkc-G)aiM4K<pBUKCWz2y_YW>89=8sBDs{$cw+!JodxvSRb5(9td|lI#A-~z(zs~Q2
zi1ZMVeGozqAyj!RR3n(L3blmKq74QVp=5C(3d&3TE#Rx6w#ru{Rbi9mMaQ~W75_6*
zCESk>?1NB4gm-z*_deLZ5W9~)`ak+usE6^#y$W?Qs{)!4tpe<SEUZga5ylSFys8ou
zrs&&`vMkxCN}-K)`L%fEaP=0*B<5bS<00xz?836?=VnQa(dMJF;rNtPL|t$!|0ZJ<
z5fR2NzJI<8)pE0A+PyArOrz}6$`q>w6x0liG{$QSBRFn7piYR|Wvh)yJOJsYi!m~3
zD-<c^jb%gzdJsLdOyXvlq8z`&?Mws@(17tEn}+C=5s0+lA)K4V3AT2CO-ZJZFykXp
zmXWUqofV-HX4eB|)W8Y@DMT*Q-MR&d01e;h7-9PZOC(`AYt*@mD|*m!q@T4@rzshp
zq*;&dt#vc;m~pK;UOkw(RA4cBg{ziRpcP%CGOe!WE@>Xiu2PtWYldSYsNF$}+B`B>
z9M^W2D+Qywe)bczc(#PyRa&pY4GgIP{X@&dE;YMGPe;Fo-Et{gFiNF@={i1kZJRml
z_5Dn5alBL^3X7WEEciGLG)^BcP0y$Xe(O)vuKgJuXhnw`(cxxvq&B;qJord?sB8>3
zlc#FA?bOht$%m60bIsJ5+Vy|yb|er>e|7yyu0Hne^TgnWTtB{0AG+O4+^K(Ds3!__
zrSO*ohO%21zq5bHH3x6kZnWu^;a2o$BYJe>vuDvWTko~9R~y-@-+%rrdxzTCPM>V0
zPdC!1pB!$cv)iL@wMH*AMlaOge!n^T!S={lYvf#G<lNS==E(GpEF9|F1wt~~RzN)2
zR)u7;4FomW?gyziw$n%1@6gE|RUDLRbL}KJaeix}F?yvo_u!p|aEwMalHI!8JaVNj
z9DW`hsHaXhqnWyp*`?K?okGMV+wksUc8zpc#OQ@3HnEF{9Hg}$FS-!f-gvL<0n3Q?
znrepK+(Ac8J233CfRRM${u6ja(RIftB3&o3o+*8?L_~VZJ_-))8-PcdZ;ei`lqu@C
zY@^Hg4E<y+?d9myj&L0JE13EjO#LkZZt@q9djS%^Ck|~4f4$O7Ow?kuRD6GnOEtJu
d{otuB>B*;cF4g2FclZ<Bo4XOfUks$c)jy6(<U0TW

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/CheckOutController.cpython-311.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/CheckOutController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..fe7008f6ac30785c05f77e69cd7f282c9ae06aaf
GIT binary patch
literal 1927
zcmah}O>ERg6rQoyYwu6uWP=iIs}!ecE4Cs~T1doCD@sB`sUWEWqFQZbIiA^#6R*7;
z+d+voQVtwAAT>QT2M&8FO$7%IJ>=M9k6vVnm8D9NsvhWR5pdzuXJ<FCMOB~1GxMI`
zyx(u;=f1u)0=o70N9CVng#L_}E+smfXIrrO5fMbNiK@7Wt6Y(*@<qOyC?;?u=S-oR
zEGFYUZ;Dl^C}G4Qib;Z|?r{j+hi{*XX_{_iy4>q45lFIvABesBM7o9Uf!h58)nb;U
z7EmGmB$5;oVd{eE(Hb)>HxwED&Z7=&mL1zN%4?zMP{%QBtAN8keTnKTw&$w4##|7L
z*1Sd2aF)~>vx%p>s#hbLONmNXDHxNw`s@A2qZ7xwe3+P@Tet=W#42@{Y~tt#vB5@!
zkB9HsuQ;w6-avKa47tE{iExBB@I8>+Kai3{nOi_^bh1Os2Q}->e*@PsOAw)sS26py
z-Q*i~#mH_Q6CvL<j5atoin2p>ROfnYzQGf&&aWbt?~S?+@>f>g@Fc~a_(m5uT?g?>
zQWezeWd?ow?na`XAn8{&fy=z&NcJwbA-J!hr7rYV4Wm2bJu&vx|I2?rk$e4<fxBF<
zH8L1wP{>_<61621C}TET&s}#YQ!Lw6OuJH{L@_Mm2T%w_jSvR#T34<Z05YqhMDQ~h
zsFV$A66cK4(J;0^-*_G!${H@Ms)V|lVLD-Iejj>Y&V<s}o@Tj*yH?=XVB~(VE136~
zzN9&ntRJ54Kv>c3YR#koR>kpj9fBx(rnwgOU1OT%Xu1oK2b<z`YsIo}S_Lk`s^e%C
z$_|0;C%?l~NHPHy7PTvsD%4e@OT!{$ggmfJij_jqgZx#4gbBDE8iQ8?g>v^Us89gU
zbi+iHR+x@&jvDDXNzhYbdinkInNn0lr}Twkm9AUHD(oRs#V$kmjM25y=VVp0bV%n0
zT~w}7eaW(++G{1PBcHfQ7boDJE>qnt%`pN7)GLP0Y%sfO=v19$wpaV4q}6IA-L_n2
zn`Y!NF4&ysP9MmQ)z(6JNwbJa)ovC{fncM=os-a`P1H^zd0=z4mC3ac7C!w$9^MxH
zu~YuYWK*6B<f+{uUq0tc=l;s%g3Q~^%xI7q-JEG<<VgK1ymh)U;}0Ey(K$KokIXdX
zi-COcH^-MR`_kpT{@m8-JND-6izFI(uQ9uGqd9yk7(TT*2fihF>$oqD!HCZ{4nG_T
z#!mYqXPWZaKt8*>;LGQI={#r-Dvt-o9}SE*u0Fib9GD6QrrJmlK8~l`iM{;j_DYcd
zur>C6V>uW*(H8jObQ{5RJN-gJsSg^<P3c4+o$%uU*|dgEw(>_F=Z`+hAKg)Rjb{E*
zkiP`y4kh8-q2yD<XT|5y1kO|0w#a9*@I%NxgW{p9g}zWIo0_x2qIWDt);`7}Fobf|
zCe(C}b$hZ8wYNI2Fm&tKidJ6H=J#J^;9~@alB!x-m8xo(>Gn%qtc3zJ+=Yt?mVZHP
zEb@04rkBz=aO0WuGgbf=+KHTPnA$wXxP>PD{~Ik-@OwuK&G@}zuYcsWv7K&QYW7bA
v{S%v+J)C`vbB}P&9~$2&?|kFqToX?Qc(TpCgP}q&J>?NM)gy_;apeC1@tpYk

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/CheckOutController.cpython-312.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/CheckOutController.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..e365f5bde611cb80404546ffa04313ef6241fc51
GIT binary patch
literal 1688
zcmZuxO>Epm6rS<V+WV6@*;HMYs;#2}>Y^r5fu?GyP-y}wmD&WQRncmZ<#=W{-gxb0
zY^U02Bjv!MNJxYeJ@l~0pd!&@j~tN@(ymr0tpy?oIP{j1oXUka&YA{^kvuc+`MvM`
z%s2DH&`<`!`0>tE^;-?0-?@+sX|UN_gUwfnAc7s#z-8PJ%0fddiw&tPVXhY(xsfWT
z;=Sl74YjOdBp`~3MAHw11DtY(X6l6m{KZOSlB(fvl*EpxpP~nY-{o8@UCKP=Qb~%^
zSDcVGne7IV!ssU<^<h)@J=d<bBE_e^Z+mVDM?=;!wN|_^Ff5Y=pg7(PmmJ$)Hk!;M
zp%oZmlb8V|23@59rY81l!&BU2Dv={;VSe!@04NO_EPKSaUZjnX0)hzN-V%=cgV#|T
z`C0(d!5{(=ZTw&$6R9dJqJVqEqn`9PQNWtiy^h<MNknerRm}d2m^y^0aKttyauIyj
zg@9)ik2Y!xNk7*`BDBR-#PWwTYlD`19YRxMG_jr@fE-##x`q<GS@iKs5KU@JB*PJ4
z&GMDx?hEU3kWJj$a#A@)pT8`jL(zxY{~u+TXh{?@a$iXN$tcgPl)v$mw=$9`V;)<}
z-|{KbT`$lbuU4Z(w_W>7Fo+bB5C&ve)34h=3Ad(mve*nvsy20qe^DP;*qdN)?{lY|
z9ngkBXkgloAEg%#i1NW~q<$EhZeRzklE6lJ_|ZhM5Hf4o^eI_8IWr)fZh4KSLxEbl
zA6gb9Q4JlZ6%E~Frt6zl00ae0<(9kRdUxECz?tRyW{t8Vfc^A)m`W)o!@@W{BDF>X
zgHxRGvyDU$nHn2KN(l8EHi;zQvdQ4~qDV`aYd`}+Cx|3oR+Nc(Zg4w41$KHoo_{fO
zvBI0^SKhbX$}QJkg*{ZNdsRrEG1{uUOIA(Sf^u%tCH*F~mR%3J-Kv-a{lp!*Gy%7&
zPOYFa&j<h**KLb=0J~~i)R<#l*nG2MHk%d8a|7l%4i6YNY(5NT{?$!3TamVGy2PPI
zQU%i?SzfOHH%uF7H-)s3jkzb;{Lk9adrEiwT(>aY*Ump0>uQ&}>ZL!j`R(knUiMf&
zdwgT|Nmkpu(3$OxogP@vbPKb6?Y-~(u6C`fUfUVYZ(jJ!+nC!=p~5Sjxvks%qvtl}
zA&9DNPW6=W*sXK&VWBsEp<B4v*WP}#*wrp~)yrTrs&9{+>W!T0+<17UKXU#rB+GBy
zm3E59@2&KTuRk7twNvknpM55aM>BUb`zlJm)~Wxbp54uY-TpAjjXfTF>v8e)cJWNF
zcxKCZWcQ0#!TLyQ4~aPi0;F@hikQpoB2mumLHX!LX(*Dbj_I#3{)of`IiLzZ(`XEO
zJlXIFb^OVsy$7s0!T$`NKxqEtidkJT7Y?38kYhqcs$sZhgBnJZP1<iPH6t0$FMxXn
z5xz!joX0&0({uF_gbE${4l98OHwgJxVA>Ti#=oNJKAQdoP5g<j{x)2=m+4&X4^M1l
kcW`bS=X*Hc9XqvE-TJ7D^L;%1OgMpadm<9f$GbSjKN$YT7ytkO

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/DeleteFromItemController.cpython-311.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/DeleteFromItemController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..407c6a133d5c8e14b1326add91787d330749b3db
GIT binary patch
literal 1214
zcmZWn&ubJ(6t3!??w-jwnW)L?ijbCoIEN&NpeR9EW1?b=2bIOPvFVwrN!slnvsFE_
zjEtDW!mc1}78G;vkW*CRACaTSjs%nfA+V?1M#5e^`Kmh^5-qx3zxVZf-+T3Sy)Kpd
z5UjtBpRR8z2>mC6-Id#Mw*Lm_B_fDm9|hRLSo(^u1gfP5IV%@vmKNxi9vGH^k%Fj7
zRGMD_zE#-SvI?}Yoc7v9cHbmNv^o4v-=9y6KhX-LtnQ{Et4Q*<QKhgYkqQ<=g!(k5
zju+Fwsk10>YA%Z_nkZcMo3z2aFc!u`9)(`LEeu9~Z&DtMoJ54dDd!$IdPeeScw82b
zXVLfs)LxK4M(&Y|LccOKGj(SQ`WgX^=Oe;vxHlR?QY#hq_A4-;6@H96m>-V!<Pe3Z
z9$o=twTF^iUAc{7S-G=1xP$g9@mL{BM`<B;a4%a&`Ho3TnR?6!{g9!{jEXV4C6k0k
z8H?DXbN8aA8B$8jI5Ml$^rN{s2)t0nnH;86n43~!GoGiW6lTo(7g)UKV7A@^T}5FU
zyqG*mMHL73iYJUFr_Aw)&>7`TKjt#aG|jIsCNJ1`;TyN7z0kfJdM)t1xNSytlQ$Wo
zZTlC}a>E)-^ee5JcW7-sj9|pJ?e5^Cf6(e^gGCQ%Ew*nl0tC)Yuf`&vZFx27TxC(S
zamIEV4Z9YFF^ha(HoTHvo@qGKbvWH*@5@-DEsEK>)1S`<Vb(lsJ`ZLAZT6QJu6`;W
z>LRRF@#peSOGa|SN{-xLFWVbsJ9*$HWjD#Y|LdrKWcl2inf227jnesr=}n`5@nm8g
zg$Jq@TTh=nd$O!1<&h*m^0|0u@$Az}&n_)ZCdJ_-H@pqK&}`*^I2J@O3?IwJO-BXw
zZ%Q!LT4;6O<-aj`|FS=zOV5x-PA&3|6S@I)98t<RCgruRHiQPc#56tLTf~NB!C^38
z^Apgr>C=nsIE3=5@PEK`RgCc`G?DCoenh@Y=!KgDKQ9)RPAy+s9~j*j7+olJ^GGRw
p#DgF3U@~-e?dV!xf(O^}jSYOGtMp;Bi@<zQkurn#K`EXN{0$&~NF)FN

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/DeleteFromItemController.cpython-312.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/DeleteFromItemController.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..da076fa047163edc36e0bf3b2339a6b74d0b7478
GIT binary patch
literal 1068
zcmYjQ%}>-o6rX9g?ZUb&K~PML)Q}kW031vt65<C4Y6Lt8G1kVW?94*3AL~qa&6+iG
zFkZZ1qLCv<4gL`xO}vy4V;nVVJaN<DiIZ<yKql$y`~1E4ew}_O7TXb==xJy5OAeu5
z(%3s-r)QhN>lGr1U>^n8!dU8xuLP>4201GiXqFb}mL3?Efsul!N>rL(SF&=ejkYcI
zWcoo#aztCeZ}q)AVmv|Xy9rjInJ>3(Nvn)S51~GdspG{oaH=c{oQlihvL@Qb{5q{M
zFN}q;#G}xwHig0H{W|5b$VrbdIOW^}MbAJU_6^D6q0AZ@h1wD6$iO{vUg(!6rY2@5
zpsx|ocrhZpf)C6sSyAEHZh-(+@FU#9ycF-}5QV57Uf;DzuBzNbv8+f>3%AhT#*Y-D
zw3G&7#sAeUWxrBOEBA2^M06P`8#7xPU<!>g7O{uJx1+ilQcBD?GUuu3M+*yJc%ihj
zbxp}2HzkE;yhu&C_@MV3T6ix&Y`q7#vce=PlM|O!ap)j9!l-k~9FGW{QC|0BF0)M2
z+<7@ZV$VU0+ml{s&xKwCbT4k2QPt#i#%R;NL>g{bfr)O>d2^Ol7Q+ZeY})Rwf8YU~
zAE>ctiB@9!1|tCAOnVg;0c^voQ0EGZ>a{brTdUcXD2!R;`?BHX^m0tXPS;?&@%_kP
zttkrG-s#6>-7xE6c=#NMW%Q$?w0z}rq3dhu$f}W?w34HDHcNJL*G)=pl6U{=sH1;v
z`1RCg@!ay{52It{)P~Uu$t#U#kJr?s)Su-0zZSYy&OW=aI-V5zl3d?50Hc}mA#nnR
z91J4p&Ihyk(%FFSY3WSK6<XDI`8_5tR7SZjHA9L#2$6T3&<&{Lh+>8@F7N4lO=v(w
zOw)bdASQn;CimLOk3!43PtUXCV9JZb$3Xm6F~;A}#qVhJBO3kLd2IFc+SSd@f#u@w
m6G$n2!rdFVJLx(5uJ>Jgg1a~I^*>5GHn&xzOyN{bd;9~*Y$X{0

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/FetchCartController.cpython-311.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/FetchCartController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8896f18ce6b998335120baaf0fb9b52143b25b49
GIT binary patch
literal 1149
zcma)4&1)1%6tC)@p6<*TdrbV;AhWcHiw!0UQ8Ym!yU}E2Q4cB$%|J8hs!3Y=W31|l
zjEpddpvQqdtj9TJm3Z*zpV0$z$QCRJiw8Z8#FHmqwUcpYz4*H7^?Sd5_1>%B>%S%^
z3kYQP{h8X|DnkECXHRlNW48mwpNJrW0~BHhhl-<ws-uQECl_jthUGUU$cMV4XSNy`
zj-eomNsdlzDF|)D{vu9+7P`ef@4s)Nk^DM-sgK7K<1yNTu<cQ(vyZ4Zkv;KFBDN+b
zehC`1&ip75`W+reeyu5VM(;H!Pee{4Lg$ooKaOlHrq^lWHaKOjS7nLoCp6^OMNT>o
zwA1n>)YU7uAW{!$vJn&RjVgno!3LhtuIvdo!4FXj@#zGEI~1Z2)yG?aY>!Zqt0^~8
zB2Nybg~lTuVxqM0CSo(=xmtkF>>Wbi<khmgqdEw+{#O~8%3psc+ZGySEM^Z5-iF&-
zS1(&Ww<JwIqh!wSKo0*SC|hB2@XP>ZD?-n>@`;$p_#)M$%H=RE>r-cWu_ANv%8DOV
zZb$wm*nZNq;+n-9jL~N0XR=w1JW8zJ>6&$mdK*z3#OuvUb%@X2r)#ry7T=*>Qn|qh
zByg|!9*ZIErteXAmBo$ve5G2iSG+h%SR4ddL7I3Q%P_3v5ja<G3bQ8huj6G?(CH7b
zc?hbF26<$b+N*DhQv-yxOaGXMpXuqb^XZWbJ#(RNF1(&k&85^>dRsc)UG0@l^-HJP
zS9kRN9Xr*J!paVGXP%$$ADd5)ob8$C`sTS;JT(_nWASZqs<Y55mixtWnk(-@L1a$~
ztrk@IT_z|0g;zNWmX}HgB}!pTXu#)IWaq!ZjWXheG5mqKFkCmPhSYV1o=sq_E;Jw|
zq1okLAT}*?9RT&oxCqG_0bOE8!IeJ+{{z%O#Tf6Pi|O~R9dsrgUpvTbXV2g#R6O|9
z?yNlfwO2UNFPv!WZ?N&C{HXl&e)mvUZ<l-cWFMa#C`J6^0D=0TBE=p<GB|7cGl+;P
ACIA2c

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/FetchCartController.cpython-312.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/FetchCartController.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dfc13a9f5c15cb3c4f0eba233881f4a60cc6c9a3
GIT binary patch
literal 1079
zcmZ8f&1(}u6rb6T?545ZQmeIS%8Dp1XgyR>ODSr#wTSglMOXsMc4yLV+>bc3siZ`R
zAby<8tv&XrRK%nBFL+4_qKt})Uc6cAsV8T)X)HdNH}7kHGw(O=U3YgE;PUEGZ}F4@
zzz^Z<2=`OjT;kg@Kmfr2gwTeeWJ{rJ%b{W`p=zs8<fI@IYPOcza-iF~1TaJj&aO$@
zFm@O2Dh+JgyERf#W*)xOcIuG+5UjNe>^)W4%Kj3brLyd$pn}W9j}oSpXdL;)D$@wQ
zTfsD8iij|cVoLouvLM?#j}xatF>ySXB#xipkj^kgI7{j&u`zk-%1vIWg*aJ=5%qRI
zOXZHt*XCQUmO;|VmD>Gu0^BHx>i-16HMkwR4{CrKiMCUKBqaNtEK-WnEJ(6D*&67a
zgGj2uML_y?pRMueATQp9pr!~N{8|Tl7Fd}Xrll<Sh^d&6m@M_*;;fj{mrb9Vf<B*M
zH0(F{YyCf5St=3jFvTVFl*yb%B1VDeTv-z77P)N7DRL8+3OY=4t1&TJ5V*83=|_cI
zk-x}oKdG8=(WDhZaJ6s|ExM71k$D@>nK!Yw5XC_}UoE)p_{n>C?qr$7CF~`I8w7Cx
z=eqBan8Pmm9(JZkTq%zf+;X|##Zf}yAV@F7iMKGpKXjrK94=RxQ55liBS7}@mmc7Y
zE^t)`e=@+>|15YKeCQck?-^RDwtB4k)c0K9XJh}0);xT+IdHCJoPRUYG{&3y_|M)W
zt5dDs6ZPqjT2I4T*AAw2tAo$at{)z04xDZoXI|5$G1}Bef9Coc=UcgaQ^{}gyMWcr
z)MDV$J4B4sHl2cFk`YRL9P8&@4Tmwp0Ue$c55LA6N;zkGd&Vi#9Vc=_>^MwIKVYuR
zRL)6))81YH(l7A(xZ2XkI9MgX<Kz%`#U#=TT>X|IgkQnfdocC|oc;uijbk9!-<Vvv
m+Uh!5*S<mhasEO6$-UKmt6DwZg2y+c930w|fn=ptdc$8TM-mnQ

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/OrderHistoryController.cpython-311.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/OrderHistoryController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..682e33fc73c2f0820bb50ee49b50fbf9c56790b5
GIT binary patch
literal 1171
zcmZ`%L1+^}6rI`4X48f?X(CMn9=4!pz@|biwY5fS(0H*$)6yCOOS&^@wr+Og>?S28
zg$kZLRXo_Er&_5<j~+dGoJhd3AQYsBdWzIjPtI<WU@U%S{?32<{-2pQ|6N~SFJLDB
zyq<r_0r0~K+U993PBz)%4L|@v4HRJp7P$;p<TE^UFi!Ing^U0J2QWlD_U^Dcdu*Or
zM#SP<UpxByi#$kJfgk?iBk={;VYIytHPeH9X%Oo<c90lv_uSRWxI|Rlvc*-?(A9j^
z7ENrLs-efA9nND*DaZyvn8*dyv<y<U`?|vQ{!up`ZU5#|_vTruSj1MrK&H~!n=J%3
zc{WczGRIVa8=wZvumxGzGQ=TXg*yz{>!8S!=hDD(GFw&y-HZ*0xEibg678;4V|cWk
z1kTkJ+`65806^XvJjW6pR?Ihh>=11M6Jn6{_)OU<VBJ!coW;bF2!2*p2}Y7-NEH>Y
zNv<kVOO?3#iY2SRnIj^ra{Pt47)PA8AYONEi)E9ktRg$qC9sTgR?c*KK$1>hC#SLt
zjAmx<t9o`pS1W9-T2;x&OJ<o6T+Pm)N={eUK^F0{G>?^nZfM3zHJfYUBWrkhq(qEW
ztXSDO=VeX#p{fvrm93}>mQ%zim&UTWQYot#x<w34b2fCT56*fZ*}>zbs(T^VITtZE
znA-$RF9-xTQwRP~6F}h!{2mzG7U}RK8hKm~q#J=WU09-lCF)x`ieB4YtVhQi(Q)b-
zJQVwB=n@s3(aIUyPc??8Y2<c2kZ1%FpLrTcQeX1OAKIFumnUfWX5By8@K1gkqy7Z-
zBu>}?z-+A77V=uod`g_QITPAxKl?(_Kv*;5T_U@0VEbfQ&lRyO+rh5C@^Z-*m?{=_
zulXL30jFk=xl`XXt5?==f()_H=@9cdb4?yXcmPJ||HlEiLA%Fc_~O>&w!B-YhbJ20
u2?~OTaNrw^e1#D@baj7x{|beXI-F|2sV3)#cbb5?Up(M$bs;Y79`O%<<~Yp&

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/controllers/__pycache__/UpdateProductController.cpython-311.pyc b/Order_Microservice_Group3/app/controllers/__pycache__/UpdateProductController.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..23e96840e525d88b7815e326927bd300b7099792
GIT binary patch
literal 606
zcma)2O=}x55S6^US=+^gLaqVRn-4LC+)5}kf##B=h13+5h0S_3Zk6g|J6bvHA&?(Y
z=uas9H-=u!o(etnPzdCfQzXYV>@B0w)6*L<ANnyE^og_Ue=ldh-1)~}{#$2F?hYOK
zP8eZS5J?j%J4r_dNg%@{lu;5<AM1!M87J|I2cj!`NpHnN(NFp;JSU^*uTMCNn%<$X
zP$E}V6JHvw_^fVXgs&D%)r4MYVgtr-twyvNOiGql@E$d@MdgIuLMvk>WaXoj+0_G<
z!5ma|HhR`XGm)Dw7`Sp6dWbx1d59e}J5n<cX57k*T_1X3?9>#<r-1G7`9{Z{f7o3&
zY<`kEcPIDXj$Wk`18CB>T%{Am=Z^EL9_rc9SVXAPH*B7(0@&~)Ootz!_^h<hpXxMU
z>w8x)-E&i2LQ$pfkhuieDKAjFv~ylSc8uDV`)OX5sr!TqwGh5wYmTE$U|iPs-2*qP
q74RCLyC$jI=EA{kKq+04gT>Q)Nydw|FUiTG?Z3(P&1T`YEAjxNCcmHn

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/index.py b/Order_Microservice_Group3/app/index.py
new file mode 100644
index 00000000..532d6800
--- /dev/null
+++ b/Order_Microservice_Group3/app/index.py
@@ -0,0 +1,121 @@
+from flask import Flask, jsonify, request, render_template, session, abort, redirect, url_for, make_response
+import requests
+import subscriber
+from flask_cors import CORS
+from config import DEBUG, SECRET_KEY, PORT, HOST
+import os
+
+# Importing blueprints from the controllers
+from controllers.AddToCartController import AddToCart_bp
+from controllers.CheckOutController import checkout_bp
+from controllers.DeleteFromItemController import DeleteCart_bp
+from controllers.FetchCartController import cart_bp
+from controllers.OrderHistoryController import order_history_bp
+
+# Setting up Flask application
+app = Flask(__name__)
+CORS(app)
+
+# Handling secret key based on the execution environment
+try:
+    # Checking if running inside a Docker container
+    with open("/proc/self/cgroup", "r") as cgroup_file:
+        cgroup_info = cgroup_file.read()
+
+    if 'docker' in cgroup_file.read():
+        print("Running inside Docker container")
+        app.secret_key = os.environ.get('SECRET_KEY', SECRET_KEY)  # Fallback to default if env var is missing
+
+except FileNotFoundError:
+    print("Running on a non-Linux system or cgroup not found")
+    app.secret_key = SECRET_KEY  # Use the default secret key if the file is not found
+
+
+@app.route('/cart', 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")
+
+
+# Register blueprints for different parts of the application
+app.register_blueprint(AddToCart_bp)
+app.register_blueprint(checkout_bp)
+app.register_blueprint(DeleteCart_bp)
+app.register_blueprint(cart_bp)
+app.register_blueprint(order_history_bp)
+
+if __name__ == '__main__':
+
+    subscriber.start_kafka_consumer()
+
+    # Running the Flask application
+    app.run(debug=DEBUG, port=PORT)
+
+
+
+
+
+
+
+
+
+# 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
+# import subscribers
+
+# from controllers.AddToCartController import AddToCart_bp
+# from controllers.CheckOutController import checkout_bp
+# from controllers.DeleteFromItemController import DeleteCart_bp
+# from controllers.FetchCartController import cart_bp
+# from controllers.UpdateProductController import cart_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('/cart', 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(AddToCart_bp)
+# # app.register_blueprint(checkout_bp)
+# # app.register_blueprint(DeleteCart_bp)
+# # app.register_blueprint(cart_bp)
+
+
+
+# if __name__ == '__main__':
+
+#     subscribers.start_kafka_consumer()
+
+#     app.run(debug=DEBUG, port=PORT)
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/models/AddToCart.py b/Order_Microservice_Group3/app/models/AddToCart.py
index 970068e5..888e4b4a 100644
--- a/Order_Microservice_Group3/app/models/AddToCart.py
+++ b/Order_Microservice_Group3/app/models/AddToCart.py
@@ -1,10 +1,7 @@
 import pyodbc
 from flask import jsonify
-
-import sys
-sys.path.append("c:/Users/Fin/University of surrey/Advanced Web Technology/advanced-web-project/Orders_Microservice_Group3")
-
-from app.models.database_connection import connect_db
+from decimal import Decimal
+from models.database_connection import connect_db
 
 def add_item_shopping_cart(data):
 
diff --git a/Order_Microservice_Group3/app/models/CheckOut.py b/Order_Microservice_Group3/app/models/CheckOut.py
index 48d6129f..3cda97b9 100644
--- a/Order_Microservice_Group3/app/models/CheckOut.py
+++ b/Order_Microservice_Group3/app/models/CheckOut.py
@@ -1,83 +1,107 @@
-from app.models.database_connection import connect_db
+from models.database_connection import connect_db
+from flask import Blueprint, request, jsonify, session
+
+from decimal import Decimal
 import pyodbc
 from datetime import datetime
 
-# def checkout_cart(user_id, address, delivery):
-#     try:
-#         connection = connect_db()
-#         # Ensure that all operations are executed as a single transaction
-#         connection.autocommit = False
-#         cursor = connection.cursor()
 
-#         # Fetch cart items for the user
-#         cursor.execute("SELECT ProductID, CartQuantity, UnitPrice, CartQuantity * UnitPrice AS TotalItemPrice FROM ShoppingCart WHERE UserID = ?", (user_id,))
-#         cart_items = cursor.fetchall()
-
-#         if not cart_items:
-#             return {"error": "No items in the cart to checkout."}
 
-#         # Insert a new order group
-#         total_price = sum(item.TotalItemPrice for item in cart_items)
-#         cursor.execute("INSERT INTO OrderGroup (Transaction_date, Address, Delivery, CustomerID, TotalPrice) VALUES (?, ?, ?, ?, ?)", (datetime.now(), address, delivery, user_id, total_price))
-#         transaction_id = cursor.lastrowid  
-
-#         # Insert cart items into OrderItem table and link to the new order group
-#         for item in cart_items:
-#             cursor.execute("INSERT INTO OrderItem (Transaction_ID, StockCode, OrdersStatus, Quantity, TotalItemPrice) VALUES (?, ?, ?, ?, ?)", (transaction_id, item.ProductID, 'Processing', item.CartQuantity, item.TotalItemPrice))
-
-#         # Delete the cart items
-#         cursor.execute("DELETE FROM ShoppingCart WHERE UserID = ?", (user_id,))
-
-#         # Commit the transaction
-#         connection.commit()
-
-#         return {"success": "Checkout completed successfully.", "TransactionID": transaction_id}
-
-#     except pyodbc.Error as e:
-#         print(f"Database error during checkout: {e}")
-#         connection.rollback()  # Rollback in case of error
-#         return {"error": "Database error during checkout"}
-
-#     finally:
-#         if cursor:
-#             cursor.close()
-#         if connection:
-#             connection.close()
-
-
-def checkout_cart(user_id, cart_items, Location, total_price):
+def checkout_cart(user_id, address):
     try:
         connection = connect_db()
-        # Ensures all operations are executed as a single transaction
         connection.autocommit = False
         cursor = connection.cursor()
 
-        insert_order_group_stmt = """
+        # Fetch cart items for the user
+        cursor.execute("""
+            SELECT ProductID, CartQuantity, FORMAT(UnitPrice, 'N2') AS UnitPrice
+            FROM ShoppingCart
+            WHERE UserID = ?
+        """, (user_id,))
+        cart_items = cursor.fetchall()
+
+        if not cart_items:
+            return {"error": "No items in the cart to checkout."}
+
+        total_price = 0
+        item_details = []
+
+        # Verify availability and price for each cart item
+        for item in cart_items:
+            ProductID, CartQuantity, UnitPrice = item
+            UnitPrice_decimal = Decimal(UnitPrice)  # Convert string to Decimal for precise calculations
+
+            # Fetch the current availability and unit price from the product data
+            cursor.execute("""
+                SELECT QuantityAvailable, FORMAT(UnitPrice, 'N2') AS UnitPrice
+                FROM ProductData
+                WHERE ProductID = ?
+            """, (ProductID,))
+            row = cursor.fetchone()
+            if row:
+                available_quantity, current_price = row
+                current_price_decimal = Decimal(current_price)
+
+                if available_quantity < CartQuantity:
+                    connection.rollback()
+                    return {"error": f"Not enough inventory for ProductID {ProductID}."}
+
+                if current_price_decimal != UnitPrice_decimal:
+                    cursor.execute("""
+                        UPDATE ShoppingCart
+                        SET UnitPrice = ?
+                        WHERE ProductID = ? AND UserID = ?
+                    """, (current_price, ProductID, user_id))
+                    connection.commit()
+                    return {"error": f"Price has changed for ProductID {ProductID}. Updated price in cart."}
+
+                                
+                new_quantity = available_quantity - CartQuantity
+                cursor.execute("""
+                    UPDATE ProductData
+                    SET QuantityAvailable = ?
+                    WHERE ProductID = ?
+                """, (new_quantity, ProductID))
+
+
+                TotalItemPrice = CartQuantity * current_price_decimal
+                total_price += TotalItemPrice
+                item_details.append({
+                    "ProductID": ProductID,
+                    "Quantity": CartQuantity,
+                    "UnitPrice": current_price_decimal,
+                    "TotalItemPrice": TotalItemPrice
+                })
+
+        # Insert a new order group
+        cursor.execute("""
             INSERT INTO OrderGroup (CustomerID, TotalPrice, TransactionDate, Location, OrdersStatus)
             OUTPUT INSERTED.OrderGroupID
-            VALUES (?, ?, ?, ?, ?)
-        """
-        cursor.execute(insert_order_group_stmt, (user_id, total_price, datetime.now(), Location, 'Processing'))
-        OrderGroupID = cursor.fetchone()[0]  
+            VALUES (?, ?, ?, ?, 'Processing')
+        """, (user_id, total_price, datetime.now(), address))
+        OrderGroupID = cursor.fetchone()[0]
 
-        # Insert cart items into the OrderItem table and link them to the new order group
-        for item in cart_items:
+        # Insert cart items into OrderItem table
+        for item in item_details:
             cursor.execute("""
-                INSERT INTO OrderItem (OrderGroupID,  ProductID, Quantity, UnitPrice, TotalItemPrice)
-                VALUES (?, ?, ?, ?, ?)
-            """, (OrderGroupID, item['ProductID'], item['CartQuantity'], item['UnitPrice'], item['TotalItemPrice']))
+                INSERT INTO OrderItem (OrderGroupID, ProductID, Quantity, TotalItemPrice)
+                VALUES (?, ?, ?, ?)
+            """, (OrderGroupID, item["ProductID"], item["Quantity"], item["TotalItemPrice"]))
 
-        # Delete the cart items from the ShoppingCart table
+        # Delete the cart items from the ShoppingCart
         cursor.execute("DELETE FROM ShoppingCart WHERE UserID = ?", (user_id,))
-
-        # Commit the transaction
         connection.commit()
 
-        return {"success": "Checkout completed successfully.", "OrderID": OrderGroupID}
+        return {
+            "success": "Checkout completed successfully.",
+            "TransactionID": OrderGroupID,
+            "item_details": item_details  # Include item details for post-processing
+        }
 
     except pyodbc.Error as e:
         print(f"Database error during checkout: {e}")
-        connection.rollback()  # Rollback in case of an error
+        connection.rollback()
         return {"error": "Database error during checkout"}
 
     finally:
@@ -87,3 +111,102 @@ def checkout_cart(user_id, cart_items, Location, total_price):
             connection.close()
 
 
+
+
+
+
+
+# def validate_cart_items(cart_items, user_id, cursor, connection):
+#     item_details = []
+#     for item in cart_items:
+#         ProductID, CartQuantity, UnitPrice = item
+#         UnitPrice_decimal = Decimal(UnitPrice)  # Convert string to Decimal for precise calculations
+
+#         # Fetch the current availability and unit price from the product data
+#         cursor.execute("""
+#             SELECT QuantityAvailable, FORMAT(UnitPrice, 'N2') AS UnitPrice
+#             FROM ProductData
+#             WHERE ProductID = ?
+#         """, (ProductID,))
+#         row = cursor.fetchone()
+#         if row:
+#             available_quantity, current_price = row
+#             current_price_decimal = Decimal(current_price)
+
+#             if available_quantity < CartQuantity:
+#                 return None, {"error": f"Not enough inventory for ProductID {ProductID}."}
+
+#             if current_price_decimal != UnitPrice_decimal:
+#                 cursor.execute("""
+#                     UPDATE ShoppingCart
+#                     SET UnitPrice = ?
+#                     WHERE ProductID = ? AND UserID = ?
+#                 """, (current_price, ProductID, user_id))
+#                 connection.commit()
+#                 return None, {"error": f"Price has changed for ProductID {ProductID}. Updated price in cart from {UnitPrice_decimal} to {current_price_decimal}."}
+
+#             item_details.append({
+#                 "ProductID": ProductID,
+#                 "Quantity": CartQuantity,
+#                 "UnitPrice": current_price_decimal,
+#                 "TotalItemPrice": CartQuantity * current_price_decimal  # Calculate total item price here for consistency
+#             })
+
+#     return item_details, None
+
+
+# def checkout_cart(user_id, address):
+#     try:
+#         connection = connect_db()
+#         connection.autocommit = False
+#         cursor = connection.cursor()
+
+#         cursor.execute("""
+#             SELECT ProductID, CartQuantity, FORMAT(UnitPrice, 'N2') AS UnitPrice
+#             FROM ShoppingCart
+#             WHERE UserID = ?
+#         """, (user_id,))
+#         cart_items = cursor.fetchall()
+
+#         if not cart_items:
+#             return {"error": "No items in the cart to checkout."}
+
+#         item_details, error = validate_cart_items(cart_items, user_id, cursor, connection)
+#         if error:
+#             connection.rollback()
+#             return error  # Return error if validation failed
+
+#         total_price = sum(item['TotalItemPrice'] for item in item_details)  # Sum total prices of all items
+
+#         cursor.execute("""
+#             INSERT INTO OrderGroup (CustomerID, TotalPrice, TransactionDate, Location, OrdersStatus)
+#             OUTPUT INSERTED.OrderGroupID
+#             VALUES (?, ?, ?, ?, 'Processing')
+#         """, (user_id, total_price, datetime.now(), address))
+#         OrderGroupID = cursor.fetchone()[0]
+
+#         for item in item_details:
+#             cursor.execute("""
+#                 INSERT INTO OrderItem (OrderGroupID, ProductID, Quantity, TotalItemPrice)
+#                 VALUES (?, ?, ?, ?)
+#             """, (OrderGroupID, item["ProductID"], item["Quantity"], item["TotalItemPrice"]))
+
+#         cursor.execute("DELETE FROM ShoppingCart WHERE UserID = ?", (user_id,))
+#         connection.commit()
+
+#         return {
+#             "success": "Checkout completed successfully.",
+#             "TransactionID": OrderGroupID,
+#             "item_details": item_details
+#         }
+
+#     except pyodbc.Error as e:
+#         connection.rollback()
+#         return {"error": f"Database error during checkout: {str(e)}"}
+
+#     finally:
+#         cursor.close()
+#         connection.close()
+
+
+
diff --git a/Order_Microservice_Group3/app/models/CheckPriceAndQuantity.py b/Order_Microservice_Group3/app/models/CheckPriceAndQuantity.py
new file mode 100644
index 00000000..0f21c3ae
--- /dev/null
+++ b/Order_Microservice_Group3/app/models/CheckPriceAndQuantity.py
@@ -0,0 +1,240 @@
+from models.database_connection import connect_db
+import pyodbc
+
+from decimal import Decimal
+
+
+
+# def check_availability_and_price(product_id, requested_quantity, expected_price):
+#     connection = connect_db()
+#     try:
+#         cursor = connection.cursor()
+#         cursor.execute("""
+#             SELECT QuantityAvailable, FORMAT(UnitPrice, 'N2') AS UnitPrice
+#             FROM ProductData
+#             WHERE ProductID = ?
+#         """, (product_id,))
+
+#         row = cursor.fetchone()
+#         if row:
+#             available_quantity, current_price = row
+#             current_price_decimal = current_price  
+            
+#             expected_price_decimal = expected_price
+
+#             response_data = {
+#                 "available_quantity": available_quantity,
+#                 "current_price": current_price_decimal,
+#                 "available": available_quantity >= requested_quantity,
+#                 "price_correct": current_price_decimal == expected_price_decimal
+#             }
+
+#             messages = []
+#             if not response_data["available"]:
+#                 messages.append(f"We apologize, but there are only {available_quantity} items available.")
+
+#             if not response_data["price_correct"]:
+#                 messages.append(f"The price has changed. The current price is now {current_price_decimal}.")
+
+#             if messages:
+#                 response_data["message"] = " ".join(messages)
+                
+#             return response_data
+
+#         else:
+#             return {"available": False, "message": "Product not found."}
+
+#     except pyodbc.Error as e:
+#         print(f"Database error in check_availability_and_price: {e}")
+#         return {"available": False, "message": f"Database error: {str(e)}"}
+
+#     finally:
+#         if cursor:
+#             cursor.close()
+#         if connection:
+#             connection.close()
+
+
+
+
+# def check_availability_and_price(product_id, requested_quantity, expected_price):
+#     connection = connect_db()
+#     try:
+#         cursor = connection.cursor()
+#         cursor.execute("""
+#             SELECT QuantityAvailable, UnitPrice
+#             FROM ProductData
+#             WHERE ProductID = ?
+#         """, (product_id,))
+
+#         row = cursor.fetchone()
+#         if row:
+#             available_quantity, current_price = row
+#             current_price_float = current_price  # Ensure conversion to float
+
+#             response_data = {
+#                 "available_quantity": available_quantity,
+#                 "current_price": current_price_float,
+#                 "available": available_quantity >= requested_quantity,
+#                 "price_correct": current_price_float == expected_price
+#             }
+
+#             if not response_data["available"] or not response_data["price_correct"]:
+#                 messages = []
+#                 if not response_data["available"]:
+#                     messages.append(f"We apologize, but there are only {available_quantity} items available.")
+#                 if not response_data["price_correct"]:
+#                     messages.append(f"The price has changed. The current price is now {current_price_float}.")
+#                 response_data["message"] = " ".join(messages)
+                
+#             return response_data
+
+#         else:
+#             return {"available": False, "message": "Product not found."}
+
+#     except pyodbc.Error as e:
+#         print(f"Database error in check_availability_and_price: {e}")
+#         return {"available": False, "message": f"Database error: {str(e)}"}
+
+#     finally:
+#         if cursor:
+#             cursor.close()
+#         if connection:
+#             connection.close()
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+def check_availability_and_price(product_id, requested_quantity, expected_price, user_id):
+    connection = connect_db()
+    try:
+        cursor = connection.cursor()
+        # Fetch the current available quantity and price
+        cursor.execute("""
+            SELECT QuantityAvailable, FORMAT(UnitPrice, 'N2') AS UnitPrice
+            FROM ProductData
+            WHERE ProductID = ?
+        """, (product_id,))
+
+        row = cursor.fetchone()
+        if row:
+            available_quantity, current_price = row
+            current_pricefloat = float(current_price)  # Convert formatted price back to float if necessary for comparisons
+
+            response_data = {
+                "available_quantity": available_quantity,
+                "current_price": current_price,
+                "available": available_quantity >= requested_quantity,
+                "price_correct": current_pricefloat == expected_price
+            }
+
+            messages = []
+            if not response_data["available"]:
+                messages.append(f"We apologize, but there are only {available_quantity} items available.")
+
+            # Check if the price has changed
+            if not response_data["price_correct"]:
+                messages.append(f"The price has changed. The current price is now {current_pricefloat}.")
+                # Update the ShoppingCart with the new price
+                cursor.execute("""
+                    UPDATE ShoppingCart
+                    SET UnitPrice = ?
+                    WHERE ProductID = ? AND UserID = ?
+                """, (current_price, product_id, user_id))  
+                connection.commit()
+
+            if messages:
+                response_data["message"] = " ".join(messages)
+                return response_data
+            else:
+                # All checks passed
+                return response_data
+
+        else:
+            return {"available": False, "message": "Product not found."}
+
+    except pyodbc.Error as e:
+        print(f"Database error in check_availability_and_price: {e}")
+        connection.rollback()
+        return {"available": False, "message": f"Database error: {str(e)}"}
+
+    finally:
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
+
+
+
+
+
+
+# def check_availability_and_price(product_id, requested_quantity, expected_price):
+#     connection = connect_db()
+#     try:
+#         cursor = connection.cursor()
+#         cursor.execute("""
+#             SELECT QuantityAvailable, FORMAT(UnitPrice, 'N2') AS UnitPrice 
+#             FROM ProductData
+#             WHERE ProductID = ?
+#         """, product_id)
+
+#         row = cursor.fetchone()
+#         if row:
+#             #The price was stored differently, this may not be an issue with full integration
+#             available_quantity, current_price = row
+#             current_price = float(current_price)
+#             response_data = {
+#                 "available_quantity": available_quantity,
+#                 "current_price": current_price,
+#                 "available": available_quantity >= requested_quantity,
+#                 "price_correct": current_price == expected_price
+#             }
+
+#             # Construct a message based on availability and price correctness
+#             messages = []
+#             if not response_data["available"]:
+#                 messages.append(f"We apologize, but there are only {available_quantity} items available.")
+            
+#             if not response_data["price_correct"]:
+#                 messages.append(f"The price has changed. The current price is now {current_price}.")
+
+#             if messages:
+#                 response_data["message"] = " ".join(messages)
+#                 return response_data
+#             else:
+#                 # All checks passed
+#                 return response_data
+        
+#         else:
+#             return {"available": False, "message": "Product not found."}
+
+#     except pyodbc.Error as e:
+#         print(f"Database error in check_availability_and_price: {e}")
+#         return {"available": False, "message": f"Database error: {str(e)}"}
+
+#     finally:
+#         if cursor:
+#             cursor.close()
+#         if connection:
+#             connection.close()
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/models/DeleteItemCartModel.py b/Order_Microservice_Group3/app/models/DeleteItemCartModel.py
index 8c65687e..ae08a3e4 100644
--- a/Order_Microservice_Group3/app/models/DeleteItemCartModel.py
+++ b/Order_Microservice_Group3/app/models/DeleteItemCartModel.py
@@ -1,5 +1,5 @@
 from flask import jsonify
-from app.models.database_connection import connect_db
+from models.database_connection import connect_db
 import pyodbc
 
 def delete_item_from_cart(user_id, cart_item_id):
diff --git a/Order_Microservice_Group3/app/models/FetchKart.py b/Order_Microservice_Group3/app/models/FetchKart.py
index 5254b442..92b856a1 100644
--- a/Order_Microservice_Group3/app/models/FetchKart.py
+++ b/Order_Microservice_Group3/app/models/FetchKart.py
@@ -1,62 +1,51 @@
 import pyodbc
 from datetime import datetime
-from app.models.database_connection import connect_db
-
-def checkout_cart(user_id, cart_items, Location, total_price):
-    try:
-        connection = connect_db()
-        # Ensures all operations are executed as a single transaction
-        connection.autocommit = False
-        cursor = connection.cursor()
-
-        # Insert a new order group and capture the Transaction_ID
-        insert_order_group_stmt = """
-            INSERT INTO OrderGroup (CustomerID, TotalPrice, TransactionDate, Location)
-            OUTPUT INSERTED.OrderGroupID
-            VALUES (?, ?, ?, ?, ?)
-        """
-        cursor.execute(insert_order_group_stmt, (user_id, total_price, datetime.now(), Location))
-        OrderGroupID = cursor.fetchone()[0]  # Fetch the Transaction_ID 
-
-        # Insert cart items into the OrderItem table and link them to the new order group
-        for item in cart_items:
-            cursor.execute("""
-                INSERT INTO OrderItem (OrderGroupID, StockCode, OrdersStatus, Quantity, TotalItemPrice)
-                VALUES (?, ?, ?, ?, ?)
-            """, (OrderGroupID, item['ProductID'], 'Processing', item['CartQuantity'], item['TotalItemPrice']))
-
-        # Delete the cart items from the ShoppingCart table
-        cursor.execute("DELETE FROM ShoppingCart WHERE UserID = ?", (user_id,))
-
-        # Commit the transaction
-        connection.commit()
-
-        return {"success": "Checkout completed successfully.", "OrderID": OrderGroupID}
-
-    except pyodbc.Error as e:
-        print(f"Database error during checkout: {e}")
-        connection.rollback()  # Rollback in case of an error
-        return {"error": "Database error during checkout"}
-
-    finally:
-        if cursor:
-            cursor.close()
-        if connection:
-            connection.close()
-
-
-
+from models.database_connection import connect_db
 
+# def checkout_cart(user_id, cart_items, Location, total_price):
+#     try:
+#         connection = connect_db()
+#         # Ensure that all operations are executed as a single transaction
+#         connection.autocommit = False
+#         cursor = connection.cursor()
 
+#         # Insert a new order group and capture the Transaction_ID using the OUTPUT clause
+#         insert_order_group_stmt = """
+#             INSERT INTO OrderGroup (CustomerID, TotalPrice, TransactionDate, Location)
+#             OUTPUT INSERTED.OrderGroupID
+#             VALUES (?, ?, ?, ?, ?)
+#         """
+#         cursor.execute(insert_order_group_stmt, (user_id, total_price, datetime.now(), Location))
+#         OrderGroupID = cursor.fetchone()[0]  # Fetch the Transaction_ID returned by the OUTPUT clause
 
+#         # Insert cart items into the OrderItem table and link them to the new order group
+#         for item in cart_items:
+#             cursor.execute("""
+#                 INSERT INTO OrderItem (OrderGroupID, StockCode, OrdersStatus, Quantity, TotalItemPrice)
+#                 VALUES (?, ?, ?, ?, ?)
+#             """, (OrderGroupID, item['ProductID'], 'Processing', item['CartQuantity'], item['TotalItemPrice']))
 
+#         # Delete the cart items from the ShoppingCart table
+#         cursor.execute("DELETE FROM ShoppingCart WHERE UserID = ?", (user_id,))
 
+#         # Commit the transaction
+#         connection.commit()
 
+#         return {"success": "Checkout completed successfully.", "OrderID": OrderGroupID}
 
+#     except pyodbc.Error as e:
+#         print(f"Database error during checkout: {e}")
+#         connection.rollback()  # Rollback in case of an error
+#         return {"error": "Database error during checkout"}
 
+#     finally:
+#         if cursor:
+#             cursor.close()
+#         if connection:
+#             connection.close()
 
 
-from app.models.database_connection import connect_db
+from models.database_connection import connect_db
 from flask import jsonify
 import pyodbc
 
diff --git a/Order_Microservice_Group3/app/models/UpdateProduct.py b/Order_Microservice_Group3/app/models/UpdateProduct.py
index 7de6ba59..641bb7a1 100644
--- a/Order_Microservice_Group3/app/models/UpdateProduct.py
+++ b/Order_Microservice_Group3/app/models/UpdateProduct.py
@@ -1,8 +1,11 @@
 #from confluent_kafka import Producer
 import json
 import pyodbc
+from flask import jsonify
 #from flask import jsonify
-from database_connection import connect_db
+from models.database_connection import connect_db
+
+#subscriber
 
 def UpdateProduct(product_id, quantity, price):
     try:
@@ -11,7 +14,7 @@ def UpdateProduct(product_id, quantity, price):
         cursor = connection.cursor()
 
         # SQL MERGE statement to insert or update
-        sql = """
+        sql_product_data  = """
         MERGE INTO ProductData AS target
         USING (SELECT ? AS ProductID, ? AS QuantityAvailable, ? AS UnitPrice) AS source
         ON target.ProductID = source.ProductID
@@ -21,7 +24,16 @@ def UpdateProduct(product_id, quantity, price):
             INSERT (ProductID, QuantityAvailable, UnitPrice)
             VALUES (source.ProductID, source.QuantityAvailable, source.UnitPrice);
         """
-        cursor.execute(sql, (product_id, quantity, price))
+        cursor.execute(sql_product_data, (product_id, quantity, price))
+
+        # Update ShoppingCart to reflect new prices
+        sql_shopping_cart = """
+        UPDATE ShoppingCart
+        SET UnitPrice = ?
+        WHERE ProductID = ?
+        """
+        cursor.execute(sql_shopping_cart, (price, product_id))
+
         connection.commit()
         return {"success": "Product information updated successfully."}
 
diff --git a/Order_Microservice_Group3/app/models/__pycache__/AddToCart.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/AddToCart.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..dfcf3766997314f265b5765ba2be8285a807866b
GIT binary patch
literal 2525
zcmcgu-)q}O9KW+9=bYM3oV95aH;tO6qh?7%8Ei?{{pjLk3uJCHCu^H|Gm0d)N@U4B
z$w}-vqZ@nZN}&`6eHep2b(C(9hy4Mezn<k_h!GSDd)k{J6hfc&Jv(vgWP{PtoxVDK
z?|a|-+~@nf(@DPu0?i1@K>LZ*IFHbutg%%*o67niD7TP;6s)6Z_VnmD?V0vqrgJ)%
z=BN3p&g(+jJM9Hs_yJ8fDL9TI-oF@3EP~ypS<5uERF0`pRo2py4r;S(8ip#{No7XH
zn=`Tpft!PSeIDvt$cO9~dhbBTJ-BOS2^a9~7kans2<`CmD0qo0cy4b+w(SU7fh#~{
z9d#SDxP}(r&=R&=DgF*1-m9Zx1bi6xU8Ru^<jJcvX}I8_dw~_?e|OnAqJZf>K>ts^
zaTG^KkX>Ej8uF}nYldD#FE8<S%T^m9g%tRo(J!7mkjZ=XY*u4oYq6{BWTyC(X8Vn8
zw*udY#IQ9idoIAPS>nItUuV>{85Xd;cbgAHEbWMR&nrjl|Gy(zK#SZ3w1AJG*Ok8o
zv^7U05X*l(7K@L3J}HjHCeMh<jCnkM$;@Ol<KnPHZSmNYrP8rzpLmv<N>;X+I%R0~
zS*poupU8YBvXWtIb}rKV#p&^>k+^v5!#;6SBJa808iMPqBe=dgg6n?~!EH*bmL*+O
z^W9^%nieHRQ5DfPMVV2tva$@_sjRN&^1V^XmS!YN6;(=2DryGvPHHeLX`4wl;H2mZ
zBdjyuHf5-b890Ift?GVK%n$6eiKZ-PDFv5*#LBns91z(<1=xJ97lv6Tb(_>hRnFQf
z7|e89vt2>fO$(ZtoC!xC^)qK7Lp8&82{m<nMv~`T&a$cN8(EaqjIEhQL~wZpLaU#e
zV50#xvRyM^DeP)!wKy+lRho0LYB3rjE6=|hKAB+owi2V7k$^PMgAQvWnkmR1M3+mP
zR^}x`hA_{mGvcHwUouSHyqHT!oA&+%b*4W<%~{A-;tW*)Ao-alQwW95!=fiYp=LJo
zc0$Tz5@}OWbqgSsNs}$)@l4Kbudjo(xsj@rX&6Yd!^!G{WAqBD@SQ^UlYQMc6F()c
zHkU);wNTG$sHYg}EroiodMiBcIpB~(Pf74b@LJH>-@nW+pZ_Dc!moT;`e?$5pL5R3
zrMTjxW}UfQDV28yzA2JIi4+`CcuLyVNXIJaD3WlAgdGxo+S=iSPdP2`S2~fut%9&G
zT=uu!7{50DW9)kDYOK6xA2W8B{q1Z1gRB07MgO6a|BzFa3I{zK&%!YB`l$-ygu(6V
z2?;pC!Q~04K#F9jM1~wPRAvmqt0Y_`T_w`xkgjs;ey8J|-{s}QcT>NmKxNYMu0tB6
z()zOWHa0e%g^(Y@;Dr9|s>*M81v|lEkRpkeNYo+Gf8qC*)6(aV2B~;ofl(y{WPsU5
z#sBgs)~B#*zCYdnaTmJZ)iUbk?)MEv4{#5TV$dJF$&dQb!vg`(A0Ca2V(w9p*&nqq
z`(rGC{@BYg-8V2g$VCVZ0h}wObjg~d>>KVjDYbtU%D%a7XKhm-XKx`pV3M1^FYHBR
zFIsgY-$m=7BH9Vnb8-rXWOeledKjAQ!)kp66>J-f%P4TAdX-U!(<o&Wb{eIOPB@KH
P;Sb{O3ff&!5oY)s!fjwP

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/AddToCart.cpython-312.pyc b/Order_Microservice_Group3/app/models/__pycache__/AddToCart.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..bd1c0a1653bfb72c78ee6c043d7d6b69b87afbd3
GIT binary patch
literal 2279
zcmcIlO-vg{6rS;}?KLc5lZMoB8a4zeu>!bKe-bEdiok7=QW9!t2z6^MyK7iu@4B;V
zz>aB3RVj&7i9-)PRK2&N2YTy~B;?e~T6KlHr4mxqLvK)WsK}*n`~xISN>sHY%kSHH
z?|n0G=DjyRG&Iy97^MYo{1%JQJ^E1_OciWT0r&#RNXAJtPNgG>Q;u;5uFNsxjKU<i
zn%kaC)bHUMl9?r3!DVkY=}NiB-GH5+qH!*ZgRbAHdMJo(cf!y$HJ;6>Qcq~qP>2zF
zL)Ai~nmPkmHM4>q7mN%cN;cFd&xo3&$iii1LKsn`DNRr6li841o$s7gCOXqZPbiWZ
zx=3Uoh`p^!L<ia#RZ?Pa5<QcC0amS(bWH=Rm^>j>cUs;rjgOwl_PT?fh6kCu+NH7q
zLi0F}6SY&T&QY<ecgT32$vYCxeab4#GkG{yKYW2?s*<frCzWw_309^9BUr~>!TbMf
z>%eKcWVed*4&sH?Jo{}bc+WDAi4WNR(I$c-=p-`BnL_;&{NEYd5qW=}HJfT0nai_Z
zqOTl#w|xyKd^PQ!+}nxlk?YJuHBFwac~TY?OO7j$ZS(9$?6v<estV&QHlL}j3vmoT
z6i5BPh=c#X_dAQ`m@8-&pF~e{8rPoUj%QJgGuSYc`(SV=5`Jey7#te8D996fS7b_0
zr&VpTUnHh*nik{WK!<RN=yFCfDTJytFA=Du4uRSXXGG0}5)Ib9+jn6!91%{R?+~iL
z;48MP!eD!L8EnrkgU#<}u-z%eFvLkE*E(n_DM6HFD05R6B)SzNBT1l+XOhWmu6;l>
z#R<_+1ceZt2&zV{V=B1COg%;&dIZ}UrpjFNsHV)Nq0oV?Y~CZ}ptn3cC+Lzy8;tyT
zuAKK#hhRN{Hi~Q)xEVUJ-O8LIWlRMo^i)bUZKsrko@2YxSsfY-si(%yG*LCv=7^q5
zPKeU9%@`)JJ>fY?Nt>#!1)Vl4Luk9b3FZi`LAyoO;3~{=Xq7lW%qS#lW5u97MxbM7
zp}!|uZl6(TpV7y)&*&4{XY_IHGy3HA85Ps%XiArrqyd!jh)yrEE1k7lcJINcCQ^CJ
z<S1;CwjLt|&Gcim$sTpKt{-mwJbI(9<O{6%+6un5AARjNT$?Ozd)DHPZ*Yx^jW-*u
zBc03a^4NEcE9}a9h1Z9z$YpCxDnw)}p0K8~g?P>iT`h9?4X$~O^A|XOkqc~i{Z^pY
zYI=3+DB_z-eDmUkn-@MC`nmpaiEmlsj}`c1Kk>&m8N|2zc|QOqi@i5{|3HlM+&b4_
zd0$)}UhcOV&lS1u5@ih(xImG6uH-#p1v<Z#mQO6jzaF#vFI!D#i`>~Q??G!kxbH*!
zVanfG=0CrJzc;ML{vtQ<D8K)V)znesI<{N~l5YBd@4*&-kl~K;799I0eZIbKbgTPN
z7&Eu|&i;1hb~mQDhYhpnPCF0y&hsY*dYM%ponLLH^Q*m1z;`hN_%3@Ye1-{nh!^N=
zXFMqy(}X^Oki%KSX49fMWxF6P6iv2|gY2rLM;Fa!TB@<?b4yd2R!%u3zCqgn5uwlC
z4%Z7VnWXX>X@gJt=o+WsZ<E0o|AHERMgDuJu7sHD+yZyKX`#vTUM-^hZ|J3M_84v@
HC&2bEGAA$<

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/CheckOut.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/CheckOut.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..068db0ea825cd6c1ef8d542a66a5e41339032b01
GIT binary patch
literal 5389
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

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/CheckOut.cpython-312.pyc b/Order_Microservice_Group3/app/models/__pycache__/CheckOut.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aa7bdb081e740a0063e28ae61d22f4e633ced122
GIT binary patch
literal 4606
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
S&PS;8iFukJx+VBUi2ettxJzdM

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/CheckPriceAndQuantity.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/CheckPriceAndQuantity.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2c18b61dd7a30efc6bba2ea1deb742a13b691637
GIT binary patch
literal 3370
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

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/CheckPriceAndQuantity.cpython-312.pyc b/Order_Microservice_Group3/app/models/__pycache__/CheckPriceAndQuantity.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..83a41ba36819661015f476b957f0f91566c55176
GIT binary patch
literal 2444
zcmb_e%}*Og6rc6_+v_g~2`OKLLqkl8lL$3U5ot@ogeE{JBt=1Ptz~z>Ys{`QyM}<4
zHisTSYDKFaQYnd)W1<||zo0@2IrXv*RB^Vc)TrvAhf1d8P?1Y#jMqR9$t5H0%$xV|
zn>X*hdD@@-elH;7!L!)p-w=R5=*AkhGO^W0h#NozB9j3#%s9hP+Lp16+sMjh*ctn{
zo$%~mf^o;ZE$aA-8b%q@D=4yz1T85}43Vv?7YWh~pApzHFkPJFqx-F6WWE73hBE26
zzq5cv)&q1lz1OBJsc6`Bd)iTE?pZ`e2b0YG@--Mhv|M|{|3`7?4t!I0B#8c^bJ3-F
zEM47ozwFhbdk@!E;d*qZ?j|2IodAGPp6O$N1n8E1(K`heeY#g<4-+u8M)#$C7V7RQ
z+I8nmAUbZd79#Q0D>`3l<I>&4#=XzRhYyIJw0{@bqI92yOmMwjgsppZI}VYE1TCH2
z)ru?eg2iDH`<LpBf>9v)L{9YIvb|2sBR~sTKBcQHYIkh`cxaK+YAlWz(7Bu7b|ovM
zAbny`J7mdq&WZumqTUL&E2NMYxzD*TUS}*yh;z&wxW--qbIcL&y3pr<g&7SEEzEl1
zo-rC9i1%EAALn>kleGEnSzgNU6B+atyev!FFqQ<gPrq;E;vgKxikK6$US8w(3CH^5
zBXLXmQ7=3T->=A{cC(7N(34lo=b3&XhcS}1WR@OfdMYZWzr;xj3XuyMc9VQ8G>;+3
zXO)aHB`pvaCvqCpQV0_!`4l-b4;R8v($I_wD?l+!ALPQxODP0PkTAuoP)PCe6cS^Q
zvdcb{#gYnTWe#pLv26yLt{J4N{1ob2s48EZNHsXA<YX}xwUzwBT<HWFj|pBy5Miuf
zD9Pj$BuppEu1FaY;3O}LJ9q7b3!(iMoiNH_+OJF}@kmv$=|b0#kkgRqo<y3EQe=ef
zB{`qXB3U%;X+@GvhmcWJWID6+iZ~&djyOHubdbx+n#rmfj`~e+b|+^^Ni?f4x|&0(
zhQ!@G1kklC2{U2sB*JRJk|JZ;7)%x`bC@<=OnaeOvoCK+ai>F@2lvBN_<oGktRkx@
zDUu+W?s8C7lR+wl-&2tgZhzg=nYgSXtS0&-IYA0>me3@4P?>}(t(W;kw>Zno0utdE
znt+#(kdkRt%qRFVzkLo(w39oh$)yq(u}A=tgOY$rpztiIwB$Lg<gy(J63E1iBBG3%
z=%L9Pre)YIi`IjPW#`TMm!%O$i2JlS)t^YSzYd;;>%ObMe!ggnIhqRLy2s&2J{(yO
zw=6je?!Zc5IZy=lTCV5@!NW_RKKIx?^+gT@YgUwHWj)Ze#6Ix_3MV`AT)V+F-tj+e
zIevF=y`|IOnx8wt(e}Hat-sl2aFL=Dw7y$tK3!-yVRXdv4RJynox}O&;Z2XDA+R)9
z41n4<mii0T@J`*M>h?mY_D1mApb_aYdOtCG#*DF)0i}&l`gfwx^r-q&MPbAkO&KGS
zA*BsCy%EYh3mz&QkNt4w-kBf!*N>n5#{a#P4;>?Bn+E__Rp6>t29^iD8hYZZDR2iL
zbM<+y{ui#X$O7(Qu^L2LjgE8q>i*5ZtCatJ9waI&UCUkn0GnfgdFu8Xp$}HWtE>^|
z-EhYX4H4s1_u7$F{=w1JTI0m|eDK1C`@*L4RlqNbL5lZc)B7sTZS^$C<5wTH^*X_W
zdOMldoYnDGcI|LuJi@NM!%+H+J>CW$MjV8G*veA6t+g-AMxACOsioLXEyZY+(^f#*
zSLsiNJ|p_FaW$DtSNXY=9&@RH?tv{L0Jxb<+wLxclFOj?a4Xr;UkH_&6<LO1egkj+
S3jBY9x-IufrU@S<{Qm&Hpku@U

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/DeleteItemCartModel.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/DeleteItemCartModel.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6b50ef983e2b2f16ab5c1032f617e6d044bedf8c
GIT binary patch
literal 2612
zcmcguU1%Fe5Z=@2thFu6m49M8vaRz^3ktQ<&{CH)vE#&&ZE7ntjtMaWRk}MlXP@rW
zy_01bxrEY(G!2A8A*H2|Czs-vK9xL{=I5m^CnK;p2o(C#z6ngg<f*eK$+qmY6c=~3
z8qLnk&U`box4Q3}ni>#{U;lV3@e_y8?{rZejtaB$CNK|>h(ty~NoIjzDDO}lNp^v?
zc~)^QI7R1YXn_;iITYajq+0`w<yz7;RZe7qZ4fk7l>{Ry#=}C@H8q2<h=uRYH$Wet
zdSozETpk<nvsqoBbw|$e@PKwtfezWRBD3zyu@4W%*)z^Lb126o92=nB+_PX1_@+3H
zj9TAd$1XXmMxtZc_CU^wtmu@P9820DF3su4IO4}a+9Bq@vYkV7NaV!2lZ`Nd4EH|l
zC0CUnL?pJ(8Q$s|A<>oNzD3_THlQ1udmXWBSif(z&mGPks)c1naNLBWw9b9PooL<c
z2pPs`+sE^YjOzb$Mh*XWMj5oq-b5K@0M6veoVyIF#t1Zq*TyG;Gr{XYK6LHsEHB2j
z;kjE{DkZCnS7OBAZ%hTR1^IbhBGVK6MShGQ4^Qw^Gi^x8vgmz6pB9Ug2+_#e8&tuo
zn!zWuv?}r%;RP+Nh_)y$@uH+ih9p|9q@?SyMQN?e-cS+qdRh=bkw_~_b}cXwGh*?W
zF7dW+UREpHqcQ}ECWw}d3V`K2zcz5lR7?{{fv0xmJ+h{*y)&;$t0}mzB(dUA6NEG&
zu>1$tuOHd<D(8VlLN5@j4jk$lv0T!sB%}=q1X?mF8x|&71}dQ%7AGj04vJJ(6XSx#
z1!>_dE(M5fGewEVgk`HfxGG2~1AqtWELR#@5S2yCO%pEX53A}03`PXg@Tba!w98Vq
z`Zz6-ti?!r9q4&`y!_(I`3UW)9tp{6WL}k5fR~LduO*-ZP>^h7TwIB%0#xRP6z8u?
z!Yx%(w8d;BR*?^7r1(&ZXiHGe$W<bOgXpX*5Xg+I$buA|Bw9N4b|jWcMUonz(jyag
z>uI~`0h*=4;Z)XYuRyNtDd_~b^cvMag5z}?m7IN?|9QLr%g9%eI}JszZ`<3y<?YXV
z2MgZ8J9VWx)Gsq8?k!@^ea~Hw*)jB^>ruCPHk8Mc1w3iuNieBz-Ns#8xGRr+1?)4i
z4`l9^dt+b6wi^9rqrceZGkbz&YpB!@@)Ba|eMNW6{h7NnpNH>-?}Uqu?NsP5x=(Gp
zySLokd3SHY-D}#j#Db<YfV`(o-@9h>NU8UjK6YRDDXI%4<m4_f2kCR%WO^<>>H`8Z
zk4Fo5)WoB|;g)Ue+rqv)?kV6N6ZaHf>oB`U&E_!^*UVDOaWU=g?!IV6Zph!sUA940
zsSRrC=MPQK6wExHF5qbsPyY?5OJ?)9iEF0agyR$&FzuFFDIS~i96vWb3@7c=@!rd0
z=ob%5=~#29lYQ(7Oq^jKk1&*f&l&QeCuf>~e=-sXwX#onDu3EX<<D9<;GcD}l=q#T
zY+&J`<q}FvUncYg#5!Gm2!_SVl@_hMI?*SWUL2%}5_;%=Ks!JY=>YN)Ux0mSMH(eN
pu%v&=`UgPZtT9Xxb(yuZh|Za{vxu5*+n<tifbo~mQ9`=G-(QGRbsGQx

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/DeleteItemCartModel.cpython-312.pyc b/Order_Microservice_Group3/app/models/__pycache__/DeleteItemCartModel.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..a2ea66674acb226f5185fc19100366ff091f702e
GIT binary patch
literal 2212
zcmcIl%}*Og6rbJo;suPsID8uLVy8`A2~w$Ts!{@RVv`^NQ9@`GWXZC3*JRCl*PUHs
zY?)G3J%Cy%haOU?>K_ns=@IpmCgjx1(z?RkCQ_xIdNU=53NC%)kJ3T~QI$SvXWzW{
z<~Q$aX1;4_X+l8f-fv5M!y@!6nbe7{F?+8Ab03LFq!g5*<|&Hsv_hwtd8WcMif!H|
z+CD+^Y>o-AzmbIj%CaYQO_dWlV4DO@RVBfQit!nt4ou8oQ^dfx*A3%+)QAj<hzV^}
ze`tj+&`Dx*g#OYqBDG>GFiC=SgbKC-Do_b}qqZl70Ly;F2&Q!`&@)NyxL%|eUqc87
zL`Jm9RDr>5VAp)y?r%6WcEMgJ+RUO^B(h?|%SH4f!%_Dv>8x{y|Fa0+SYZuUT_V~G
z?3d^(dZU(k3a!#fcU^n<Ka35sz{!+A-+@M0VLxP7UuHfkh*`=wQ{VZRzm5OF-=_cD
z-z-{Y?w~B?M=z3%)fecFEUIG$nrHICP<SeQE6h*aygto~acy|^u9i;A>cW*6Hu&4u
z!Z*YGoG#(X5Py*$=YumLo@gcwDODA{hshbRSP5ed=U*iXUeydfp=DH&*Dx<=8AYs!
z;u0@PieyNlWlu@E9$S#|J(UGDF|TI?0ThXhqU7>{P|S$MW4gpwuz6XnEsx5uNi>1A
zR8#<8M)<t{h^d&t5CTu^s%vCT&A&CLO3P`uEhMpqs0l&_W0;-*{mQXb{{|jt#x|0M
z1_0DGY}ut{Nyr!y2((m6HY^TnS;&NHSgfFEIw;aPO^gc`8zzaf*fe-tF;kRyOjxuU
z!^?t{Ho);fgJsV^38J!SIY_|O_+eJR{=f*6+r{dvCbE*2s?`S>3Fj<I(i=d}S7`s!
zD<ct7Q#~>vtC2ZXUIJb=a=ey+3P3_~k)XH~Qw7M(Z7I&*l7zderf3VfNUSCw%1ZH}
zG}e-k&d7Bv0zh<H7BEDHmt;YTUd37_{bnSVPDfH2c%?@|mC}=PlLne5!r^qz>ZrN=
z&zj<HaF<-X`WjpxAEB~sko7+8@O~ayYbv=sJ1*b0%lCup>{>&)0r_Og<OWKd^PY3v
zX?6{LZQtxO&rcM&tDtOj?{GcaTu+hnz|7HpZ+w0Hi`e(g-qIP5*&jCD6T3bTmq0VM
zKK0qmPt6@AN9T^CZ`;xLqhp}VAV+7}k6gW`=YrY#&hEfz#(zBbl5IxUM}J2)_7e4!
zYcbp2-5lI>o6d_xZtNGXeTVaGbDkpCUux?zd&bPx@gg_A+kP7I!E-lqbP&|bRn*YK
z8xOCT&TB<(@)+tRvo%=cg1aQ<6N5V_y9waIuJbg@eSHQh@^P^JvLAgr!oc{*?+$yJ
zM;8V|H1oKN0{(HgE$l;Ev;+7p=U}*(**Z_;TW=8glU^41Ctil|zH<|e3^X^JP-6Nb
zCQq?701Y!-ZJ1%PcKoBYN1k*!Ib^tn45UFGpgkB7?t)>T8-;ZlMH<8XFeQ(UPF|Zb
XLs8T-)bk9z{WEIWv-v46?gROs!3qri

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/FetchKart.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/FetchKart.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..49dfe5ad4e4c7b75897d43f9643df855d83590b6
GIT binary patch
literal 2282
zcmcIl&2JM&6rb7kuGh}SPM}HnGTtU>i3tHpkt(PuqH$=Wgg{9UA~Ld^-A&lk*>z{v
z7>9MCRSzygqLnIv)Kua`RdM0aL+|7dSR+@gRz*VUsp@4VR4L-rH|scG^iUx&o_+J1
z_ujmD@69~V&+Y9|1nq;r56{kbBlIVov>LMtUW@~{ixi~b0-B~HQ@{&&8e@vt0<*wQ
zv#;P#A+*3va{<4(j{62p^9r6sDgG~NdLo5ALCIUHr7fs{qq3pvs%+(y8JLCVO+(ja
zD>7bngANh+SomK20nXipskK4+00a-=Yql!3@%;_b79XK4dW?drtj*kSg}bf@$YyOc
ziywgO;hG#H(57Cz(zaL*&7mr%Fjd|TWzglxYS<3XhgypOb1l3Gs44)5Z*c&JH(+4{
zUR$-r8qH16Y(Zg{!qte)-4718#cz#v<N@U6;aYAW9^Muf+rbC^_LR-pyb@YsY=*oA
zakjNqZ5%hp3F|TGf^7dU-AOcw`jE9_-QGOx+-&`boT)~wL~D+a!r9Ru(ND})j}=}C
zYglG3!4<4Vzl^>~Z<{-maT#4>FQGE-gY$ngxhbR89w}jBad2{Ed}Me^+Ap0xfA)+t
zdBrFeHGOV4Pb}%;rz7V_qzk4>Ml;e0=_H}IGZprtR61&@3!@p2Z;HLhIbtX!*#cJN
zg05NTh$gF^NHsqz<#kK5DqiH2qNqv+iqVTr8CJePZ3K!b#*4I!nqD*z27<+Xpq`(}
zo2sM|Vh~Bwr8(8gmB6W-490UB*f5Vv9v8?LW1IC;aYBp1<K+@D4dR8>YpPrV2ZUMG
zlCR_o1wt<rp?8?jVj#2%2)*V+1mf}eVo}u<kCO|Asd{{|Vkk4R$Bj^LJg!JI-Ac82
z;lLqHS^Iy{44rgR1KbxSl~lYCG0G6xy31Z$5M{2JC>F$CN0UP%%7J0XUt~?+!>UO=
zmDbzKuZE9jY5L9VX-&^U)~^DFL`%l3WR?g~E7?=Z)x0jNigZz(k)~Anif$B)xk@&_
z${#ALGebpU%)?(|_AF7rK<<nt6Nr^u1rKtc5TjIlKMPsNE*OehfW2tq#vt_vixqGC
ze;fws2S1O(XZ{Z5e-ru4J6!TvSMvMp57}DO?cDvev-e47Z@sg>(b-?)pLd+7ajp=%
z6T21ru5_<_Z@w<18bZnuQa+D5y6@b$b)z1a8gZ!>0!H@^u+iO9Yjd~v_(+T#2uN+%
zP4+gDhaUC)I#f@dbi_T+_rATPySoxg``v`Jbh$~SzJ_$T344$Dabai7M?h+${x;O!
z^HfYc5fk^cx;W4f2OM$06?>fBgLQGRHdY&Zp4j*3x)UFU?#Gb0%||%0+ZDIn8NW6D
z?ZoYg+JxKIMVU!g?0zclc_Qwqi+da5UMJ{23zC(8;;`~|+D8mGxK5r4?N02&-!Ks9
zbs^ml(vFaJJ9?a*DJQ<)5jJ(m!fS57va;gGVQUyy{OIdjF%QG>e*N*#Z~{F}#52d(
z#|OGHN7-eJ0WUM5Od2g8<tRSJQk*_CGRUUF1YUnc=&R=KYTl-U@H7YIom+jEY25@B
z%gq+@=I4YyM8Spn1-$@>NFR`wLK>Er3hGBB1ylOSnAd?ojxlyo`_16zqJ*=#yXZY<
fbN8n)!bi3+U9{8L+}CXSp?7i8N3Rkx0Q>(7qxvy7

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/FetchKart.cpython-312.pyc b/Order_Microservice_Group3/app/models/__pycache__/FetchKart.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..8566e4c71881890ccfe8d200cc358919b41a2a62
GIT binary patch
literal 4020
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
Z2AR;8X$CRheuBC{{hWJ?36Xcf@V^oFl+OSF

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/UpdateProduct.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/UpdateProduct.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0f082f3afffd6d6841c67b79084642a7a9d1ab45
GIT binary patch
literal 2984
zcmcgu&2JM&6rc5a?TN8T9H7(~$ne$1Gz3zhhXfM2$=XB;PKuo(QcKomcMS%|Yj)T9
zl2f6ol~RO+Dplf8RpLZbap6xue4W>kC9IW@kb3H&(n<&^;?y_xdYuoDDi9ryXWzVe
zAHVnB%<lXV2>1}RVsBrT_agKcoiv-vCSIKa;trCK#N^Rb<H<}hFn8r$Gwc-0P#&9i
z&u~*5(C#16lt*HcD8l_sO(Y_W>Ak8cg<N(4NS~+_3bLqYq-l}0UC@UI{&fCIh4Bt*
zLpnp*jdl+n_nQ;6#7az=%{c32_HGlbBSVQzT5id;#FgE5*L!v3%Ul_inX)U(-UD0r
z9eWTEyX1MNmZ$70qpWMQ4j^(nrq>Z05z%BxT#hNb)t%shTPNs{n>EU;x(lrTC)p%Q
zqC-gcJI2seC~~76Myj;r)q~ABLXxNK{SE!@x(9i^@8p(2;H|AC)uJ{dle|p}IYx9{
zf=#jH{oeaAV{3SrWAvRZRBwq3e{fuF4GaHwTytoiy@ckNL+E2=aSk<oM0|;u@DG&T
zN9=Z<zYyoiXd*RECR9Z#iTa433nZE(x}aW`bw_YAIhu%*?j%3P52wfwm9P~?M|v9b
zZ%RTz&*=-%Ss|Afrt`ARpDg6`2{k9m5vrvrB~_FiyW<JlQ?Fx=oVA5oEJys}IX*$o
zM^nS+_z{wViL*ijnw%Jkrg)O%Q)CO6menmwJ;Z_7l5$v%hq~{?c*^nr^(B&uLjF=)
zk&Gsi{Dl<hc7p2JifEnNh~tEY@ojW$l24NEMygs_=xOHVEfLtV4(iB&V{-93hioS3
zic&1*3YUikwN+u7HAfxtFyv@K;1~E-xi_qtUacgGvZgIY>{v;zkX6(fLC+}#QYuP<
zE=$A~%9ir^h2F)_=q8&MG?~b%s;ERNsepzQ8#~Ze>L(^wUtSDP7UcONd``enLqQS6
zlB&v5KUwVDyx317+f@2uHhn@#S43rICa0SoP|y_B^vd(HSkh%+G!{59uV^qWE-3J^
zGC7_iGPxok(oL)?`TVpXUNhVHc~LIXm?GHp*+?@v$;8*~ZC}?BW#`)mqAGo-njPBp
ze5R=Z=@85y<!E*hG9pyLWMmD4FfBiAZ+;r?Pfu#Hs-<JOLK^Ba3p5-qqGTbN5c@(p
zD$NQ75pr@-o+c?-yi!o|%H@T$VDpd7$<xQc?^VcLdR&#jK<0c-R3Th-7LH>kt}3PC
z$+S=`re_pM&THw(dbuVVb?7ZFn1Kx(bq_$KmkBKf-_9Gza(%&dz1Y?DOZwOJvad#t
zEc>c>Uo9AZ9z3`jJXi@Ht_BY;dn`}eKEHuKwRWPm_S@TUZZ~#+zH;=zm4}=WiB)jC
zisJ^3TOK!+3Ryl!s(a=1gQLdLvlTp8#e)VOe2F`s<IpM&RdBe9!v+r5IzmP`X0*qx
zJ;>i_A*L-{^LO4JyE*oA;#OigQQNkQGP`R2PoDetuKM>@{QIl^{YJf8EUc`(4uj^c
zGZtdGIJ16yfdj_&{s-4#fL_4^RXkweff@x7Ud7=G-Us0t5OK$DBg8*E00ZsqF#~Vt
zR>%8dTU%Ru9YlVJf#puNhB~t2D^X+nap)C%qKZ!#_{2Mq^{og-sE_vcFAcn*Tb>U<
zW(5HhAY8Nj?{7sr2m9%V=;^PIphrjAV{Z1*sh*J?>|??J{rG@8=0#6-1b}`*diWvs
zsh{$n1}OjO5C`-#Hw*ML@A24IY{YB2=`B<ZfKijn<^}B<y=o$JPh*Go((^~(JQ@3j
zN>3?$S=6`opXe2kNDaa82A=_yQeGZZ2~6o-NlU>1dxl|NqHQ<ozZweMsQ+pxWNhp&
UQJ=A~Teyemve4E+?E=I90`!C8yZ`_I

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/__init__.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6c0bff2668c74bd38e94cb35526955cdd4b9a6ab
GIT binary patch
literal 554
zcmZWlziS&Y6n?UF@ek}|bki;#vUo@dWD6k>0(O@sP&*WiK%7s{$t8EEL+5jGr*jEu
z=+v!ir<T(GF;2)}Zf%!thHRNCCC*^_cu()sr|-Qd>3gkK0b`%GRtJAf{%to;Mi=1j
z(ts}@L6QJM(j&y;LQn{4j}j;V5@g>9z)us8)^iL?(OG5*Ad~dGU^V&~I$u{7@}(r%
zum9@gN(XE-i+`=QNphzZxXHNz?BM84Coc&Rx_%@?*Pco2rzeNaV(tvAO52y@l?N<5
zr4!98VQL~bL?LqO#&J${8vTGf+y6d0*x|<s>V&uah#yD($Y6gsZm2;cNwvl?-<Kmd
z@=!M3V!zQv?=(_@IvI0!!Ee69{${Mz8G1v0q@`&fUi+R_rtQf0P_(s5<85w6^H50)
z5-x-v`9mRI#^d|at|8L^_w<^%kp0+XXqGu8gv_8mUG^Egm@fOg0>x^ESFa}OLS=LY
yEMr+`Qobl><#`oY_3Hf%U7ynR87qEle`tT+$lBMee#`39C!bSb&y7OY%;0|{VUn`|

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/__init__.cpython-312.pyc b/Order_Microservice_Group3/app/models/__pycache__/__init__.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..1a6cdeed180b8b57206cfa994f5e6fd4dc67512a
GIT binary patch
literal 470
zcmYjNu}T9$5Z%r0nHUl+EJSTmSeQZ)>_h|+jEx4=AcTeGay!w}yW3+g7dfklf?{Ro
zH;Dd;ognBzDsAi{=~B6?2AyK(&6_uGhj}a(^GL__;#l)t=QmRfgZzTNr@<`}NMH~7
zxQ?;G8873LI>9J|00X_pKkB-rYXa7=#t5h&$8!j&39yceL-W5Z=)*sCGLnpxvmd5i
z#;LX8+0n5EbiKN>o8~z8Z8zY2&-4T|;)CsSHno~YrOdu*{u^^gsz^~o=$XLwf%BBu
zVVDvX2Y0A%{0E)&WmbzoMQp<jSS@hd8oRBeB%7ruRtgffCfau3fGF)lqqGOkVIVzu
zkTCm~pFe@de5m9RI4xFHLL2Zc*HKd2wp|B!Maei^V)|?5O95WQIClfL#rZ;*400=)
zj6GOY<9Z=;!f07PJ%TarqRB3r`OKqi;cD|-cE~HDo!yJkUIEd<)#($NdZF3N%30-R
Qwo`eglRbjyv@!?&0(e7y1ONa4

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/database_connection.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/database_connection.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..0182aa2e0e05b5c37bf5393039b145f0aeefb1d1
GIT binary patch
literal 791
zcmZWn&ubGw6rTN&ZGI3#P*LM07tv@Uh@}T(3NhK*(wfF>($=yNHanAcYr4D4Y+4et
zkb^h9dk{~8BK`yZ2_7SO2zwI5gSS9#J^6N%){1YL?|a|dd2ha1_G3IAMG&HRul=4!
z=%+7E19TA6OF(ZBMwsiMU4;3UXqUsBf-=Hye?vtNw#^{|EWn!X06-V#LWj#?!R4{&
z3OF=CZxNOT9N@x$2MiAcz{tCZD>~eK3edq>J`g`Z{`pM9$<azbRhE_Y`erq^QK~Fe
z7iCp>x*_jWYqFwv(k8`(vi?O(*mK9Sa~<7WvKNWkHcSuoua|3UTXL=N0$S1vp+|(e
zc}1@IwSF{TF4l{Wii%w5hw_cJvQO1*psV>h?J|epX2~*5qC19V7J7u`GrT9+Jqx#V
zZ$Y2E%7i?L1(Urn)*P*+G2(^0P%^bc$ZU<VV~b)hId6bjP3BO;++!iQecF$cSEUDP
z1A3UcVwh^fG{7k{oL<^$r&*U$(o>80NHcYU)7zw#t`mLVv^v&aPu1r2+%ak8Y-$~V
zUv>6bnokU!TE06&C(Xyy>e}~J&9>D;3zH60PyIIkTDxoayy#puaf@C6i~eFZz!3e2
z-yW`v6IX_-<HQXglEc-Bh_0>kU!)20d4^waomZo0+COsNJ}+naNWA<jmVCWDO5OPu
z%YKh#M`CsgXQB*GC7{5`Cqxr|9tSuHKZI*^J7k$ALHa)py9qE6IF1{m_%L`TsR);w
Jp#LEl^ashQ+j#&0

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/database_connection.cpython-312.pyc b/Order_Microservice_Group3/app/models/__pycache__/database_connection.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..f93efc54c77937369eb7735c897e3beaf7600747
GIT binary patch
literal 624
zcmYLH&ubGw6rR~6+mg7IR>Tr73to&i9#kqA6Nt@5#hS)!s!|q~&CaxLU3Zq5O?B4<
za_}M^JbDoS0P!Mt>7P*W67VAHrJxsYLT)|zHre2V`QGn&-(%*RqT~_C*E37I7cfG<
z5@#+_YD`wZc#jAo*hM>tNUzZj4sj{-Cn;#zY1vfe05fnVO#tY@L#Q8Ok{O^6h-3#C
zF!wPxlmeJGll}Rec>wf4`kdx<RFYd!v7zbryIbw@=0<D1eO)v3hnw1yc1P3oSl;4<
zauJ<xbnZRUI@MQ@Q+3J@C?8gIt&_x}e5FzE)^FE!ts1RXy1Xv}O3V%BdDIRZ=2b%~
zDkUkF{g9EK9WU6kR4Eh7VtQA+NUXr>S%SvPX%hNO5pc)b6Uol1s-C>HZyMXsAdIHt
z8QY!%EQAw;D%({>pK}@-b#h>NHYMs~+EcsKe(Euo?S+Pw#>+2guk3TS56q0&Zsr5W
z<}Bgi*wnnkS>L~ASiWyOXN0=Km@_l~6T9MvaXxiT(&Ggnn1v&*0*uhHa%t53ar)fo
z?s4(Pq5S3LVRUrys5sW2jaS`q_U!M%^1Irb+PHZ6dtq&yU7J7`DoH$f-|1bS5I>dJ
j$@e)~yah!1F0Jt;aFdr43c%kC#`q^vCh`I<Ps{%Sq_nKp

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/__pycache__/order_history.cpython-311.pyc b/Order_Microservice_Group3/app/models/__pycache__/order_history.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..6d67f37847aa86ba827df45fc0307810e84cabcd
GIT binary patch
literal 2437
zcma)8O-vg{6rNrGt?l(M2_+<eF(|34KniU`XlSYy2%#k=0ir08BWu}Rh$G{5XV(y_
z-6*OW$%&BCR+XSqDsf6%<<eu1m6F~Kvczgmk*XYe+bF3N<<h=cFE%EZ4C^;<-hA`s
zy>H&m@=GWbK+x{|_x{2eKSF=g!ER$6<wXLNbtEB)$)l^ZXY<SwdzEF7<oXs}bxF)D
zO1b}`@N|kH0Z}OwWKqjX^CClyPUE3>!SBT_@Vt)vNZT{}5GEcuK!glNXEyiD)+f+D
z9ILaNyKy!^ph=957MO=H_ozP4AVAXy-e~*0x&Y^X0|bU<9Qb424wplQTX&72YZHb?
z_hf>Qq1W&koZ&YDM$q7mkP$W_MpXCe?qvq^x=-hHzaG$oi@^2+u<G6s*q`=?>VZkF
zhQ8^koA)R>uZQ%o9?_$c`+?^nF#4#@DudR}X`u#KcW?R{qlVU;bF&X4rpIPc57MFy
z{0*q1TI)r4!ieiEKJfN@0`@IAl|0(P-JO7$cynYqMr5x*ts3!L@mZ%|VOG#h*A=wF
zq`YZi6_^Ml_O#jYsqxXdgtFK_jU^dRV5L-?96L@8qa{^SmSpS<=de&v1yRc>g)u>s
zZOD`&3e;c^YzOMBCTJzqHq0rSkiUR)A_eDa8%%2QlI<|pe*r5}Nz|Otr9w_?U@w-0
zf|k=(?S-}<y3n3)3jgfP^!Y?1atOO=dNQ3JpGkZ%J(;e7s1pb!F`eF@apIGDhz<u$
zjxL`YpBZl^1y+38gqfZhgUvp_LSg&JN{o%qj-F0=NuWV0iR=RrZkJBN@8yyN8blHg
zO+m%<0!w*F(8kp`CH^|0#9wEVaJy8Ja5Im@BV(-KR1nkKfq2CdRuxQq@=aMRX)@s!
zWKFy-<nzQM<`q>YUZGf&3leeXbE-zX%R;^+tHfJeRp8Deo^k4pxKs_NT8OWt$~c>o
z>h~fP369Zyd{`D0EU6>}5-``nnSxh|w`M2dnt72HB6ScHoie0@sMaXLtOQj^xV%$>
zjz2Z4+67308m+!;k(S@?UOC{-4ysryJzFn9;W;qwE2r#WBYU;Ipyndp6mHh$fRWV}
z$Z5~(w5z_pGx~An5^$hq&gKdkIF4n|p`a7WLP9NJEU#uhla_^oC`*aU@_b@W7OxkS
zyt25O5gdEpiag&3k=}sMN@kjprDo6PL=0zvmm#aHU8o;q;8-$CiX`XNOjC^g#Z}T`
zA7Zx2j{6~Idef_a!EJCGS?ozq_p^gt-)DZzlmlk$@J=kb9ZPP-daJSCve)t=f8>7n
zUf4pOwgD@EK0N*Vd(VR&|CyHv1Xw{tQOlwA6F;2TiuY9GJ!PNCh41tC_`Bh?a5-#p
z@g1&hn`_(R+N)f9g=+_&hYpuRW^0FqTKy4Ql+Rjjw7}-s=Lm&Fww&JhvXUD9<J6zm
zDs$P2P^c8Yw&+K4f`x99y-2%RR%F3fv~%-XB{B%l(`27{Y{*Q!YxWM9pm%gxA>TmU
zLLj~iZ4|bmebxaKYTxLu@~K~sRr$dket4T7HoK0S9mnW%q}NOiT0!q=$QQ(O<PAk$
zQUOCp{2ND|$<4l<<jL*i$*tt6YVy=p$8fb{7&0>>-4(9;)w5u1Z3I?$x*OtYFlHgf
zf7s;X_owbn-A%8h%V{%skQ%#8zIBH`vdtga;ybH+XNB)HqwoCOvT^aJ)(5SXNTR~+
ze_lbeLa+n$Y9}1$H={kHN73V>k+Bii<BvwhhFnhu7|@>#c|fMzxD7z0y;dsy@b(Dv
zf+}a7e_ZGbN-qMtI(|bhKt;F@#A|K@mXz}H89WF>`YBb1L0B$^VN4XdZU32Qpwj$U
O?jZ)Ue^cNASp7eUlZxK}

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/models/database_connection.py b/Order_Microservice_Group3/app/models/database_connection.py
index 1e836b8f..5b439259 100644
--- a/Order_Microservice_Group3/app/models/database_connection.py
+++ b/Order_Microservice_Group3/app/models/database_connection.py
@@ -1,11 +1,23 @@
 import pyodbc
 
+# #Connect to database
+# def connect_db():
+
+#     server = 'DESKTOP-LCN6P4E\\SQLEXPRESS'
+#     database = 'Orders'
+
+#     connection_string = f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};Trusted_Connection=yes;'
+    
+#     return pyodbc.connect(connection_string)
+
 #Connect to database
 def connect_db():
+    
+    server = 'DESKTOP-LCN6P4E\\SQLEXPRESS'
+    database = 'Orders'
+    username = 'desktop-lcn6p4e\\fin'
+    password = ''
 
-    server = 
-    database = 
-
-    connection_string = f'DRIVER={{SQL Server}};SERVER={server};DATABASE={database};Trusted_Connection=yes;'
+    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
+    return pyodbc.connect(connection_string)
diff --git a/Order_Microservice_Group3/app/models/order_history.py b/Order_Microservice_Group3/app/models/order_history.py
new file mode 100644
index 00000000..d8c851a7
--- /dev/null
+++ b/Order_Microservice_Group3/app/models/order_history.py
@@ -0,0 +1,59 @@
+import pyodbc
+from models.database_connection import connect_db
+
+def fetch_order_history(user_id):
+    try:
+        # Open database connection
+        connection = connect_db()
+        cursor = connection.cursor()
+
+        # Fetch the order history for the user
+        cursor.execute("""
+            SELECT og.OrderGroupID, og.CustomerID, og.TransactionDate, og.Location, og.OrdersStatus, og.TotalPrice, oi.OrderItemID, oi.ProductID, oi.UnitPrice, oi.Quantity, oi.TotalItemPrice
+            FROM OrderGroup og
+            INNER JOIN OrderItem oi ON og.OrderGroupID = oi.OrderGroupID
+            WHERE og.CustomerID = ?
+            ORDER BY og.TransactionDate DESC;""", (user_id,))
+
+        # Fetch all records and close cursor and connection
+        records = cursor.fetchall()
+        cursor.close()
+        connection.close()
+
+        # Process the fetched data into a structured format for the API response
+        order_history = {}
+        for record in records:
+            # Unpack the fetched row
+            order_group_id, customer_id, transaction_date, location, orders_status, total_price, order_item_id, product_id, unit_price, quantity, total_item_price = record
+
+            
+            if order_group_id not in order_history:
+                order_history[order_group_id] = {
+                    "CustomerID": customer_id,
+                    "TransactionDate": transaction_date,
+                    "Location": location,
+                    "OrdersStatus": orders_status,
+                    "TotalPrice": total_price,
+                    "Items": []
+                }
+
+            # Append this item to the items list for the order group
+            order_history[order_group_id]["Items"].append({
+                "OrderItemID": order_item_id,
+                "ProductID": product_id,
+                "UnitPrice": unit_price,
+                "Quantity": quantity,
+                "TotalItemPrice": total_item_price
+            })
+
+        # Convert to list of order histories
+        order_history_list = list(order_history.values())
+        return order_history_list
+
+    except pyodbc.Error as e:
+        # Close cursor and connection in case of error
+        if cursor:
+            cursor.close()
+        if connection:
+            connection.close()
+        return {"error": str(e)}
diff --git a/Order_Microservice_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc b/Order_Microservice_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..5f29c863d1d38cd3a32b6adbf3b4951e2a9fb749
GIT binary patch
literal 2302
zcma)7O=ufO6rR=YN+Zj1;z&vyH9v|I>d3z#X-(tUg;dmrw2@O{Q(}~;>)nyP&T3c8
zuI$)IMYM$)dMTw4AAQOX@uA1kQ=49TT$u%%g+QSAkeiDyA*a4s{n&C+=+o@mnYVA|
z{mgrx9*4ti2xuccm>cvX^fy~Hh_6rf(lB|56r^w(%5yUu$L2oGm*;2ryf7npYhDv)
zL?0rYB5a6{IE0?TQ==Kb;{OiK1e5@9tnjx{62D@flAIg<Ov>GtZc#%i%7i9;?om&0
zUCFC@N>hn$xj0Rhri_9rr{8pFhAe6GhG~sly>#{RQ_k(2H4MwNs8q<Bgf0?l%5|&W
zO9am1*!vCGLu565LJ-Y{uhq{oQus3XU-rSnm(cnFZSORXJp%r$xhxAMt|TmSwBKU3
z>I5=hiHAIZ?PrZVqOu5QHdhT@_AZHYoZ{aIJo14)JT+o@z3n|ooThL+hz5YUU0)O>
z-BPXP>4G9zWSkoLNvc5Tub9J0-W7ByPuvc@n9mj@3Yw~+o9;163YscQY?aMPvSrY5
zNO+r0ma-Phujz&tB~4{#W({3iP6||D_ClI!T6Go5qIAPDB}}WfE$MgLC3az1xprf1
zo;=IEpkdIb9c)uaO`0c`1STXmxNn%nmhkA!52=yNG+d>b8CUhpw63x{g;*0tE@2ia
zCCi!X%A%ypL`i%}W)o9Hp4Sb{m|M<Bb@{*&nH?xlV}Zz4rk0uPO;x4_s}NNt*$HYC
z3s*8yp^zyQXCb<IX79dNiOuz3Vc9)hkF$~RY|+cOQVX1Rf!nNq%x{5J&`#vMJv?ql
zCaRGMCo)m_eAkbT^;d3e$BtLh+b83;a2zDZySHKko3VjvY{-cXRnj2B$JWl+fgTt;
z(NpWazuvRIqIT4*MolMbt_EM?=oaqY#NAJppWOc|X5;QEo^<e}-59$;gfGJGJ#Yib
z2dkDPmQ~!|Hb`6Rf1#;YLWlZ*v)H}Y>D?8pa3ya2fL22r`sz?uZSbvCUG@c0$+v!>
zTMq1f3p>iZ#VV*yioexU4z+v@l=ubKAs)3_J*0_26aO#GAZP~vOH=PTkF03pD?%3#
zjhBTMpV~^oVNdQrPnU(S1s&JkOWYEAz~4bjt$7dapSwS6MV}f%BtvP+%5X(2TDgIb
z098fk<05&*gs=)&YMvNHYbAb@n5HyG5+>j(bdxN@I#<-R<#Q|kDFy)}D{Z$Lh%vGf
zn9Su&VvVev7?)HH8qPA<Rwa?IoimbbcZCJh&|Og}<_o5aq3b*#cLk>B`iU+Z3UT>4
zV!2|0ssQJr2Lo=fiA=8F@XWZuPanvnz~IRhb6U}yPl|3ESp;9R9$?hxp22n|fi?ux
z2Rlb7kqxS3o7ln;lNFc;Df9%)+|%_=&(>VDnyu^^phKW@1|IVtV9?5)v7h5>H>#aI
zPG?W$#!lqDhhsmD+2^kPKC+dX+DuK^)0t}Ou9Ld^<5)Fv&xzcFZubSm{_XhtTk+n_
zc<(Ql?RalBKJ3JYSC72FVY{QZiu)YgXX8FtuFkI=ak>Voc+kOvHXdXmZEeyy^<fnc
zJ9yZ}!%U>EopnwQRq-VUU$VXN`b8+Zi#V}=pLwVEJn3wn4<-(d*Fd{GY=QTV(Efe;
zn{-u(IzrTL4D%#J{fBt{!Y94xd2d^)gMa?P(NvKCGbqA58FWPt94UhmH{{I+J;e9^
zAiVzs%Cbijj4@dB68aQTcCdE=Z}4ayYC|I*(<>lj;A1WV1IIXS8=bXV$2PibziYfi
rp^Eo=8R}Xcv-_^uq0wq+)CrAN@GkD;ZgIQl0KXXKV!P;V=K1w6hA~Xk

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-312.pyc b/Order_Microservice_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-312.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..432486e9bcb7f12b1184b584251c58df46243066
GIT binary patch
literal 2023
zcmaJ>O>7fK6rT0&+UqzD<i{a#`7r?%oZy5Xfr^1j)FMc<I8;hh5xKaV-Ep#Jy}O#-
zO>ksau2iW=?V((n9DAxj<j`X;l`49v)Qhbc8I4-C6<oL>!l6npeY5sDDMB5~Gw;29
zGw=6%zeb}y2-Ze+vM?D$=qY3T#dnCUX&}~+id0TVC2pSM7#+|9C4QbS3G;%-^SU@M
z1`y^{VMBb#weQXc)!^r7KBR_Vm&$xndd@y1IU0RmF5H%H5L0y(Op*b**ArY;OPZ0<
zHEcLk%How-)6$gecAsu4vc6>6PWt@G^QRwhw12@g9or$YmA5fj#>7_ICfmCR2lIdH
z8`##6)A0vE3>yL8yDC!oD)?Isz@M+6q91Yl4R3$gp{qiLs|d>+IpVOly#<m$g@<T6
z_o^bi5%Rz8oE34AQ-d3!hk>??LuL3Sr7VGzBf@Ubkq=$ja5SepXQ{G-r-@mbAu5FR
zoVlLlsbI(@O#2MCl(%F8nwn|Ybbw$>*A$s?`GTxCCYgq0_8532@37q2G`cM78hbNu
z8hSY?5P{i?=$h?xR0xZRMiqjYR{L5qNPA^gjJ(pWMvo`YGcQOK^hqDP)Yq1lup@&B
znTB@^v)B^e+Ws<=&douY?A)|w<mL>G)eB-xn1zJx5`xRQ%j&XhC|FH=gclOCSXnYm
z-CQi^<c>VGf)`R2F^gDna_!9IuWJf1S@ksq=dTjewa(;Z%gR~q0z|jO?A`XdtjkYY
zWqP0!r=Re=>t$SR2Tn%7ZH5VZ0k#@?Hh83dZn`;mwf4b_AR0JPyY?hDT+2Qgjn{=?
zkPMHtVyQ+fwHceLWr3Fl)(<v9$DR%C|91R`TlG&!bI86M{!<!iNn;IZ?0)(F?O$Sb
zY3#8y^CFC-<6B?_Dc$x2hULv`-S0rUyLF45_F*^tRYBcm<{Va7Z@sArRj$Gn!@kDO
zsdnM8!TSwb4TMo8P>k$o`P6Q3S9ymug16M5?+1r=NkbLB$ok~9<=gp>t^~S!UsDA3
zjk;mb9r$0}om}jDgI-6(fOrHsL%zmQM24%vF8_Nf!jAo$F!rj#r@~iL?Q?}&L3j9@
zXoX8gvV`@_s^~g})H^WVL;#(OpEDtFAxA4=({)zk*RgHOi#TD!fP>ao6yOW4u9pw5
z24@*w)2lr<e0Zl<Lo<bfjh*!BzG+$00UeIXuBwSr`<-;MmkLGOG^nV$CCjD~K*XD<
zRA72Ehz-S5G36JrLq&^dFjqwnvozctBQ$7wW@z}z9R*u#mQb;vyY^C2q&;{Ue9e34
z?$DmWUM2y|!1x6_dk9ucqUO7UfWtPMDjxm`D*-*wfn~n!qSM8lXMjwB&O!Lw8?XWH
z`eSSHd-3&aoBhXX*Pac&wRY*=rTXCuKc!ol*+yozK9}3feEjvL&B0rM%s@yy@g)9s
zD?Z+ckAHu<9v|O~pS!!~Hz`{08*fSzK-^tg-_sgNHAYfRX_E2!`b=y8*~b2}P3aut
zwe>@-(W%DhR8u<nDu~4B7unCUkA<PXUx}zU_7ZX83GcmQ_xoGYL_?bR=LHY4ZJSMu
zA1@zz?-Y7;DxBHNKT7vzBK*%05$I%?irx$&4AL~>(Uaa__2#fQdI^i0B-qB@@>1~t
zkx@po)NM-_OHfrEze~;l%Z7!06gIHWalfNOf1uM(QRJ`4NPXf$Gjg#ey_EX78{F3M
JC>Qfy`4?Ol0UrPW

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/publishers/kafkaPublishers.py b/Order_Microservice_Group3/app/publishers/kafkaPublishers.py
index ded6930e..6f511acc 100644
--- a/Order_Microservice_Group3/app/publishers/kafkaPublishers.py
+++ b/Order_Microservice_Group3/app/publishers/kafkaPublishers.py
@@ -27,7 +27,6 @@ def create_Quantity_updated_topic():
         admin_client.create_topics(new_topics=[new_topic], validate_only=False)
 
 
-#Function is called in updateProfileControllers.py
 def publish_product_updated_event(event_data):
     # Serialize the event data to JSON
     event_json = json.dumps(event_data)
diff --git a/Order_Microservice_Group3/app/run.py b/Order_Microservice_Group3/app/run.py
new file mode 100644
index 00000000..b2d6c4fa
--- /dev/null
+++ b/Order_Microservice_Group3/app/run.py
@@ -0,0 +1,7 @@
+
+from app import create_app
+
+app = create_app()
+
+if __name__ == '__main__':
+    app.run(debug=app.config['DEBUG'], port=app.config['PORT'])
\ No newline at end of file
diff --git a/Order_Microservice_Group3/app/subscriber/UpdateProductSubscriber.py b/Order_Microservice_Group3/app/subscriber/UpdateProductSubscriber.py
index 95bc9963..5e3829b9 100644
--- a/Order_Microservice_Group3/app/subscriber/UpdateProductSubscriber.py
+++ b/Order_Microservice_Group3/app/subscriber/UpdateProductSubscriber.py
@@ -1,15 +1,15 @@
-
-
-
 import sys
 print(sys.path)
 from threading import Thread
 from kafka import KafkaConsumer
 import json
 import logging
+
 KAFKA_SERVER= "localhost:9092"
+TOPIC_NAME = "product_update_topic"
+
 
-from  app.models.UpdateProduct import UpdateProduct
+from  models.UpdateProduct import UpdateProduct
 
 def consume_product_updated_event():
     logging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')
diff --git a/Order_Microservice_Group3/app/subscriber/__init__.py b/Order_Microservice_Group3/app/subscriber/__init__.py
index e69de29b..ad05085c 100644
--- a/Order_Microservice_Group3/app/subscriber/__init__.py
+++ b/Order_Microservice_Group3/app/subscriber/__init__.py
@@ -0,0 +1,5 @@
+print("Subscribers package initialized")
+
+from subscriber.UpdateProductSubscriber import consume_product_updated_event
+
+from subscriber.UpdateProductSubscriber import start_kafka_consumer
diff --git a/Order_Microservice_Group3/app/subscriber/__pycache__/UpdateProductSubscriber.cpython-311.pyc b/Order_Microservice_Group3/app/subscriber/__pycache__/UpdateProductSubscriber.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..aa9e23735f73af113da60264a91d8bd33db9affa
GIT binary patch
literal 2255
zcmc&#&2Jk;6rZ(c?X_daDfw#aq;Z2P)q=R87NsfBDk^PL+NM?Gf@B$1o85`C>Dp^%
z*Fi}g$w)c$&>M&fsYpGAROx{u{{UCCjuzD#sZu2_a5D;Aa^lVUD^8I(GQ0cR`FQib
z=DjyRM5AE@P5*s*X-h=tH$G@Lf2*^%3Z2JDLz-ZqEb<{D5VYcJlWhqI?ZDS;0;lsC
z{sPWoukSa+LLeLP`hpS620cDfR?=`bq>0%ui~~krA(D*%O>h%sqnZTRuL%n%8Tx~>
zolgoZkXfcg(V!Q-p)B23E}KQGTp)D4-!N6hST-&D!p!u{SvFLnrdC#Mxm?l|o5;3V
z(pA3go;SYJTvc28dcPnbw|4Jau;VeZJJuky(&^g=c66=Rgy+63@WoEYA42c`wil7+
zKkO+x)Mcq*+dGNo%yY4q=LV{vkI-iiHiU|>5@_#w%JqJ&X@Ooj8$SC;muRIUv*J5M
z=kKw*t9S6}0nNIcDu?Xp<py3DJxHrb$2!A`Ukmk&!rjsHzAccv(~&NqM->f0Bt+)-
zlc!EAmTKz-lC%<2iBqQyvPz7i(is<sWhr@Bedc4Lx5xrZCM_uT`eZX+^kP2IijPDy
zKC}cdDcY%2ib4V)2$Um>rfFL?RZ6l&=qjPsx>&ZCrp~X&?-G^ht3*4*<3i%W1`D_2
zPS=?9MOi7@y1mB464h0b^wTIXr~MpaTug)o4KtqyeOTY3V(BXAx1{G8zCM5THp6-m
z^u|EQA~$BQ-k6mauH60P%3UU|Dn^;GfJRhPBMh%tW)Vy^70sf3oH-AUBxaJ@N)Hxn
zIfV_h^@FTXWU!A#4$fFyS_0bs*OxEk?t$f2?y6qQ-7A8@)B;-)=2F5cQ%cryv)Zas
zRKX9QlEp-ZsLMqYtXaz`t@)`h$>J1nUm>cUyG=D<Am7qeYI28yKjdrFESJ(brBupU
z<wZ-S`XZsZo(x^+%%@6gY`kTV+}62uda`$V^aLo+ool%ORrC_~xp?&Z{1d}Tf9_zp
zhGiGa(1C@`o6eDUYxtat&pG(q-vKl*?u@5@t~jwwEtYX(nd;oD!FU5nV%md;!Fqi1
z$%ilEXLjRfehk*)=iT^uM>_g)H2%%HGkLZ)ns!Ii4<j$7*rSLueD=lg%<k~aPjA<T
zuern5YSNr5%{kH>2nvln9oshClke9j-rD}yop`T4c6xi%9ebxC`a<bH5x`#@8eNFC
zwb%o@kjkOm_<8X(+4}|H|0!BMB@6c!fDNRH6(o0xRR#Tfx!MBlci?L_eoa8K2j-~+
z6O<RL_2Ub+LT#S8Ug1x)LmN_--wUvqCw3+&(E+}N*E;$Jhd~b9Ltb=1&M2h7v&G`<
zU}xk$zei--yH_k;=M!`skPUeha&x&Yjh=#~3HU4-;J-s`s)kc8PB}OQCqH!j*OM2W
z!ArHlOYY#M>dpG`6V;m#p>;g)0*~zCks3bg;-gOcrCd-l#{AZr<&}`4&2UMvmszN(
zE_lN;jftL?Ua6qG;5MBw1U(kc+`e=DvOGU~>k1nxK)EoiR8NL^#lmxrXWTR7iS>N2
zFMR+z$_BYeQ^1Qm$NCPS;THs<j>1*%sUxu}R@KeruVS0AYOIdNoZh#NCY;{4j{2(J
sQ%C((?|IdKq8h13->ilk0VGU2=*+>lfnx$BL<c5=!m$Q=9X!?l0iWI;UH||9

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/app/subscriber/__pycache__/__init__.cpython-311.pyc b/Order_Microservice_Group3/app/subscriber/__pycache__/__init__.cpython-311.pyc
new file mode 100644
index 0000000000000000000000000000000000000000..2a17d63934a1bacf865d25ca4ec5a38cfc5abe46
GIT binary patch
literal 481
zcmZuu%}N6?5YFy)r3k%w6&EkIhZaFkBBB%&#6PG-D1neo(i*$n4M}!od-C8r_y&sj
z6u!X<9;By&7rhC+^<=iK7QtaM`4T4Id^33{l@@`q!;kg$v)SMC!;d*LFxoWW4%mPJ
z3hpfcp3It>1*k>s!0Op8dx9N<ot9&8p#dsxf29%oib(D=sXT#67k8M)L#{avc%RYF
zoTp+9mPr(<xW|x?5sisPv7lHpide!zZ4#E0#!{m$Zg(-7CCigaVc-hMLp@kkzlCbe
z$=kCj(_Dbe8<GVR9>FNDJHD-N!KO0O;64vwGvtZET&G^t_Ean-OW__(a7Y;SE|~9~
zGjbV5LDWehp50fknO`-cuNcwrR8m8LjyaK$p-nhp=s-rX*nn6FIF|?!%7=hZO{C-E
xcF*)2upOEIMLt`#Yr>afS=JkHZ`^EQ?FE!yK{*5EAvntZ`ViE!|6CRg$v0NwmPr5r

literal 0
HcmV?d00001

diff --git a/Order_Microservice_Group3/config.py b/Order_Microservice_Group3/config.py
new file mode 100644
index 00000000..0092cdd5
--- /dev/null
+++ b/Order_Microservice_Group3/config.py
@@ -0,0 +1,8 @@
+import os
+
+DEBUG = True
+SECRET_KEY = "Group3"
+
+PORT = 5001
+
+KAFKA_SERVER= "localhost:9092"
diff --git a/Order_Microservice_Group3/docker-compose.yml b/Order_Microservice_Group3/docker-compose.yml
new file mode 100644
index 00000000..b630abf4
--- /dev/null
+++ b/Order_Microservice_Group3/docker-compose.yml
@@ -0,0 +1,58 @@
+version: '3.2'
+services:
+  zookeeper:
+    image: wurstmeister/zookeeper
+    container_name: zookeeper
+    ports:
+      - "2181:2181"
+    networks:
+      - kafka_network
+
+  kafka:
+    image: wurstmeister/kafka
+    depends_on: kafka
+    ports:
+      - "9092:9092"
+    environment:
+      KAFKA_ADVERTISED_HOST_NAME: kafka
+      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181
+      KAFKA_BOOTSTRAP_SEVERS: kafka:9092
+    networks:
+      - kafka_network
+
+  Orders-database:
+    image: mcr.microsoft.com/mssql/server:2019-latest
+    container_name: Orders-database
+    ports:
+      - "1433:1433"
+    environment:
+      SA_PASSWORD: "WebTechGroup3"
+      ACCEPT_EULA: "Y"
+    networks:
+      - kafka_network
+    volumes:
+      - Orders-database-data:/var/opt/mssql
+  
+  Orders-microservice:
+    image: Orders-microservice:1.0
+    container_name: Orders-microservice
+    ports:
+      - "5000:5000"
+    environment: 
+      DATABASE_URL: "DRIVER=ODBC Driver 17 for SQL Server;SERVER=Chiamaka;DATABASE=User_Management;UID=CHIAMAKA\amych;PWD='';Trusted_Connection=yes;"
+      #- DATABASE_URL: "mssql://sa:Group3!@user-database:1433/User_Management"
+      KAFKA_SERVER: "kafka:9092"
+      SECRET_KEY: Group3
+    depends_on:
+      - Orders-database
+      - kafka
+      - zookeeper
+    networks:
+      - kafka_network
+
+networks:
+  kafka_network:
+    driver: bridge
+
+volumes:
+  Orders-database-data:
\ No newline at end of file
diff --git a/Order_Microservice_Group3/requirements.txt b/Order_Microservice_Group3/requirements.txt
index 972ab5e7fdd6ee679425dcc795c2aeaff42f4d25..febc8c0785e81e39e00be7974efa35a3bd39787f 100644
GIT binary patch
literal 588
zcmZ9Jy-veW423--@hGX<8%kN2Dls52F)$}3r6DDOq#5Ahf$!KPAQX9s&ySCNzdlPl
zT5YX0R#|V?d@EbnhFaRWo!QR&Cpddbcmhdw0V8<@>tF@?0rtr<{5t+#=*j(K_RdkL
z(vP>$9kb<oML%YTV~18Qh5LxHgrT{YuD$^;m>6og3eW#xnQh%=@EKBz6}#2;NYcU)
z={K&e*<b)Ez@9vLXCs~1J+==0E$Lf(hM8s$Z4en6`g_uafAkl&_8GreX0P_n!~-eY
zd4@8^jqcF*xQy`b-LaZk@(e$DbYw2MrgE-9ghtMuE#7db*h0Hao8*5uBU6t4S|#}>
XhF*B(i68tDjlbo{UBsAf9!b9eQ3_M&

literal 21
ccmYexNi5FhDoQOZO)V}d<|<0eOUcg#09e}yBLDyZ

diff --git a/Order_Microservice_Group3/run.py b/Order_Microservice_Group3/run.py
new file mode 100644
index 00000000..417284e2
--- /dev/null
+++ b/Order_Microservice_Group3/run.py
@@ -0,0 +1,36 @@
+# from flask import Flask
+# from app.__init__ import create_app
+# app = Flask(__name__)
+
+# # Define the route for the root URL "/"
+# @app.route('/')
+# def home():
+#     # This is the view function that returns a response
+#     return "Welcome to the Flask App!"
+
+# # Check if this is the script being run as the main program and start the app
+# if __name__ == '__main__':
+#     app.run(debug=True)
+
+# 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)
+
+from app import create_app  # Adjusted import to reference the app package
+
+app = create_app()
+
+if __name__ == '__main__':
+    app.run(debug=True)
\ No newline at end of file
-- 
GitLab