Compare commits

..

2 Commits

Author SHA1 Message Date
fbaf79c9ae Bump version: 1.3.23 → 1.3.24
All checks were successful
Build and Publish Docker Image / build-and-push (push) Successful in 3m22s
2025-07-17 16:23:03 +01:00
2f68a82c33 notification support 2025-07-17 16:22:56 +01:00
5 changed files with 38 additions and 12 deletions

View File

@ -1,5 +1,5 @@
[tool.bumpversion] [tool.bumpversion]
current_version = "1.3.23" current_version = "1.3.24"
commit = true commit = true
tag = true tag = true
tag_name = "{new_version}" tag_name = "{new_version}"

View File

@ -1 +1 @@
1.3.23 1.3.24

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,7 +74,10 @@
} }
function subscribeUser(registration) { function subscribeUser(registration) {
const applicationServerKey = urlB64ToUint8Array('{{ config.VAPID_PUBLIC_KEY }}'); fetch('http://localhost:3001/vapid-public-key')
.then(response => response.json())
.then(data => {
const applicationServerKey = urlB64ToUint8Array(data.public_key);
registration.pushManager.subscribe({ registration.pushManager.subscribe({
userVisibleOnly: true, userVisibleOnly: true,
applicationServerKey: applicationServerKey applicationServerKey: applicationServerKey
@ -84,6 +87,7 @@
}).catch(function(err) { }).catch(function(err) {
console.log('Failed to subscribe the user: ', err); console.log('Failed to subscribe the user: ', err);
}); });
});
} }
function saveSubscription(subscription) { function saveSubscription(subscription) {