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 zcmcIoTWk~A89w9jW$cV&J2xlfHX-bSx7lo1E`>m$+1M-&!2yz##xZM6JmcUn_Jo-+ zA?_Gft3DVNiA5`wm3CK3)k>x1g-0G!RV#Jri@iyOI|a2>wW|8&aFHtZrT-aw?1aE( zALvms=giE1{r<~2o<BRC4g_QI@;mY0yAb*pzA=WWvUn1P#Vy1kju23i2onTen*>vm z43kN7*qpS4ElF$Gsy`<MTapS>`r0hmla8=MUt5H_a2@bj1v*KGX?SM)ISM-$Ek5c$ zSdov=95FGK;$upboAH@7`+Gu~pO+FTMYBo##WXL&VonxQiTI*slX+QAh$-Oeh@IzS z7ozMXHX*Px2_c~@M%fe>1=bi3?`?iQmPoQf2-XzGD!h_N@-f3XtlAF$B>X?QZ^4e* zkwW0dc-$#ZC~M*f)fBBhS50$3`{JlllPWo9d+{v-&{PyB?o@OW2&k~`7e-ZzSvAW( zj^xY<LM0_PP}jXc3bzI|NHa+uu<JW%#?d%ZoQ4$6a;M@^)-sE-R@LlB=e|KGYg26z zKqO0L?O8{SUUgLI9SWpNd8m|Xhc_5O7}+|tj<dGGN<ISCc=U%GE;Wle5@>ChHbKNp z7?0QIB}k@pE6%<m7IvU;U<$Aw#mRM1G0in@Fj&7?Z#7q^QlBA?{(}5J*j=?N0~wa3 zRf|ezAYxgIYMpD|Y?qF{;R($-KQ|jOBGC1Jn~`dTm>vLr+q#I^xO&}l8|SLbZaf<? z<UH%&W}ro6ov%Q#L3OGXX>n5x!|Q{f`Q<gxs3O&(cnweHT8&k0Hn3KSxVa`1<h9pm zjFmylHDQ~x^}4@3*xy&^Z&vFKi(xkWZ^7K_wO#Lhr3c;@s(7n>X$6f|uI+Q^3a>A} zdy&#%U@+HZtZMTPB%RK>6hNXpxNWNIGxUY2mK|5OtWK^S=l2w}`>gAV>*{N?zASNp zSU{J_DYQWJqVFU9>i6hy3&@b^>j)joWE{-8F&-EV3{NnpB#}$Ul%T(l8D=Hrbec^m zux<1)lc|Jq3hx^mxQ?9}JIRcn7w6{_saedh;qBSufinSSQs$+gpZO7UwE9xB@RB4- znVyiyBosa=Gl>+VoadPsh+q_v(KjwJt@LNi1N{R7n!U1z3A|=Y!v4n2@|siM#-cG% zl3-`d{IV*2omb4{DgV$!;MFD?wBvz^nu{B3H7M|0cBqOGrelUe{+GFEuxZX%8VpP+ z<y|)e2m^@Bc~%A|+0-o0F>z6<;m&0G`<Y?9Z-e_lCMZAwh@|K72Cajn`;8I9X!Yas zK-D6RG9sqgs}a-cCq#u6f&jFxT*5n#)POIzn`;eKaHAJ1@y=Y?gk}ZFiYh;=u$xFQ zh=%^5@}WcEUkc_+fZQN0^W}!yU}!vWW`YTZCdQaCiQ}dBB{4nE>>5tXikQUd)yL>Q z>i)r6VpB33Q{Wf`hVp&Ps2F4MU0<199#>c;E&Dbo8JnCqHHnpAT>*c8O;OOlf$%3o zqmzMgX4la^ruw%NaEalAS88@=O{|2^Gnrp(;Kqru$sZgWX4iU+eYKS6tAbkbvKq;n zCL`T8+qRKLYQh%z{7~&s7MseqlHs+I&D3%+CMM?v9;c(6j$vQpX+c=*_mObqEI-hk z>wpjXH5%7;l;agRf65sK=gbT%^Ne2n43~xz>}<8v2boOQcT@O05<W?34mPcbU`;Zi zXjZ5$S(G#zf0>V^6<(v_yaI(K2%04(h|qfQF;b#1A0>%`FvG?!09S>ZouB7ZoP<yM z8krIoD(qs4*R1o4A~zG$ECJlAGz(N+O7XchTN;E$6P#vaIZgr?s)uvPFKL@@ATG=( zc3#%%6kL1d;+OD-u9@)*y#_TJw@jmA%Ed^R&+H&LEhu`lG&;pER4Y@X*Jp`F@Uk0( z8sRtQ=N}FaMsO76$gxB!0<GW@tf7%JVjRK;4QVkl#9d-jF$m{beukOgW9L(%AkHpE z*vj*_7x<aC=Ou9tx@$yNDo0NyViE@R67;aBUW9uhfMFyla=ai%^u9F)ZF_zZ`d+1p zMKK!EyI>^_g?tTS_#rBp!i1&!VRQE<k({H*ypeOPQk_Ll`vcGRf@k}RXGhLjvLd_d zM*X$=5;C{aB?`G(a^a_Tv%Rh4KrJ1&qBo-}&2Q!$|8%t#o7(f8Kh8G}t(`F;x}iun z+!(z!dOh^ly5=I?@__Cr&>erFyGkUYTb_=akhkm8_$OknuIO#c(V(Zf`!Q;>yK?^G z?tKNiKNtL1U7C8>+P!37X?-gfeAxcOd-mnS`P1Q*_UYW{KN`E2>b`F5E4sHmaQ7D6 zy{qmwia^|PJ5lI4koO)exDT#fCblx9v`C;PX36z+<3Q2fa;yF(c9dxXN4>pEM++@` z?oKV+^3BJ=WzPr!J_9=Lo`Sn))!hr~^1Z{$!R15wkectw=Dk-6?kj8Yt(DFasOzoU zqxZTCeZfL!Fc&J)-cOGdXkYF`k#2oJcNggHV&|L1j$Or0-|cq_orA^g18a6mPyI7w zak@%Az^QZqHTOJ5R{P$ZA7f*_H(fXo{L|k2sc_-Mbp9NhpGg+ZrB>R-5<(Y=fN2e( zj$<ac37SsgDP;O7eik%M>93|txltUm(6tai(BTFM0Almfbb;BO_q_YeZg%c1SwLN> zVN*(c{IlO2|Ly3nMt>c;`+nYe80W_kz^b+D*43L=SG>D!dkWqkl!FW=o9!PE5M@Ib z3A(H`U3d51a}@RrFHhu0!iB(e-V=FdBb^@*B@*+M>MP3g-uITzE|08IV@0ar0o7KZ z+E%G{5Y##dm;rKYHnZEY*1A;!{P(E`NNyaycK9(OEr%Xb&b)izuIDb9uiv{$?bC&~ z7pQhz8E$XB?O@(DxJnJKS+^4WZOH@jzFniYB783Up(H;VvIm>cA9fEpVfy2a{c!yf z4fn(JRa4{00rIPzJtKR_`xF7|`*!olA#{I_1+Nc~cztN+iS4AXUh9HJ&|hu@{amHh z!|6=_Zh>2)-n%Vvft4>vW>72P&jgYcU+@P3jakR9Hxhj_A4+l62B~*(8(02lQEu$L zm>suoy}|qrJ%J^XcEja4br_6E3;Yr3Al%|#^D+aM5=jumBed`DX#Wb@{|E)YLG6D- 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 zcmcIn-ER}w6~E*0$JiM=<B*Vm6LOsdSeGS0Bh-b3R#D;*wjodwiZ*g(O=fQ5Nt_w) zoiQQSWW_@tQbYy2T9rz>EBT44<)QouTWP-@$B`whk&ux3)Hknar4>&-*Pk(As|tzh zJ7><EbMCq4{La01Jbwv?LkQZ$z?qe^7@>c%hi3CMm>2H?^AM>><+5mlTjDszd$OJ- z58U}Izu{f-g3SASwB%Dg3n=0H7aN-3+>m1EI#H~&x;zh$foY;>8**0hHe9otA1)rQ z7xzH=5Lp}(*4rbvJ#IdrZEq0S-r^p8ONCys^x3{*GyJv@a4Kh`748w}9=G%y0&5n* zzV?b&zwLj(QPK9NVC;5aTd;!dA-3=cB75A5ZaZiPYymEA-N&r#pzT?&&8d36@NS1z z(RP;|Qu#wI7v>?mt5~ybi5iURwF93c)%PXeIR``@QvG{8%>1N>fE@%6!fQPI6jDKm z9@+c~zYi^Mk=1Np>qHA;>!O#`P%*I25CnEtXC{zG*99gI**@9}^$=b+YTpcA+6OD* z|FT^`3vb!GDym^M@`dMZW-yAZo;EUTwav?(#}K94qSfElsol2tIr`Gmi8EBiTNK+? zZSGZUAsfkxwe_~x>52Jf*(#n7;W*e9KNjC+-t`$axlMGN{}63*qp)Y+&N|sd%{da$ z`NAh5yr(TB=aN&4_&0f3w=`>O@|LV+<>f4S7tdV1er0m;og2DlU89-;lH>C~Kc2vo z3%Diga5Z!N>J@yA8fsp#re#a+P~MzPUQaf)m#6VX{HvBe;dOiD=EUib8lkvhB~K~Q zt#pn}?*>~YZn!2%D+cHli?Yp9h~Few&KX%_RVzTO%Xtf18A3q_m!W63a3P8{i)@&< z<!GF;)2?uOF+*_8CC<nuRx+}_O4M=8#ElplYR$yDv58-D<Ap!9!ry}?zHx1OaxsY) zGDa?^>8n#RwO(ttkX&q|*a5~~Z?6FjPtH%{8z!NzVAveya@Y-Q5Yv=b$xNZAQ4WaO z!Yf8zSH}~c8eWv`n8ImRr)AkBm{4j^tm%+FQP$H9h_o!MiL|V%^%|VV1*vnyd7Ow) z_M&n9fRt%aH$ZL^C2tW|SRs~@F?8bkR<ed{xqdm9Bf1Kf#>R$bx!yHH(_NpEHB93A zb6bYGthl};3&iz7IdsbvsFBSs%gVaTn-)!k-B7N+zS5fN_E7Rso|qO<+iNC5Zs%Z0 zfT+G`0(pRn88=_snxWG$i<hUyCS`{{Wv98@)3Mm<0f#9ubB1n`v<fh}LIYOQ<%r3A zG%>H;U;c6Ge2NvuOwDL|3bx2C-~m2ttYDL^<gL`CdP~+7qT-um87~qgqqFt8m699s zlbdAuBxJY-DWtAa6&$3mXbJ^@=q=a-=}Xke=O$7BWNO1uN!CnFv2tBw8)Q;fo4a^C zx8)B0uR_wJ5dIywOg|Lw4tf@ieKPpj;GGYuo?rNeE791~=*Vt#q!b-1N5^*j&xOeS z$lXX4c?ZO*fVvOu{O*UKH#qoj1O%i&MAY4P-?(d(BE#j#@D5+;iu`~^f|t3<>4}nf z(h-jo!_VT!irc05*>e0WJXihb__<1ayfSpknMm#qB`fiXCm-*|lhvSa2<8H^bEO(V z1BZ8JD+h2fRz7gDin#DPSCIxDc7NLKV9lBSEu*zwlGe)7nj@`&<KB32xP0JD6$#<7 zmUYHiAP&yddr8vDlIBR-bLrs2$fqnf+zYw&j}@1m^gDg$Ai?PSkYMzEPyq=cKt+o0 zO7W63T9!r~Y4mw_KZF@RS~)TP_xJwx-jmtViHqeE7axTGtd*p9D*a>CK_vD-%)wYi z?72U8ckU1K_vUxzD_wm|I9w4AJ{1Rd#lezzq%0l*Oc*RYXsR(ZaI|{xO-J{kk>k$9 zCFj5_^s4lRZhrhv6h_{=P({3Nj@wJ031KHP{Z$kQ^pcP)3rR;vR)n6XLTp!vm4u<P zFyshBm7x*m)Cb>;ekK3o*w@E^Wxe~?tP33-YW8MG{RpiZWdYVW@y*?s?9bYRsWUSY z`uY?H^qV7Ipx;W}vr+!r;q$X1|J@-D`0oyTXM552q7V4*qden#PhIBugx@_}-<9L+ zykN&FyrOC!3+&WkrzGtI;s(_EHv?tg47IKJSM&l{M8|-<6fS_5e3tx@{tO=3zi)F6 k2rLYatDrMZXRn~}o!aj?iaDLVdYeDT4Oh{ALKEQdzar-&G5`Po 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%PG-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