feat: add initial notification support

* Add updated recipe notification

* Add recipe deleted notification

* Add notifications translations

* Shopping lists full c/u/d notifications

* Add categories c/u/d notifications

* Deal with None values in translation provider

* Add tag c/u/d notifications

* Add cookbook c/u/d notifications

* use single key pairs for consistency with frontend

* change dependency injection strategy

* use generic update messages

* use service to manage url generation server-side

* use new strategies for messages

* fix translator

Co-authored-by: Miroito <alban.vachette@gmail.com>
This commit is contained in:
Hayden
2022-05-21 10:23:55 -08:00
committed by GitHub
parent 841b560abc
commit b2066dfe72
12 changed files with 244 additions and 24 deletions

View File

@@ -1,6 +1,6 @@
from functools import cached_property
from fastapi import APIRouter, HTTPException
from fastapi import APIRouter, Depends, HTTPException
from pydantic import UUID4
from mealie.core.exceptions import mealie_registered_exceptions
@@ -8,12 +8,17 @@ from mealie.routes._base import BaseUserController, controller
from mealie.routes._base.mixins import HttpRepo
from mealie.schema import mapper
from mealie.schema.cookbook import CreateCookBook, ReadCookBook, RecipeCookBook, SaveCookBook, UpdateCookBook
from mealie.services.event_bus_service.event_bus_service import EventBusService
from mealie.services.event_bus_service.message_types import EventTypes
router = APIRouter(prefix="/groups/cookbooks", tags=["Groups: Cookbooks"])
@controller(router)
class GroupCookbookController(BaseUserController):
event_bus: EventBusService = Depends(EventBusService)
@cached_property
def repo(self):
return self.deps.repos.cookbooks.by_group(self.group_id)
@@ -41,7 +46,15 @@ class GroupCookbookController(BaseUserController):
@router.post("", response_model=ReadCookBook, status_code=201)
def create_one(self, data: CreateCookBook):
data = mapper.cast(data, SaveCookBook, group_id=self.group_id)
return self.mixins.create_one(data)
val = self.mixins.create_one(data)
if val:
self.event_bus.dispatch(
self.deps.acting_user.group_id,
EventTypes.cookbook_created,
msg=self.t("notifications.generic-created", name=val.name),
)
return val
@router.put("", response_model=list[ReadCookBook])
def update_many(self, data: list[UpdateCookBook]):
@@ -75,8 +88,23 @@ class GroupCookbookController(BaseUserController):
@router.put("/{item_id}", response_model=ReadCookBook)
def update_one(self, item_id: str, data: CreateCookBook):
return self.mixins.update_one(data, item_id) # type: ignore
val = self.mixins.update_one(data, item_id) # type: ignore
if val:
self.event_bus.dispatch(
self.deps.acting_user.group_id,
EventTypes.cookbook_updated,
msg=self.t("notifications.generic-updated", name=val.name),
)
return val
@router.delete("/{item_id}", response_model=ReadCookBook)
def delete_one(self, item_id: str):
return self.mixins.delete_one(item_id)
val = self.mixins.delete_one(item_id)
if val:
self.event_bus.dispatch(
self.deps.acting_user.group_id,
EventTypes.cookbook_deleted,
msg=self.t("notifications.generic-deleted", name=val.name),
)
return val

View File

@@ -28,6 +28,9 @@ item_router = APIRouter(prefix="/groups/shopping/items", tags=["Group: Shopping
@controller(item_router)
class ShoppingListItemController(BaseUserController):
event_bus: EventBusService = Depends(EventBusService)
@cached_property
def service(self):
return ShoppingListService(self.repos)
@@ -106,7 +109,7 @@ class ShoppingListController(BaseUserController):
# CRUD Operations
@cached_property
def mixins(self) -> HttpRepo:
def mixins(self) -> HttpRepo[ShoppingListCreate, ShoppingListOut, ShoppingListSave]:
return HttpRepo(self.repo, self.deps.logger, self.registered_exceptions, "An unexpected error occurred.")
@router.get("", response_model=list[ShoppingListSummary])
@@ -122,7 +125,7 @@ class ShoppingListController(BaseUserController):
self.event_bus.dispatch(
self.deps.acting_user.group_id,
EventTypes.shopping_list_created,
msg="A new shopping list has been created.",
msg=self.t("notifications.generic-created", name=val.name),
)
return val
@@ -133,11 +136,25 @@ class ShoppingListController(BaseUserController):
@router.put("/{item_id}", response_model=ShoppingListOut)
def update_one(self, item_id: UUID4, data: ShoppingListUpdate):
return self.mixins.update_one(data, item_id)
data = self.mixins.update_one(data, item_id) # type: ignore
if data:
self.event_bus.dispatch(
self.deps.acting_user.group_id,
EventTypes.shopping_list_updated,
msg=self.t("notifications.generic-updated", name=data.name),
)
return data
@router.delete("/{item_id}", response_model=ShoppingListOut)
def delete_one(self, item_id: UUID4):
return self.mixins.delete_one(item_id) # type: ignore
data = self.mixins.delete_one(item_id) # type: ignore
if data:
self.event_bus.dispatch(
self.deps.acting_user.group_id,
EventTypes.shopping_list_updated,
msg=self.t("notifications.generic-deleted", name=data.name),
)
return data
# =======================================================================
# Other Operations