refactor webhook publisher and change post_webhook to use test message

This commit is contained in:
Michael Genson 2025-07-27 03:20:47 +00:00
commit b3af2e0fe3
3 changed files with 22 additions and 14 deletions

View file

@ -10,7 +10,7 @@ from mealie.routes._base.mixins import HttpRepo
from mealie.schema import mapper from mealie.schema import mapper
from mealie.schema.household.webhook import CreateWebhook, ReadWebhook, SaveWebhook, WebhookPagination from mealie.schema.household.webhook import CreateWebhook, ReadWebhook, SaveWebhook, WebhookPagination
from mealie.schema.response.pagination import PaginationQuery from mealie.schema.response.pagination import PaginationQuery
from mealie.services.scheduler.tasks.post_webhooks import post_group_webhooks, post_single_webhook from mealie.services.scheduler.tasks.post_webhooks import post_group_webhooks, post_test_webhook
router = APIRouter(prefix="/households/webhooks", tags=["Households: Webhooks"]) router = APIRouter(prefix="/households/webhooks", tags=["Households: Webhooks"])
@ -55,7 +55,7 @@ class ReadWebhookController(BaseUserController):
@router.post("/{item_id}/test") @router.post("/{item_id}/test")
def test_one(self, item_id: UUID4, bg_tasks: BackgroundTasks): def test_one(self, item_id: UUID4, bg_tasks: BackgroundTasks):
webhook = self.mixins.get_one(item_id) webhook = self.mixins.get_one(item_id)
bg_tasks.add_task(post_single_webhook, webhook, "Test Webhook") bg_tasks.add_task(post_test_webhook, webhook, "Test Webhook")
@router.put("/{item_id}", response_model=ReadWebhook) @router.put("/{item_id}", response_model=ReadWebhook)
def update_one(self, item_id: UUID4, data: CreateWebhook): def update_one(self, item_id: UUID4, data: CreateWebhook):

View file

@ -148,14 +148,22 @@ class WebhookEventListener(EventListenerBase):
def publish_to_subscribers(self, event: Event, subscribers: list[ReadWebhook]) -> None: def publish_to_subscribers(self, event: Event, subscribers: list[ReadWebhook]) -> None:
with self.ensure_repos(self.group_id, self.household_id) as repos: with self.ensure_repos(self.group_id, self.household_id) as repos:
if event.document_data.document_type == EventDocumentType.mealplan:
webhook_data = cast(EventWebhookData, event.document_data) webhook_data = cast(EventWebhookData, event.document_data)
webhook_data.webhook_body = None
match event.document_data.document_type:
case EventDocumentType.mealplan:
meal_repo = repos.meals meal_repo = repos.meals
meal_data = meal_repo.get_meals_by_date_range( meal_data = meal_repo.get_meals_by_date_range(
webhook_data.webhook_start_dt, webhook_data.webhook_end_dt webhook_data.webhook_start_dt, webhook_data.webhook_end_dt
) )
if meal_data: webhook_data.webhook_body = meal_data or None
webhook_data.webhook_body = meal_data case _:
if event.event_type is EventTypes.test_message:
webhook_data.webhook_body = "Test message"
# Only publish to subscribers if we have a webhook body to send
if webhook_data.webhook_body:
self.publisher.publish(event, [webhook.url for webhook in subscribers]) self.publisher.publish(event, [webhook.url for webhook in subscribers])
def get_scheduled_webhooks(self, start_dt: datetime, end_dt: datetime) -> list[ReadWebhook]: def get_scheduled_webhooks(self, start_dt: datetime, end_dt: datetime) -> list[ReadWebhook]:

View file

@ -79,12 +79,12 @@ def post_group_webhooks(
) )
def post_single_webhook(webhook: ReadWebhook, message: str = "") -> None: def post_test_webhook(webhook: ReadWebhook, message: str = "") -> None:
dt = datetime.min.replace(tzinfo=UTC) dt = datetime.min.replace(tzinfo=UTC)
event_type = EventTypes.webhook_task event_type = EventTypes.test_message
event_document_data = EventWebhookData( event_document_data = EventWebhookData(
document_type=EventDocumentType.mealplan, document_type=EventDocumentType.generic,
operation=EventOperation.info, operation=EventOperation.info,
webhook_start_dt=dt, webhook_start_dt=dt,
webhook_end_dt=dt, webhook_end_dt=dt,