diff --git a/frontend/src/pages/Admin/Dashboard/EventViewer.vue b/frontend/src/pages/Admin/Dashboard/EventViewer.vue index 417fe1a17..0173de680 100644 --- a/frontend/src/pages/Admin/Dashboard/EventViewer.vue +++ b/frontend/src/pages/Admin/Dashboard/EventViewer.vue @@ -67,7 +67,7 @@ export default { color: "primary", }, backup: { - icon: "mdi-backup-restore", + icon: "mdi-database", color: "primary", }, schedule: { @@ -78,9 +78,13 @@ export default { icon: "mdi-database-import", color: "primary", }, - signup: { + user: { icon: "mdi-account", - color: "primary", + color: "accent", + }, + group: { + icon: "mdi-account-group-outline", + color: "accent", }, }, }; diff --git a/mealie/routes/backup_routes.py b/mealie/routes/backup_routes.py index d4fef6c35..1e0917ecf 100644 --- a/mealie/routes/backup_routes.py +++ b/mealie/routes/backup_routes.py @@ -90,7 +90,7 @@ def import_database(file_name: str, import_data: ImportJob, session: Session = D force_import=import_data.force, rebase=import_data.rebase, ) - create_backup_event("Database Restore", f"Restored Database File {file_name}", session) + create_backup_event("Database Restore", f"Restore File: {file_name}", session) return db_import diff --git a/mealie/routes/groups/crud.py b/mealie/routes/groups/crud.py index 81262697d..b4a43ed51 100644 --- a/mealie/routes/groups/crud.py +++ b/mealie/routes/groups/crud.py @@ -1,8 +1,9 @@ -from fastapi import APIRouter, Depends, status, HTTPException +from fastapi import APIRouter, Depends, HTTPException, status from mealie.db.database import db from mealie.db.db_setup import generate_session from mealie.routes.deps import get_current_user from mealie.schema.user import GroupBase, GroupInDB, UpdateGroup, UserInDB +from mealie.services.events import create_group_event from sqlalchemy.orm.session import Session router = APIRouter(prefix="/api/groups", tags=["Groups"]) @@ -39,6 +40,7 @@ async def create_group( try: db.groups.create(session, group_data.dict()) + create_group_event("Group Created", f"'{group_data.name}' created") except Exception: raise HTTPException(status.HTTP_400_BAD_REQUEST) @@ -68,7 +70,8 @@ async def delete_user_group( if not group: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="GROUP_NOT_FOUND") - if not group.users == []: + if group.users != []: raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail="GROUP_WITH_USERS") + create_group_event("Group Deleted", f"'{group.name}' Deleted") db.groups.delete(session, id) diff --git a/mealie/routes/mealplans/crud.py b/mealie/routes/mealplans/crud.py index 5cff2c2ab..b3fe00f5a 100644 --- a/mealie/routes/mealplans/crud.py +++ b/mealie/routes/mealplans/crud.py @@ -4,6 +4,7 @@ from mealie.db.db_setup import generate_session from mealie.routes.deps import get_current_user from mealie.schema.meal import MealPlanIn, MealPlanInDB from mealie.schema.user import GroupInDB, UserInDB +from mealie.services.events import create_group_event from mealie.services.image import image from mealie.services.meal_services import get_todays_meal, process_meals from sqlalchemy.orm.session import Session @@ -24,10 +25,11 @@ def get_all_meals( @router.post("/create", status_code=status.HTTP_201_CREATED) def create_meal_plan( - data: MealPlanIn, session: Session = Depends(generate_session), current_user=Depends(get_current_user) + data: MealPlanIn, session: Session = Depends(generate_session), current_user: UserInDB = Depends(get_current_user) ): """ Creates a meal plan database entry """ processed_plan = process_meals(session, data) + create_group_event("Meal Plan Created", f"Mealplan Created for '{current_user.group}'") return db.meals.create(session, processed_plan.dict()) @@ -36,23 +38,29 @@ def update_meal_plan( plan_id: str, meal_plan: MealPlanIn, session: Session = Depends(generate_session), - current_user=Depends(get_current_user), + current_user: UserInDB = Depends(get_current_user), ): """ Updates a meal plan based off ID """ processed_plan = process_meals(session, meal_plan) processed_plan = MealPlanInDB(uid=plan_id, **processed_plan.dict()) try: db.meals.update(session, plan_id, processed_plan.dict()) + create_group_event("Meal Plan Updated", f"Mealplan Updated for '{current_user.group}'") except Exception: raise HTTPException(status.HTTP_400_BAD_REQUEST) @router.delete("/{plan_id}") -def delete_meal_plan(plan_id, session: Session = Depends(generate_session), current_user=Depends(get_current_user)): +def delete_meal_plan( + plan_id, + session: Session = Depends(generate_session), + current_user: UserInDB = Depends(get_current_user), +): """ Removes a meal plan from the database """ try: db.meals.delete(session, plan_id) + create_group_event("Meal Plan Deleted", f"Mealplan Deleted for '{current_user.group}'") except Exception: raise HTTPException(status.HTTP_400_BAD_REQUEST) diff --git a/mealie/routes/users/auth.py b/mealie/routes/users/auth.py index 555abf3be..0780556f7 100644 --- a/mealie/routes/users/auth.py +++ b/mealie/routes/users/auth.py @@ -1,4 +1,4 @@ -from fastapi import APIRouter, Depends, status +from fastapi import APIRouter, Depends, Request, status from fastapi.exceptions import HTTPException from fastapi.security import OAuth2PasswordRequestForm from mealie.core import security @@ -6,6 +6,7 @@ from mealie.core.security import authenticate_user from mealie.db.db_setup import generate_session from mealie.routes.deps import get_current_user from mealie.schema.user import UserInDB +from mealie.services.events import create_user_event from sqlalchemy.orm.session import Session router = APIRouter(prefix="/api/auth", tags=["Authentication"]) @@ -14,6 +15,7 @@ router = APIRouter(prefix="/api/auth", tags=["Authentication"]) @router.post("/token/long") @router.post("/token") def get_token( + request: Request, data: OAuth2PasswordRequestForm = Depends(), session: Session = Depends(generate_session), ): @@ -23,6 +25,7 @@ def get_token( user = authenticate_user(session, email, password) if not user: + create_user_event("Failed Login", f"Username: {email}, Source IP: '{request.client.host}'") raise HTTPException( status_code=status.HTTP_401_UNAUTHORIZED, headers={"WWW-Authenticate": "Bearer"}, diff --git a/mealie/routes/users/crud.py b/mealie/routes/users/crud.py index 63d11dbdb..ab0a2ea3b 100644 --- a/mealie/routes/users/crud.py +++ b/mealie/routes/users/crud.py @@ -9,7 +9,7 @@ from mealie.db.database import db from mealie.db.db_setup import generate_session from mealie.routes.deps import get_current_user from mealie.schema.user import ChangePassword, UserBase, UserIn, UserInDB, UserOut -from mealie.services.events import create_sign_up_event +from mealie.services.events import create_user_event from sqlalchemy.orm.session import Session router = APIRouter(prefix="/api/users", tags=["Users"]) @@ -23,7 +23,7 @@ async def create_user( ): new_user.password = get_password_hash(new_user.password) - create_sign_up_event("User Created", f"Created by {current_user.full_name}", session=session) + create_user_event("User Created", f"Created by {current_user.full_name}", session=session) return db.users.create(session, new_user.dict()) @@ -150,5 +150,6 @@ async def delete_user( if current_user.id == id or current_user.admin: try: db.users.delete(session, id) + create_user_event("User Deleted", f"User ID: {id}", session=session) except Exception: raise HTTPException(status.HTTP_400_BAD_REQUEST) diff --git a/mealie/routes/users/sign_up.py b/mealie/routes/users/sign_up.py index 9d6bdaf79..c0cb386b6 100644 --- a/mealie/routes/users/sign_up.py +++ b/mealie/routes/users/sign_up.py @@ -7,7 +7,7 @@ from mealie.db.db_setup import generate_session from mealie.routes.deps import get_current_user from mealie.schema.sign_up import SignUpIn, SignUpOut, SignUpToken from mealie.schema.user import UserIn, UserInDB -from mealie.services.events import create_sign_up_event +from mealie.services.events import create_user_event from sqlalchemy.orm.session import Session router = APIRouter(prefix="/api/users/sign-ups", tags=["User Signup"]) @@ -39,7 +39,7 @@ async def create_user_sign_up_key( "name": key_data.name, "admin": key_data.admin, } - create_sign_up_event("Sign-up Token Created", f"Created by {current_user.full_name}", session=session) + create_user_event("Sign-up Token Created", f"Created by {current_user.full_name}", session=session) return db.sign_ups.create(session, sign_up) @@ -62,7 +62,7 @@ async def create_user_with_token( db.users.create(session, new_user.dict()) # DeleteToken - create_sign_up_event("Sign-up Token Used", f"New User {new_user.full_name}", session=session) + create_user_event("Sign-up Token Used", f"New User {new_user.full_name}", session=session) db.sign_ups.delete(session, token) diff --git a/mealie/schema/events.py b/mealie/schema/events.py index 5ee4e8a77..b5ae23b9c 100644 --- a/mealie/schema/events.py +++ b/mealie/schema/events.py @@ -12,7 +12,8 @@ class EventCategory(str, Enum): backup = "backup" scheduled = "scheduled" migration = "migration" - sign_up = "signup" + group = "group" + user = "user" class Event(CamelModel): diff --git a/mealie/services/events.py b/mealie/services/events.py index b47edf5dc..3cd9d5bf0 100644 --- a/mealie/services/events.py +++ b/mealie/services/events.py @@ -35,6 +35,11 @@ def create_migration_event(title, text, session=None): save_event(title=title, text=text, category=category, session=session) -def create_sign_up_event(title, text, session=None): - category = EventCategory.sign_up +def create_group_event(title, text, session=None): + category = EventCategory.group + save_event(title=title, text=text, category=category, session=session) + + +def create_user_event(title, text, session=None): + category = EventCategory.user save_event(title=title, text=text, category=category, session=session)