try fix notifications

This commit is contained in:
Karl 2025-07-18 09:50:02 +01:00
parent 7468b1b391
commit e16fb42e37

64
app.py
View File

@ -8,6 +8,9 @@ import base64
from typing import Dict, Any, Tuple, Union from typing import Dict, Any, Tuple, Union
import sys import sys
import redis 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.datetime import filter_accounts_next_30_days, filter_accounts_expired
from lib.reqs import (get_urls, get_user_accounts, add_user_account, 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: except requests.exceptions.RequestException as e:
return jsonify({"error": str(e)}), 502 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']) @app.route('/send-test-notification', methods=['POST'])
def send_test_notification_proxy(): def send_test_notification():
"""Proxies the request to send a test notification to the backend.""" """Sends a test push notification to all users."""
if not session.get("logged_in"): if not session.get("logged_in"):
return jsonify({'error': 'Unauthorized'}), 401 return jsonify({'error': 'Unauthorized'}), 401
backend_url = f"{app.config['BASE_URL']}/send-test-notification" subscriptions = get_push_subscriptions()
credentials = base64.b64decode(session["auth_credentials"]).decode() if not subscriptions:
username, password = credentials.split(":", 1) return jsonify({"message": "No push subscriptions found."}), 404
message_body = json.dumps({"title": "KTVManager", "body": "Ktv Test"})
for sub in subscriptions:
try: try:
response = requests.post( send_notification(json.loads(sub['subscription_json']), message_body)
backend_url, except Exception as e:
auth=requests.auth.HTTPBasicAuth(username, password), print(f"Error sending notification to subscription ID {sub.get('id', 'N/A')}: {e}")
json={"message": "Ktv Test"}
) return jsonify({"message": f"Test notification sent to {len(subscriptions)} subscription(s)."})
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
@app.route("/home") @app.route("/home")
@cache.cached(timeout=60, key_prefix=make_cache_key) @cache.cached(timeout=60, key_prefix=make_cache_key)