diff --git a/djangoldp_webpushnotification/models.py b/djangoldp_webpushnotification/models.py index e417305..2c46b4c 100644 --- a/djangoldp_webpushnotification/models.py +++ b/djangoldp_webpushnotification/models.py @@ -1,6 +1,8 @@ +from django.db import models + def send_request(target, object_iri, instance, created): - ActivityQueueService.send_activity(target, json) - + ActivityQueueService.send_activity(target, json) + class VAPIDKeyset(models.Model): public_key = models.BinaryField(max_length=87) private_key = models.BinaryField(max_length=43) @@ -10,7 +12,3 @@ class VAPIDKeyset(models.Model): self.public_key.tobytes()[:10], self.private_key.tobytes()[:10] ) - -@receiver(post_save, sender=Notification) -def send_email_on_notification(sender, instance, created, **kwargs): - if created and instance.summary and getattr(settings,'JABBER_DEFAULT_HOST',False) and instance.user.email: diff --git a/djangoldp_webpushnotification/templates/sw.js b/djangoldp_webpushnotification/templates/sw.js new file mode 100644 index 0000000..478340a --- /dev/null +++ b/djangoldp_webpushnotification/templates/sw.js @@ -0,0 +1,18 @@ +// Register event listener for the 'push' event. +self.addEventListener("push", function (event) { + // Retrieve the textual payload from event.data (a PushMessageData object). + // Other formats are supported (ArrayBuffer, Blob, JSON), check out the documentation + // on https://developer.mozilla.org/en-US/docs/Web/API/PushMessageData. + const eventInfo = event.data.text(); + const data = JSON.parse(eventInfo); + const head = data.head || "New Notification πŸ•ΊπŸ•Ί"; + const body = data.body || "This is default content. Your notification didn't have one πŸ™„πŸ™„"; + + // Keep the service worker alive until the notification is created. + event.waitUntil( + self.registration.showNotification(head, { + body: body, + icon: "https://i.imgur.com/MZM3K5w.png", + }) + ); +}); diff --git a/djangoldp_webpushnotification/urls.py b/djangoldp_webpushnotification/urls.py new file mode 100644 index 0000000..1551ac2 --- /dev/null +++ b/djangoldp_webpushnotification/urls.py @@ -0,0 +1,15 @@ +from django.urls import include, path +from django.views.generic import TemplateView + +from .views import home, send_push + +urlpatterns = [ + path("send_push", send_push), + path("webpush/", include("webpush.urls")), + path( + "sw.js", + TemplateView.as_view( + template_name="sw.js", content_type="application/x-javascript" + ), + ), +] diff --git a/djangoldp_webpushnotification/views.py b/djangoldp_webpushnotification/views.py new file mode 100644 index 0000000..1b46547 --- /dev/null +++ b/djangoldp_webpushnotification/views.py @@ -0,0 +1,29 @@ +import json + +from django.conf import settings +from django.http.response import HttpResponse, JsonResponse +from django.shortcuts import get_object_or_404, render +from django.views.decorators.csrf import csrf_exempt +from django.views.decorators.http import require_GET, require_POST +from djangoldp_account.models import LDPUser +from webpush import send_user_notification + + +@require_POST +@csrf_exempt +def send_push(request): + try: + body = request.body + data = json.loads(body) + + if "head" not in data or "body" not in data or "id" not in data: + return JsonResponse(status=400, data={"message": "Invalid data format"}) + + user_id = data["id"] + user = get_object_or_404(LDPUser, pk=user_id) + payload = {"head": data["head"], "body": data["body"]} + send_user_notification(user=user, payload=payload, ttl=1000) + + return JsonResponse(status=200, data={"message": "Web push successful"}) + except TypeError: + return JsonResponse(status=500, data={"message": "An error occurred"}) diff --git a/setup.cfg b/setup.cfg index aadfaa5..3ca61e5 100644 --- a/setup.cfg +++ b/setup.cfg @@ -10,9 +10,10 @@ license = MIT [options] packages = find: install_requires = - djangoldp~=2.1.0 + djangoldp~=2.1 djangoldp_account~=2.1 ecdsa~=0.16.1 + django-webpush~=0.3 [options.extras_require] include_package_data = True