Skip to content

Commit

Permalink
[WIP] Subscriptions config step
Browse files Browse the repository at this point in the history
  • Loading branch information
swrichards committed Dec 10, 2024
1 parent 37c6600 commit 92732ce
Show file tree
Hide file tree
Showing 3 changed files with 36 additions and 26 deletions.
19 changes: 11 additions & 8 deletions notifications_api_common/contrib/setup_configuration/models.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
from django_setup_configuration.models import ConfigurationModel, DjangoModelRef

from notifications_api_common.models import NotificationsConfig, Subscription
from pydantic import Field
from pydantic import UUID4, Field


class NotificationConfigurationModel(ConfigurationModel):
# TODO: Does this need an identifier?
notifications_api_service_identifier: str = DjangoModelRef(
NotificationsConfig, "notifications_api_service", default=""
)
Expand All @@ -20,6 +21,14 @@ class Meta:


class SubscriptionConfigurationItem(ConfigurationModel):
uuid: UUID4 = Field(
description="The UUID for this subscription. Must match the UUID of the corresponding `Abonnement` in Open Notificaties."
)

# Placeholder for when NotificationsConfig is no longer a singleton
notifications_api_service_identifier: str = DjangoModelRef(
NotificationsConfig, "notifications_api_service", default=""
)
channels: list[str] = DjangoModelRef(
Subscription,
"channels",
Expand All @@ -29,6 +38,7 @@ class SubscriptionConfigurationItem(ConfigurationModel):
class Meta:
django_model_refs = {
Subscription: [
"identifier",
"callback_url",
"client_id",
"secret",
Expand All @@ -37,11 +47,4 @@ class Meta:


class SubscriptionConfigurationModel(ConfigurationModel):
register_webhooks: bool = Field(
default=True,
descripton=(
"If set, the step will attempt to register the configured "
"subscriptions with the Notifications component",
),
)
items: list[SubscriptionConfigurationItem]
39 changes: 25 additions & 14 deletions notifications_api_common/contrib/setup_configuration/steps.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,14 @@
import logging
from django_setup_configuration.configuration import BaseConfigurationStep
from django_setup_configuration.exceptions import ConfigurationRunFailed
from zgw_consumers.models import Service

from notifications_api_common.models import NotificationsConfig, Subscription

from .models import NotificationConfigurationModel, SubscriptionConfigurationModel

logger = logging.getLogger(__name__)


def get_service(slug: str) -> Service:
"""
Expand Down Expand Up @@ -64,23 +68,30 @@ class NotificationSubscriptionConfigurationStep(
enable_setting = "notifications_subscriptions_config_enable"

def execute(self, model: SubscriptionConfigurationModel):
subscriptions: list[Subscription] = []
config = NotificationsConfig.get_solo()

if not (notifications_api := config.notifications_api_service):
raise ConfigurationRunFailed(
"No Notifications API Service configured. Please ensure you've first "
f"run {NotificationConfigurationStep.__class__.__name__}"
)

for item in model.items:
subscription, _ = Subscription.objects.get_or_create(
callback_url=item.callback_url,
channels=item.channels,
detail_url = f"{notifications_api.api_root}/abonnement/{item.uuid!s}"
subscription, created = Subscription.objects.get_or_create(
identifier=item.identifier,
defaults={
"client_id": item.client_id,
"secret": item.secret,
"channels": item.channels,
"callback_url": item.callback_url,
"_subscription": detail_url,
},
)
subscriptions.add(subscription)

# TODO: Side effects, boo. Should we rollback?
if model.register_webhooks:
for subscription in subscriptions:
if subscription._subscription:
# PATCH doen naar _subscription
...
else:
subscription.register()

logger.debug(
"%s subscription with identifier='%s' and pk='%s'",
"Created" if created else "Updated",
subscription.identifier,
subscription.pk,
)
4 changes: 0 additions & 4 deletions notifications_api_common/models.py
Original file line number Diff line number Diff line change
Expand Up @@ -142,7 +142,3 @@ def register(self) -> None:

self._subscription = subscriber["url"]
self.save(update_fields=["_subscription"])

def update(self): ...

def register_or_update(self): ...

0 comments on commit 92732ce

Please sign in to comment.