mirror of
https://github.com/mealie-recipes/mealie.git
synced 2026-02-04 06:53:12 -05:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user