From e16fb42e37069dece8f3eb088fe7c4bef0010a06 Mon Sep 17 00:00:00 2001 From: Karl Date: Fri, 18 Jul 2025 09:50:02 +0100 Subject: [PATCH] try fix notifications --- app.py | 66 +++++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 52 insertions(+), 14 deletions(-) diff --git a/app.py b/app.py index c267367..690cff4 100644 --- a/app.py +++ b/app.py @@ -8,6 +8,9 @@ import base64 from typing import Dict, Any, Tuple, Union import sys import redis +import json +from pywebpush import webpush, WebPushException +import mysql.connector from lib.datetime import filter_accounts_next_30_days, filter_accounts_expired from lib.reqs import (get_urls, get_user_accounts, add_user_account, @@ -142,25 +145,60 @@ def proxy_save_subscription(): except requests.exceptions.RequestException as e: return jsonify({"error": str(e)}), 502 +def get_db_connection(): + # This is a simplified version for demonstration. + # In a real application, you would use a connection pool. + return mysql.connector.connect( + host=app.config["DBHOST"], + user=app.config["DBUSER"], + password=app.config["DBPASS"], + database=app.config["DATABASE"], + port=app.config["DBPORT"], + ) + +def get_push_subscriptions(): + conn = get_db_connection() + cursor = conn.cursor(dictionary=True) + cursor.execute("SELECT * FROM push_subscriptions") + subscriptions = cursor.fetchall() + cursor.close() + conn.close() + return subscriptions + +def send_notification(subscription_info, message_body): + try: + webpush( + subscription_info=subscription_info, + data=message_body, + vapid_private_key=app.config["VAPID_PRIVATE_KEY"], + vapid_claims={"sub": app.config["VAPID_CLAIM_EMAIL"]}, + ) + except WebPushException as ex: + print(f"Web push error: {ex}") + # You might want to remove the subscription if it's invalid + if ex.response and ex.response.status_code == 410: + print("Subscription is no longer valid, removing from DB.") + # Add logic to remove the subscription from your database + @app.route('/send-test-notification', methods=['POST']) -def send_test_notification_proxy(): - """Proxies the request to send a test notification to the backend.""" +def send_test_notification(): + """Sends a test push notification to all users.""" if not session.get("logged_in"): return jsonify({'error': 'Unauthorized'}), 401 - backend_url = f"{app.config['BASE_URL']}/send-test-notification" - credentials = base64.b64decode(session["auth_credentials"]).decode() - username, password = credentials.split(":", 1) + subscriptions = get_push_subscriptions() + if not subscriptions: + return jsonify({"message": "No push subscriptions found."}), 404 - try: - response = requests.post( - backend_url, - auth=requests.auth.HTTPBasicAuth(username, password), - json={"message": "Ktv Test"} - ) - return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type']) - except requests.exceptions.RequestException as e: - return jsonify({"error": str(e)}), 502 + message_body = json.dumps({"title": "KTVManager", "body": "Ktv Test"}) + + for sub in subscriptions: + try: + send_notification(json.loads(sub['subscription_json']), message_body) + except Exception as e: + print(f"Error sending notification to subscription ID {sub.get('id', 'N/A')}: {e}") + + return jsonify({"message": f"Test notification sent to {len(subscriptions)} subscription(s)."}) @app.route("/home") @cache.cached(timeout=60, key_prefix=make_cache_key)