diff --git a/Kafka/docker-compose.yml b/Kafka/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..ac67edd7f1578e2ecd771e04f017a55d135c183a --- /dev/null +++ b/Kafka/docker-compose.yml @@ -0,0 +1,44 @@ +version: "3" + +services: + zookeeper: + image: wurstmeister/zookeeper + container_name: zookeeper + ports: + - "2182:2182" + networks: + - kafka_network + + kafka: + image: wurstmeister/kafka + container_name: kafka + ports: + - "9092:9092" + environment: + KAFKA_ADVERTISED_HOST_NAME: kafka + KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181 + KAFKA_BOOTSTRAP_SEVERS: kafka:9092 + networks: + - kafka_network + + user-microservice: + image: user-microservice:1.0 + container_name: user-microservice + depends_on: + - kafka + - zookeeper + networks: + - kafka_network + + product-microservice: + image: product-microservice:1.0 + container_name: product-microservice + depends_on: + - kafka + - zookeeper + networks: + - kafka_network + +networks: + kafka_network: + driver: bridge \ No newline at end of file diff --git a/Product_MicroService_Group3/Dockerfile b/Product_MicroService_Group3/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..e51666e85b66d04d93dd8ed47ffa291991a71152 --- /dev/null +++ b/Product_MicroService_Group3/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11.4 + +COPY requirements.txt /product_ms/ + +COPY app /product_ms/ + +WORKDIR /product_ms + +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.ini +ENV ODBCSYSINI=/etc + +CMD ["python", "index.py"] \ No newline at end of file diff --git a/Product_MicroService_Group3/app/config.py b/Product_MicroService_Group3/app/config.py index 5ddee9138343724688ae8453ce6e8591c11b39c4..96b983721bde59aa5a40f74aee24fe6a8c0075ff 100644 --- a/Product_MicroService_Group3/app/config.py +++ b/Product_MicroService_Group3/app/config.py @@ -6,4 +6,4 @@ SECRET_KEY = "Group3" PORT = 5001 -KAFKA_SERVER= "localhost:9092" \ No newline at end of file +KAFKA_SERVER= "kafka:9092" \ No newline at end of file diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc index 0e51d65e2ae6279d43717f3f1f61d3ea671e160c..a8ef2134af3385e3f89b7bc21c35f53302104a00 100644 Binary files a/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc and b/Product_MicroService_Group3/app/controllers/__pycache__/addReviewController.cpython-311.pyc differ diff --git a/Product_MicroService_Group3/app/controllers/__pycache__/getReviewsController.cpython-311.pyc b/Product_MicroService_Group3/app/controllers/__pycache__/getReviewsController.cpython-311.pyc new file mode 100644 index 0000000000000000000000000000000000000000..6c78e2bcbd74045dce7a609453092db0728bf0ef Binary files /dev/null and b/Product_MicroService_Group3/app/controllers/__pycache__/getReviewsController.cpython-311.pyc differ diff --git a/Product_MicroService_Group3/app/controllers/getReviewsController.py b/Product_MicroService_Group3/app/controllers/getReviewsController.py index 49b5f7c69bf6672aef2169449ab49050d84efac0..3ecdc45c326f26eba4710d3f4a5ef70e696db4a8 100644 --- a/Product_MicroService_Group3/app/controllers/getReviewsController.py +++ b/Product_MicroService_Group3/app/controllers/getReviewsController.py @@ -1,5 +1,6 @@ from flask import Blueprint, jsonify, request, json, session from models.getReviews import get_reviews +from config import KAFKA_SERVER from kafka import KafkaProducer @@ -30,7 +31,7 @@ def get_review(): return {"error" : "You need to be logged in to add a review"} -producer = KafkaProducer(bootstrap_servers = "localhost:9092") +producer = KafkaProducer(bootstrap_servers = KAFKA_SERVER) def send_review_message(reviews): metadata =producer.send("customer_reviews", json.dumps(reviews).encode("utf_8")) diff --git a/Product_MicroService_Group3/app/publishers/kafkaPublishers.py b/Product_MicroService_Group3/app/publishers/kafkaPublishers.py index 20018a03a2dfd3dd9ffb2be582a4263f85ebdae1..d03504a620a6397896bf554fed530ac58c48af2e 100644 --- a/Product_MicroService_Group3/app/publishers/kafkaPublishers.py +++ b/Product_MicroService_Group3/app/publishers/kafkaPublishers.py @@ -1,15 +1,16 @@ from kafka import KafkaProducer from kafka.admin import KafkaAdminClient, NewTopic +from config import KAFKA_SERVER import json -producer = KafkaProducer(bootstrap_servers="localhost:9092") +producer = KafkaProducer(bootstrap_servers=KAFKA_SERVER) #Creates the topic def create_product_updated_topic(): # Create KafkaAdminClient instance - admin_client = KafkaAdminClient(bootstrap_servers="localhost:9092") + admin_client = KafkaAdminClient(bootstrap_servers=KAFKA_SERVER) # Define the topic name and configuration topic_name = "product_updated_topic" diff --git a/Product_MicroService_Group3/requirements.txt b/Product_MicroService_Group3/requirements.txt index 6da6fc6ef7722e29986acb00b7f1caba9b9e5545..aed8ace483f880061abeee73b97954403c1890b1 100644 --- a/Product_MicroService_Group3/requirements.txt +++ b/Product_MicroService_Group3/requirements.txt @@ -1,3 +1,14 @@ -Flask==3.0.0 +Flask==3.0.2 +Flask-Cors==4.0.0 gunicorn==21.2.0 -boto3==1.29.0 \ No newline at end of file +kafka-python==2.0.2 +pyodbc==5.1.0 +blinker==1.7.0 +click==8.1.7 +itsdangerous==2.1.2 +Jinja2==3.1.2 +Werkzeug==3.0.1 +boto3==1.34.71 +colorama==0.4.6 +MarkupSafe==2.1.3 +requests==2.31.0 \ No newline at end of file diff --git a/User_MicroService_Group3/Dockerfile b/User_MicroService_Group3/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..3e7d584f9207328c2b4ae5b319bc506fcd1394da --- /dev/null +++ b/User_MicroService_Group3/Dockerfile @@ -0,0 +1,23 @@ +FROM python:3.11.4 + +COPY requirements.txt /user_ms/ + +COPY app /user_ms/ + +WORKDIR /user_ms + +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.ini +ENV ODBCSYSINI=/etc + +CMD ["python", "index.py"] \ No newline at end of file diff --git a/User_MicroService_Group3/app/config.py b/User_MicroService_Group3/app/config.py index 358b5ce9540cb4c24a27e99d55fedb7cc47a936c..3217efec4a6a96ac59bc14a1aef3f74470c83e1a 100644 --- a/User_MicroService_Group3/app/config.py +++ b/User_MicroService_Group3/app/config.py @@ -4,4 +4,6 @@ import os DEBUG = True SECRET_KEY = "Group3" -PORT = 5000 \ No newline at end of file +PORT = 5000 + +KAFKA_SERVER = "kafka:9092" \ No newline at end of file diff --git a/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc b/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc index 993fb4379d90d57d8dccc87743e0bec879754e00..4cbe6aa45038b2bd7bda92392953d3e3b023f3a3 100644 Binary files a/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc and b/User_MicroService_Group3/app/controllers/__pycache__/fetchUsernameController.cpython-311.pyc differ diff --git a/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc b/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc index e94a298c93ec474867d52280eef3e0341f88aca2..d12a61ce3d85861ca4a71b737865e07616283d1c 100644 Binary files a/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc and b/User_MicroService_Group3/app/controllers/__pycache__/showReviewsController.cpython-311.pyc differ diff --git a/User_MicroService_Group3/app/controllers/fetchUsernameController.py b/User_MicroService_Group3/app/controllers/fetchUsernameController.py index 311efa0a87efc3fd7c7979238b3604e9f264c537..00380458a388542e5aaa69a20561324d7f152a0c 100644 --- a/User_MicroService_Group3/app/controllers/fetchUsernameController.py +++ b/User_MicroService_Group3/app/controllers/fetchUsernameController.py @@ -3,6 +3,8 @@ from models.fetchUsername import get_username fetch_username_bp = Blueprint("getUsername",__name__) +#This function is for the product microservice. It makes a call to this +#endpoint to fetch a user's username when they want to add a product review @fetch_username_bp.route("/user/getUsername", methods=["POST"]) def username(): diff --git a/User_MicroService_Group3/app/controllers/getUsersController.py b/User_MicroService_Group3/app/controllers/getUsersController.py index 8c51a05fd07bac7ea438572fc488a4c090fcc713..e2a9bd4c09b48d0beb756dddd03e66562435a8ba 100644 --- a/User_MicroService_Group3/app/controllers/getUsersController.py +++ b/User_MicroService_Group3/app/controllers/getUsersController.py @@ -1,10 +1,11 @@ from flask import Blueprint, jsonify, request, json, session, redirect +from config import KAFKA_SERVER from models.getUsers import fetch_user_info from kafka import KafkaConsumer -consumer = KafkaConsumer("review_events", bootstrap_servers='localhost:9092') +consumer = KafkaConsumer("review_events", bootstrap_servers=KAFKA_SERVER) def getusers(user_id): @@ -14,5 +15,5 @@ def getusers(user_id): for message in consumer: event_data = json.loads(message.value.decode()) - user_id = event_data['user_id'] + user_id = event_data["user_id"] username = getusers(user_id) \ No newline at end of file diff --git a/User_MicroService_Group3/app/controllers/showReviewsController.py b/User_MicroService_Group3/app/controllers/showReviewsController.py index 8ac832b31c124ef029910d93bc78c41c98762850..924ede66f969d1ac4ce0e76b9d1f78e2de506249 100644 --- a/User_MicroService_Group3/app/controllers/showReviewsController.py +++ b/User_MicroService_Group3/app/controllers/showReviewsController.py @@ -1,17 +1,18 @@ from flask import Blueprint, jsonify, request, session from kafka import KafkaConsumer import json +from config import KAFKA_SERVER show_reviews_bp = Blueprint("showReviews", __name__) # Kafka consumer configuration consumer_conf = { - "bootstrap_servers": "localhost:9092", + "bootstrap_servers": KAFKA_SERVER, "group_id": "show_reviews_group", # Specify a unique group ID for this consumer "auto_offset_reset": "earliest" # Start consuming from the beginning of the topic } -# Function to consume reviews from Kafka +# Function to consume reviews published by product microservice def consume_reviews(num_reviews=1): consumer = KafkaConsumer("customer_reviews", **consumer_conf) reviews = [] diff --git a/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc b/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc index 3847106fe73d1b4414eb89e2fd3d5401f6c225f7..f298ced069dad7e7a1242f27879c71831e59724d 100644 Binary files a/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc and b/User_MicroService_Group3/app/publishers/__pycache__/kafkaPublishers.cpython-311.pyc differ diff --git a/User_MicroService_Group3/app/publishers/kafkaPublishers.py b/User_MicroService_Group3/app/publishers/kafkaPublishers.py index 042a5c13ed0c05097f8941b26627a5a542f2ab2d..7d41460ea71816937142c157fa6180cc964b4c25 100644 --- a/User_MicroService_Group3/app/publishers/kafkaPublishers.py +++ b/User_MicroService_Group3/app/publishers/kafkaPublishers.py @@ -1,15 +1,17 @@ from kafka import KafkaProducer from kafka.admin import KafkaAdminClient, NewTopic -import json +from config import KAFKA_SERVER -producer = KafkaProducer(bootstrap_servers="localhost:9092") +import json +producer = KafkaProducer(bootstrap_servers=KAFKA_SERVER) +#Creates the topic def create_profile_updated_topic(): # Create KafkaAdminClient instance - admin_client = KafkaAdminClient(bootstrap_servers="localhost:9092") + admin_client = KafkaAdminClient(bootstrap_servers=KAFKA_SERVER) # Define the topic name and configuration topic_name = "profile_updated_topic" @@ -27,7 +29,8 @@ def create_profile_updated_topic(): admin_client.create_topics(new_topics=[new_topic], validate_only=False) - +#Function is called in updateProfileControllers.py +#Topic message is collected from ProductMicroservice/Subsribers/updateUsernameSubscriber.py def publish_username_updated_event(event_data): # Serialize the event data to JSON event_json = json.dumps(event_data) diff --git a/User_MicroService_Group3/requirements.txt b/User_MicroService_Group3/requirements.txt index 6da6fc6ef7722e29986acb00b7f1caba9b9e5545..aed8ace483f880061abeee73b97954403c1890b1 100644 --- a/User_MicroService_Group3/requirements.txt +++ b/User_MicroService_Group3/requirements.txt @@ -1,3 +1,14 @@ -Flask==3.0.0 +Flask==3.0.2 +Flask-Cors==4.0.0 gunicorn==21.2.0 -boto3==1.29.0 \ No newline at end of file +kafka-python==2.0.2 +pyodbc==5.1.0 +blinker==1.7.0 +click==8.1.7 +itsdangerous==2.1.2 +Jinja2==3.1.2 +Werkzeug==3.0.1 +boto3==1.34.71 +colorama==0.4.6 +MarkupSafe==2.1.3 +requests==2.31.0 \ No newline at end of file