diff --git a/CSV.py b/CSV.py index c3653a5..51ca315 100644 --- a/CSV.py +++ b/CSV.py @@ -1,4 +1,4 @@ -import json, csv, os, time, stomp +import json, csv, os, time, stomp, logging from datetime import datetime from flask_backend.Stomp_client import get_connection @@ -6,31 +6,81 @@ QUEUE_NAME = "/queue/testQueue" OUTPUT_DIR = "/app/output" os.makedirs(OUTPUT_DIR, exist_ok=True) +# 🔧 Logger setup +logging.basicConfig( + level=logging.INFO, + format="%(levelname)s:%(name)s:%(message)s" +) +logger = logging.getLogger(__name__) + class MyListener(stomp.ConnectionListener): def on_message(self, frame): + logger.info(f"Přijatá zpráva z activeMQ: {frame.body}") + try: data = json.loads(frame.body) - except json.JSONDecodeError: - print("Received invalid JSON:", frame.body) + except Exception as e: + logger.error(f"Error when creating JSON: {e}\nInput was: {frame}") return + # Vytvoření souboru timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - filename = os.path.join(OUTPUT_DIR, f"message_{timestamp}.csv") + filename = os.path.join(OUTPUT_DIR, f"actors_{timestamp}.csv") - try: - with open(filename, "w", newline="") as f: - writer = csv.writer(f) - writer.writerow(data.keys()) - writer.writerow(data.values()) - print(f"Saved CSV: {filename}") + """try: + with open(filename, "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f, delimiter=";") + + for actor in data: + row = ["list"] + + for key, value in actor.items(): + value = actor.get(key, "") + + if isinstance(value, list): + for item in value: + if isinstance(item, dict): + row.extend(item.values()) + else: + row.append(str(item)) + + + elif isinstance(value, bool): + value = str(value).lower() + + else: + row.append(value) + + writer.writerow(row) + + logger.info(f"CSV uložen: {filename} ({len(data)} řádků)") except Exception as e: - print("Error writing CSV:", e) + logger.error(f"Chyba při zápisu CSV: {e}")""" + + try: + with open(filename, "w", newline="", encoding="utf-8") as f: + writer = csv.writer(f, delimiter=";") -# Připojení k ActiveMQ s listenerem + for actor in data: + row = ["list"] + for key, value in actor.items(): + if isinstance(value, dict): # rozbalíme dict (např. address) + row.extend(value.values()) + else: + row.append(value) + writer.writerow(row) + + logger.info(f"CSV uložen: {filename} ({len(data)} řádků)") + except Exception as e: + logger.error(f"Chyba při zápisu CSV: {e}") + +# ActiveMQ client listener = MyListener() conn = get_connection(listener=listener) conn.subscribe(destination=QUEUE_NAME, id=1, ack="auto") -# keep process alive +logger.info(f"ActiveMQ is running\nAddress: {QUEUE_NAME}") + +# Keep the process active while True: time.sleep(1) diff --git a/misc/inputs/Input_payload.xml b/examples/inputs/Input_payload.xml similarity index 100% rename from misc/inputs/Input_payload.xml rename to examples/inputs/Input_payload.xml diff --git a/misc/output/Output_file.csv b/examples/output/Output_file.csv similarity index 100% rename from misc/output/Output_file.csv rename to examples/output/Output_file.csv diff --git a/misc/output/Output_file_AMQ.json b/examples/output/Output_file_AMQ.json similarity index 100% rename from misc/output/Output_file_AMQ.json rename to examples/output/Output_file_AMQ.json diff --git a/misc/schéma.png b/examples/schéma.png similarity index 100% rename from misc/schéma.png rename to examples/schéma.png diff --git a/flask_backend/Sender.py b/flask_backend/Sender.py index 20d8beb..42b0c78 100644 --- a/flask_backend/Sender.py +++ b/flask_backend/Sender.py @@ -1,14 +1,32 @@ import json from Stomp_client import get_connection +import logging + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) QUEUE_NAME = "/queue/testQueue" + def send_to_queue(payload: dict): """ Posílá JSON payload do ActiveMQ queue, přijíma dic """ + logger.info("Input payload to send to queue: %s", payload) + + try: + actors_list = ( + payload["soapenv:Envelope"]["soapenv:Body"]["actor"]["list"] + ) + except KeyError as e: + logger.error("Missing key in payload: %s", e) + return + + actors_list_JSON = json.dumps(actors_list) conn = get_connection() # připojení s retry loop - conn.send(destination=QUEUE_NAME, body=json.dumps(payload)) - print("Message sent to ActiveMQ:", payload) + conn.send(destination=QUEUE_NAME, body=actors_list_JSON) + + logger.info("Message sent to ActiveMQ: %s", actors_list_JSON) + conn.disconnect() diff --git a/flask_backend/Stomp_client.py b/flask_backend/Stomp_client.py index 6e48f70..2d5d8a6 100644 --- a/flask_backend/Stomp_client.py +++ b/flask_backend/Stomp_client.py @@ -1,4 +1,7 @@ -import stomp, os, time +import stomp, os, time, logging + +logging.basicConfig(level=logging.INFO) +logger = logging.getLogger(__name__) MQ_HOST = os.getenv("MQ_HOST", "activemq") MQ_PORT = int(os.getenv("MQ_PORT", 61613)) diff --git a/flask_backend/app.py b/flask_backend/app.py index 807200c..aa6ec9d 100644 --- a/flask_backend/app.py +++ b/flask_backend/app.py @@ -1,6 +1,9 @@ from flask import Flask, request, jsonify from Sender import send_to_queue import xmltodict +import logging + +logger = logging.getLogger(__name__) app = Flask(__name__) @@ -10,10 +13,12 @@ def send(): try: payload_dict = xmltodict.parse(xml_payload) # převede XML na dict send_to_queue(payload_dict) # pošle se do Sender.py + logger.info("Request payload sent to queue: %s", payload_dict) return jsonify({"status": "ok"}), 200 except Exception as e: + logger.error("Error processing request: %s", str(e)) return jsonify({"error": str(e)}), 500 diff --git a/output/actors_20251019_205007.csv b/output/actors_20251019_205007.csv new file mode 100644 index 0000000..cb1a2c5 --- /dev/null +++ b/output/actors_20251019_205007.csv @@ -0,0 +1,3 @@ +list;59088032;Jiri Novak;Vika;StreetName;4312;SANDNES;NO;true;StreetName 1A;NORWAY;+4793488400;+4793488999;testguy@gmail.com;1962-10-01;false;false +list;59088033;Tomas Novak;Vika;Postboks 16;4318;BERGEN;NO;true;StreetName 1B;NORWAY;+4793488888;testguy2@gmail.com;1963-10-01;false;false +list;59088034;Karel Novak;Vika;StreetName;4319;STAVANGER;NO;true;StreetName 1C;NORWAY;+4793488777;testguy3@gmail.com;1964-10-01;false;false diff --git a/output/filler b/output/filler new file mode 100644 index 0000000..6706718 --- /dev/null +++ b/output/filler @@ -0,0 +1,3 @@ +Musí to tu být, protože git neukláda prázdné složky. + +Do složky output se ukladájí CSV soubory. \ No newline at end of file diff --git a/output/message_20251017_150032.csv b/output/message_20251017_150032.csv deleted file mode 100644 index 4bd667c..0000000 --- a/output/message_20251017_150032.csv +++ /dev/null @@ -1,2 +0,0 @@ -soapenv:Envelope -"{'@xmlns:soapenv': 'http://schemas.xmlsoap.org/soap/envelope/', 'soapenv:Body': {'actor': {'list': [{'id': '59088032', 'firstName': 'Jiri Novak', 'lastName': 'Vika', 'address': {'streetName': 'StreetName', 'postCode': '4312', 'cityName': 'SANDNES', 'countryCode': 'NO', 'isPostBox': 'true'}, 'addressLine1': 'StreetName 1A', 'country': 'NORWAY', 'phoneNumber': '+4793488400', 'cellularPhoneNumber': '+4793488999', 'emailAddress': 'testguy@gmail.com', 'dateOfBirth': '1962-10-01', 'hasSecretAddress': 'false', 'isReservedAgainstSalesMaterial': 'false'}, {'id': '59088033', 'firstName': 'Tomas Novak', 'lastName': 'Vika', 'address': {'streetName': 'Postboks 16', 'postCode': '4318', 'cityName': 'BERGEN', 'countryCode': 'NO', 'isPostBox': 'true'}, 'addressLine1': 'StreetName 1B', 'country': 'NORWAY', 'phoneNumber': '+4793488888', 'emailAddress': 'testguy2@gmail.com', 'dateOfBirth': '1963-10-01', 'hasSecretAddress': 'false', 'isReservedAgainstSalesMaterial': 'false'}, {'id': '59088034', 'firstName': 'Karel Novak', 'lastName': 'Vika', 'address': {'streetName': 'StreetName', 'postCode': '4319', 'cityName': 'STAVANGER', 'countryCode': 'NO', 'isPostBox': 'true'}, 'addressLine1': 'StreetName 1C', 'country': 'NORWAY', 'phoneNumber': '+4793488777', 'emailAddress': 'testguy3@gmail.com', 'dateOfBirth': '1964-10-01', 'hasSecretAddress': 'false', 'isReservedAgainstSalesMaterial': 'false'}]}}}"