]> littlesong.place Git - littlesongplace.git/commitdiff
Add automatic push renewal (untested)
authorChris Fulljames <christianfulljames@gmail.com>
Sat, 12 Jul 2025 16:07:21 +0000 (12:07 -0400)
committerChris Fulljames <christianfulljames@gmail.com>
Sat, 23 Aug 2025 11:30:17 +0000 (07:30 -0400)
src/littlesongplace/push_notifications.py
src/littlesongplace/static/service.js

index 59e55a62a31edf67881bbd152a27dbe2876d84aa..1cd1960617f42913ff3ec1fc2db61504971524ad 100644 (file)
@@ -35,6 +35,27 @@ def subscribe():
 
     return {"status": "success", "subid": row["subid"]}
 
+@bp.post("/update-subscription/<int:subid>")
+@auth.requires_login
+def update_subscription(subid):
+    if not request.json:
+        # Request must contain valid subscription JSON
+        abort(400)
+
+    row = db.query(
+            """
+            UPDATE users_push_subscriptions
+            SET subscription = ?
+            WHERE subid = ? AND userid = ?
+            RETURNING subid
+            """,
+            [json.dumps(request.json), subid, g.userid], expect_one=True)
+    db.commit()
+
+    current_app.logger.info(f"{g.username} updated push subscription")
+
+    return {"status": "success", "subid": row["subid"]}
+
 @bp.get("/settings")
 @auth.requires_login
 def get_settings():
index 30da09d9b49e70e9852c84c5eab99d4681f64e8f..f1e53e222b08f5fd7e8bed2b876bf68096519d39 100644 (file)
@@ -6,4 +6,20 @@ self.addEventListener("push", (event) => {
     }
 });
 
+self.addEventListener("pushsubscriptionchanged", (event) => {
+    console.log("Subscription expired");
+    event.waitUntil(
+        self.registration.pushManager.subscribe({ userVisibleOnly: true })
+        .then((subscription) => {
+            console.log("Register new subscription");
+            const subid = window.localStorage.getItem("subid");
+            return fetch(`/push-notifications/update-subscription/${subid}`, {
+                method: "post",
+                headers: {"Content-Type": "application/json"},
+                body: JSON.stringify(subscription)
+            });
+        });
+    );
+});
+
 // TODO: handle notificationclick event