proxy to backend

This commit is contained in:
Karl 2025-07-18 16:18:18 +01:00
parent b274bf12d3
commit 33c8af61ca

67
app.py
View File

@ -9,7 +9,6 @@ from typing import Dict, Any, Tuple, Union
import sys import sys
import redis import redis
import json import json
from pywebpush import webpush, WebPushException
import mysql.connector 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
@ -135,65 +134,25 @@ 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(): def send_test_notification():
"""Sends a test push notification to all users.""" """Proxies the request to send a test notification to the backend."""
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"
credentials = base64.b64decode(session["auth_credentials"]).decode()
username, password = credentials.split(":", 1)
try: try:
subscriptions = get_push_subscriptions() response = requests.post(
except Exception as e: backend_url,
print(f"Error getting push subscriptions: {e}") auth=requests.auth.HTTPBasicAuth(username, password),
return jsonify({"error": "Could not retrieve push subscriptions from the database."}), 500 json=request.get_json()
)
if not subscriptions: return Response(response.content, status=response.status_code, mimetype=response.headers['Content-Type'])
return jsonify({"message": "No push subscriptions found."}), 404 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") @app.route("/home")
@cache.cached(timeout=60, key_prefix=make_cache_key) @cache.cached(timeout=60, key_prefix=make_cache_key)