notification support

This commit is contained in:
Karl 2025-07-17 16:22:56 +01:00
parent 1e36958279
commit 2f68a82c33
3 changed files with 36 additions and 10 deletions

22
app.py
View File

@ -6,6 +6,7 @@ import requests.auth
import os import os
import base64 import base64
from typing import Dict, Any, Tuple, Union 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.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,
@ -90,6 +91,27 @@ def index() -> Union[Response, str]:
return redirect(url_for("home")) return redirect(url_for("home"))
return render_template("index.html") 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") @app.route("/home")
@cache.cached(timeout=60) @cache.cached(timeout=60)
def home() -> str: def home() -> str:

Binary file not shown.

View File

@ -74,16 +74,20 @@
} }
function subscribeUser(registration) { function subscribeUser(registration) {
const applicationServerKey = urlB64ToUint8Array('{{ config.VAPID_PUBLIC_KEY }}'); fetch('http://localhost:3001/vapid-public-key')
registration.pushManager.subscribe({ .then(response => response.json())
userVisibleOnly: true, .then(data => {
applicationServerKey: applicationServerKey const applicationServerKey = urlB64ToUint8Array(data.public_key);
}).then(function(subscription) { registration.pushManager.subscribe({
console.log('User is subscribed.'); userVisibleOnly: true,
saveSubscription(subscription); applicationServerKey: applicationServerKey
}).catch(function(err) { }).then(function(subscription) {
console.log('Failed to subscribe the user: ', err); console.log('User is subscribed.');
}); saveSubscription(subscription);
}).catch(function(err) {
console.log('Failed to subscribe the user: ', err);
});
});
} }
function saveSubscription(subscription) { function saveSubscription(subscription) {