|
10 | 10 | import json |
11 | 11 | import logging |
12 | 12 | import os.path |
| 13 | +from urllib.parse import urlparse |
13 | 14 |
|
14 | 15 | import requests |
15 | 16 | from django.contrib import messages |
|
59 | 60 | from fedcode.models import Note |
60 | 61 | from fedcode.models import Package |
61 | 62 | from fedcode.models import Person |
| 63 | +from fedcode.models import RemoteActor |
62 | 64 | from fedcode.models import Repository |
63 | 65 | from fedcode.models import Reputation |
64 | 66 | from fedcode.models import Review |
@@ -696,6 +698,24 @@ def post(self, request, *args, **kwargs): |
696 | 698 | return HttpResponseBadRequest("Invalid message") |
697 | 699 |
|
698 | 700 |
|
| 701 | +@method_decorator(has_valid_header, name="dispatch") |
| 702 | +class RemoteUserSubscribe(View): |
| 703 | + def get(self, request, *args, **kwargs): |
| 704 | + """Endpoint to for existing remote user to subscribe to package.""" |
| 705 | + purl = request.GET.get("purl").rstrip("/") |
| 706 | + package = get_object_or_404(Package, purl=purl) |
| 707 | + remote_actor = get_object_or_404(RemoteActor, username=kwargs["username"]) |
| 708 | + host = request.get_host() |
| 709 | + if urlparse(remote_actor.url).netloc == host: |
| 710 | + _, created = Follow.objects.get_or_create(package=package, person=remote_actor.person) |
| 711 | + message = f"Already subscribed package {purl}" |
| 712 | + if created: |
| 713 | + message = f"Successfully subscribed package {purl}" |
| 714 | + |
| 715 | + return JsonResponse({"status": "success", "message": message}) |
| 716 | + return HttpResponseBadRequest() |
| 717 | + |
| 718 | + |
699 | 719 | @method_decorator(has_valid_header, name="dispatch") |
700 | 720 | class PackageInbox(View): |
701 | 721 | def get(self, request, *args, **kwargs): |
@@ -736,7 +756,7 @@ def get(self, request, *args, **kwargs): |
736 | 756 | (or at least the ones you're authorized to see). |
737 | 757 | (client-to-server and/or server-to-server)""" |
738 | 758 |
|
739 | | - actor = Package.objects.get(purl=kwargs["purl_string"]) |
| 759 | + actor = get_object_or_404(Package, purl=kwargs["purl_string"]) |
740 | 760 | return JsonResponse( |
741 | 761 | {"notes": ap_collection(actor.notes)}, |
742 | 762 | content_type=AP_CONTENT_TYPE, |
|
0 commit comments