diff --git a/app.py b/app.py index 1c7c644..cdbaf32 100644 --- a/app.py +++ b/app.py @@ -2,9 +2,13 @@ from flask import Flask, jsonify, send_from_directory import mysql.connector from datetime import datetime, timedelta import os +import sys app = Flask(__name__, static_folder='public') +# Enable debug mode via environment variable +DEBUG_MODE = os.environ.get('DEBUG', 'false').lower() == 'true' + # Database configuration DB_CONFIG = { 'host': os.environ.get('DB_HOST', 'localhost'), @@ -14,9 +18,26 @@ DB_CONFIG = { 'database': os.environ.get('DB_NAME', 'shopdb') } +def debug_log(message): + """Print debug messages to console/PM2 logs""" + print(f"[DEBUG] {message}", file=sys.stderr, flush=True) + # Get database connection def get_db_connection(): - return mysql.connector.connect(**DB_CONFIG) + if DEBUG_MODE: + debug_log(f"Attempting database connection to {DB_CONFIG['host']}:{DB_CONFIG['port']}") + debug_log(f"Database: {DB_CONFIG['database']}, User: {DB_CONFIG['user']}") + + try: + conn = mysql.connector.connect(**DB_CONFIG) + if DEBUG_MODE: + debug_log(f"Database connection successful! MySQL version: {conn.get_server_info()}") + return conn + except mysql.connector.Error as err: + debug_log(f"Database connection FAILED: {err}") + debug_log(f"Error code: {err.errno}") + debug_log(f"SQL state: {err.sqlstate if hasattr(err, 'sqlstate') else 'N/A'}") + raise # Serve static files (index.html, logo, etc) @app.route('/') @@ -31,13 +52,24 @@ def static_files(path): @app.route('/api/notifications') def get_notifications(): try: + if DEBUG_MODE: + debug_log("=== API /api/notifications called ===") + now = datetime.now() future = now + timedelta(hours=72) # 72 hours from now + if DEBUG_MODE: + debug_log(f"Time window: {now} to {future}") + # Connect to database + if DEBUG_MODE: + debug_log("Connecting to database...") conn = get_db_connection() cursor = conn.cursor(dictionary=True) + if DEBUG_MODE: + debug_log("Database cursor created") + # Query with isshopfloor filter and 72-hour window query = """ SELECT n.notificationid, n.notification, n.starttime, n.endtime, n.ticketnumber, n.link, @@ -53,13 +85,26 @@ def get_notifications(): ORDER BY n.starttime ASC """ + if DEBUG_MODE: + debug_log("Executing query...") + cursor.execute(query, (future, now, now, future)) + + if DEBUG_MODE: + debug_log("Query executed, fetching results...") + rows = cursor.fetchall() + if DEBUG_MODE: + debug_log(f"Fetched {len(rows)} rows from database") + cursor.close() conn.close() # Convert bit fields to boolean and datetime to ISO strings + if DEBUG_MODE: + debug_log("Converting data types...") + for row in rows: row['isactive'] = bool(row['isactive']) row['isshopfloor'] = bool(row['isshopfloor']) @@ -68,6 +113,9 @@ def get_notifications(): if row['endtime']: row['endtime'] = row['endtime'].isoformat() + if DEBUG_MODE: + debug_log("Data conversion complete") + # Categorize notifications current_events = [] upcoming_events = [] @@ -81,6 +129,9 @@ def get_notifications(): else: upcoming_events.append(notification) + if DEBUG_MODE: + debug_log(f"Categorized: {len(current_events)} current, {len(upcoming_events)} upcoming") + # Sort current events by severity priority, then by starttime # Priority: Incident (danger) > Change (warning) > Awareness/TBD (success) severity_priority = { @@ -139,4 +190,7 @@ if __name__ == '__main__': port = int(os.environ.get('PORT', 3001)) print(f'Shopfloor Dashboard running on port {port}') print(f'Access at: http://localhost:{port}') + print(f'DEBUG MODE: {"ENABLED" if DEBUG_MODE else "DISABLED"}') + print(f'Database: {DB_CONFIG["host"]}:{DB_CONFIG["port"]}/{DB_CONFIG["database"]}') + print(f'To enable debug logging: set DEBUG=true environment variable') app.run(host='0.0.0.0', port=port, debug=False)