diff --git a/app.py b/app.py index a72ba23..b465736 100644 --- a/app.py +++ b/app.py @@ -6,6 +6,7 @@ import requests.auth import os import base64 from typing import Dict, Any, Tuple, Union +from pywebpush import webpush, WebPushException from lib.datetime import filter_accounts_next_30_days, filter_accounts_expired from lib.reqs import (get_urls, get_user_accounts, add_user_account, @@ -90,6 +91,27 @@ def index() -> Union[Response, str]: return redirect(url_for("home")) return render_template("index.html") +@app.route('/vapid-public-key') +def vapid_public_key(): + """Provides the VAPID public key to the client.""" + return jsonify({'public_key': app.config['VAPID_PUBLIC_KEY']}) + +@app.route('/save-subscription', methods=['POST']) +def save_subscription(): + """Saves a push notification subscription.""" + if not session.get("logged_in"): + return jsonify({'error': 'Unauthorized'}), 401 + + subscription_data = request.get_json() + if not subscription_data: + return jsonify({'error': 'No subscription data received'}), 400 + + # Here you would typically save the subscription to a database + # For this example, we'll just store it in the session + session['push_subscription'] = subscription_data + print(f"Subscription saved for user: {session['username']}") + return jsonify({'success': True}) + @app.route("/home") @cache.cached(timeout=60) def home() -> str: diff --git a/requirements.txt b/requirements.txt index e37a2d4..67890d4 100644 Binary files a/requirements.txt and b/requirements.txt differ diff --git a/templates/base.html b/templates/base.html index f5bb5f7..12db588 100644 --- a/templates/base.html +++ b/templates/base.html @@ -74,16 +74,20 @@ } function subscribeUser(registration) { - const applicationServerKey = urlB64ToUint8Array('{{ config.VAPID_PUBLIC_KEY }}'); - registration.pushManager.subscribe({ - userVisibleOnly: true, - applicationServerKey: applicationServerKey - }).then(function(subscription) { - console.log('User is subscribed.'); - saveSubscription(subscription); - }).catch(function(err) { - console.log('Failed to subscribe the user: ', err); - }); + fetch('http://localhost:3001/vapid-public-key') + .then(response => response.json()) + .then(data => { + const applicationServerKey = urlB64ToUint8Array(data.public_key); + registration.pushManager.subscribe({ + userVisibleOnly: true, + applicationServerKey: applicationServerKey + }).then(function(subscription) { + console.log('User is subscribed.'); + saveSubscription(subscription); + }).catch(function(err) { + console.log('Failed to subscribe the user: ', err); + }); + }); } function saveSubscription(subscription) {