|
@ -133,7 +133,7 @@ class WebPushService(): |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
@staticmethod |
|
|
def _send_push_notification(subscription_info: Dict, message: Dict, vapid_key: VAPIDKey) -> bool: |
|
|
def _send_push_notification(subscription_info: Dict, message: Dict, vapid_key: VAPIDKey) -> Dict[str, any]: |
|
|
""" |
|
|
""" |
|
|
Sends a push notification using the provided subscription information, message, and VAPID key. |
|
|
Sends a push notification using the provided subscription information, message, and VAPID key. |
|
|
|
|
|
|
|
@ -311,9 +311,8 @@ class WebPushService(): |
|
|
# Sleep before repeating |
|
|
# Sleep before repeating |
|
|
time.sleep(5 * 60) |
|
|
time.sleep(5 * 60) |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# This is an endpoint, routed in __init__ |
|
|
# This is an endpoint, routed in __init__ |
|
|
def ping(self) -> Response: |
|
|
def ping(self) -> str: |
|
|
""" |
|
|
""" |
|
|
Endpoint to show liveness info |
|
|
Endpoint to show liveness info |
|
|
|
|
|
|
|
@ -323,9 +322,8 @@ class WebPushService(): |
|
|
|
|
|
|
|
|
return f"pong ... with latest subscription run at {self.latest_subscription_run}" |
|
|
return f"pong ... with latest subscription run at {self.latest_subscription_run}" |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# This is an endpoint, routed in __init__ |
|
|
# This is an endpoint, routed in __init__ |
|
|
def regenerate_vapid(self) -> Tuple[str, int]: |
|
|
def regenerate_vapid(self) -> Tuple[Response, int, dict[str, str]] | Tuple[Response, int]: |
|
|
""" |
|
|
""" |
|
|
Endpoint to regenerate VAPID keys. |
|
|
Endpoint to regenerate VAPID keys. |
|
|
|
|
|
|
|
@ -338,7 +336,7 @@ class WebPushService(): |
|
|
Header: Authentication: Basic ... |
|
|
Header: Authentication: Basic ... |
|
|
|
|
|
|
|
|
Returns: |
|
|
Returns: |
|
|
- tuple with "success" as True or False, and "message" message string |
|
|
- Tuple with "success" as True or False, and "message" message string |
|
|
|
|
|
|
|
|
Notes: |
|
|
Notes: |
|
|
- If the operation is successful, a JSON response with a success message is returned with a 200 status code. |
|
|
- If the operation is successful, a JSON response with a success message is returned with a 200 status code. |
|
@ -402,7 +400,7 @@ class WebPushService(): |
|
|
|
|
|
|
|
|
@staticmethod |
|
|
@staticmethod |
|
|
@app.route('/web-push/subscribe', methods=['POST']) |
|
|
@app.route('/web-push/subscribe', methods=['POST']) |
|
|
def subscribe() -> Tuple[str, int]: |
|
|
def subscribe() -> Tuple[Response, int]: |
|
|
""" |
|
|
""" |
|
|
Endpoint to handle new web push subscription requests. |
|
|
Endpoint to handle new web push subscription requests. |
|
|
|
|
|
|
|
@ -434,10 +432,21 @@ class WebPushService(): |
|
|
if not vapid_key: |
|
|
if not vapid_key: |
|
|
return jsonify(success=False, message="No VAPID keys available"), 500 |
|
|
return jsonify(success=False, message="No VAPID keys available"), 500 |
|
|
|
|
|
|
|
|
|
|
|
# Constructing the notify_time string |
|
|
|
|
|
notify_time = "13:13" # random time that is in most people's waking hours (server time, typically UTC) |
|
|
|
|
|
if ('notifyTime' in content) and ('utcHour' in content['notifyTime']): |
|
|
|
|
|
notify_hour = content['notifyTime']['utcHour'] |
|
|
|
|
|
if 'minute' in content['notifyTime']: |
|
|
|
|
|
notify_minute = content['notifyTime']['minute'] |
|
|
|
|
|
else: |
|
|
|
|
|
notify_minute = 0 |
|
|
|
|
|
notify_time = '{:02d}'.format(notify_hour) + ":" + '{:02d}'.format(notify_minute) |
|
|
|
|
|
|
|
|
# Creating a new Subscription instance with the provided data |
|
|
# Creating a new Subscription instance with the provided data |
|
|
subscription = Subscription(endpoint=content['endpoint'], |
|
|
subscription = Subscription(auth=content['keys']['auth'], |
|
|
|
|
|
endpoint=content['endpoint'], |
|
|
|
|
|
notify_time=notify_time, |
|
|
p256dh=content['keys']['p256dh'], |
|
|
p256dh=content['keys']['p256dh'], |
|
|
auth=content['keys']['auth'], |
|
|
|
|
|
vapid_key_id=vapid_key.id) |
|
|
vapid_key_id=vapid_key.id) |
|
|
|
|
|
|
|
|
# Saving the subscription data to the database |
|
|
# Saving the subscription data to the database |
|
@ -445,7 +454,8 @@ class WebPushService(): |
|
|
db.session.commit() |
|
|
db.session.commit() |
|
|
|
|
|
|
|
|
# Introducing a delay (ensure that gateway endpoint is available) |
|
|
# Introducing a delay (ensure that gateway endpoint is available) |
|
|
time.sleep(10) |
|
|
# ... which I'm now commenting out because there's no pending request so it doesn't make sense... we'll see if things still work |
|
|
|
|
|
#time.sleep(10) |
|
|
|
|
|
|
|
|
# Constructing the subscription information for the push notification |
|
|
# Constructing the subscription information for the push notification |
|
|
subscription_info = { |
|
|
subscription_info = { |
|
@ -463,12 +473,12 @@ class WebPushService(): |
|
|
result = WebPushService._send_push_notification(subscription_info, message, vapid_key) |
|
|
result = WebPushService._send_push_notification(subscription_info, message, vapid_key) |
|
|
|
|
|
|
|
|
# Returning the operation status |
|
|
# Returning the operation status |
|
|
return jsonify(success=result["success"], message=result["message"]) |
|
|
return jsonify(success=result["success"], message=result["message"]), 200 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@staticmethod |
|
|
@staticmethod |
|
|
@app.route('/web-push/unsubscribe', methods=['POST']) |
|
|
@app.route('/web-push/unsubscribe', methods=['POST']) |
|
|
def unsubscribe() -> Tuple[str, int]: |
|
|
def unsubscribe() -> Tuple[Response, int]: |
|
|
""" |
|
|
""" |
|
|
Endpoint to handle web push unsubscription requests. |
|
|
Endpoint to handle web push unsubscription requests. |
|
|
|
|
|
|
|
@ -499,7 +509,7 @@ class WebPushService(): |
|
|
if subscription: |
|
|
if subscription: |
|
|
db.session.delete(subscription) |
|
|
db.session.delete(subscription) |
|
|
db.session.commit() |
|
|
db.session.commit() |
|
|
return jsonify(success=True, message="Subscription deleted successfully") |
|
|
return jsonify(success=True, message="Subscription deleted successfully"), 200 |
|
|
|
|
|
|
|
|
# If the subscription is not found, return an error message |
|
|
# If the subscription is not found, return an error message |
|
|
else: |
|
|
else: |
|
@ -508,7 +518,7 @@ class WebPushService(): |
|
|
|
|
|
|
|
|
@staticmethod |
|
|
@staticmethod |
|
|
@app.route('/web-push/send-test', methods=['POST']) |
|
|
@app.route('/web-push/send-test', methods=['POST']) |
|
|
def send_test() -> Tuple[str, int]: |
|
|
def send_test() -> Tuple[Response, int]: |
|
|
""" |
|
|
""" |
|
|
Endpoint to send a test push notification to a specific client. |
|
|
Endpoint to send a test push notification to a specific client. |
|
|
|
|
|
|
|
@ -563,7 +573,7 @@ class WebPushService(): |
|
|
) |
|
|
) |
|
|
|
|
|
|
|
|
print(f"Test sent: {result['success']}") |
|
|
print(f"Test sent: {result['success']}") |
|
|
return jsonify(success=result["success"], message=result["message"]) |
|
|
return jsonify(success=result["success"], message=result["message"]), 200 |
|
|
else: |
|
|
else: |
|
|
print(f"Test failed due to missing subscription. Request: {json.dumps(content)}") |
|
|
print(f"Test failed due to missing subscription. Request: {json.dumps(content)}") |
|
|
return jsonify({"success": False, "message": "Subscription not found"}), 404 |
|
|
return jsonify({"success": False, "message": "Subscription not found"}), 404 |
|
|