diff --git a/app/repositories/users.py b/app/repositories/users.py index 8e38d04..3b6e638 100644 --- a/app/repositories/users.py +++ b/app/repositories/users.py @@ -43,3 +43,9 @@ def remove_user(user_id: str) -> User: def add_todo_to_user(todo: Todo, user: User) -> bool: user.tasks.append(todo) return True + + +def remove_todo_from_user(todo, user) -> bool: + index = user.tasks.index(todo) + user.tasks.pop(index) + return True diff --git a/app/schema/mutations/mutation.py b/app/schema/mutations/mutation.py index 2092135..d2c4e40 100644 --- a/app/schema/mutations/mutation.py +++ b/app/schema/mutations/mutation.py @@ -6,6 +6,7 @@ from app.schema.mutations.user import ( UpdateUser, DeleteUser, AssignTodoToUser, + DeassignTodoToUser, ) @@ -20,3 +21,4 @@ class Mutation(graphene.ObjectType): update_user = UpdateUser.Field() delete_user = DeleteUser.Field() assign_todo_to_user = AssignTodoToUser.Field() + deassign_todo_to_user = DeassignTodoToUser.Field() diff --git a/app/schema/mutations/user/__init__.py b/app/schema/mutations/user/__init__.py index 1f63ca8..8156a0b 100644 --- a/app/schema/mutations/user/__init__.py +++ b/app/schema/mutations/user/__init__.py @@ -1,4 +1,4 @@ from .create_user import CreateUser from .delete_user import DeleteUser from .update_user import UpdateUser -from .assign_todo_to_user import AssignTodoToUser +from .assign_todo_to_user import AssignTodoToUser, DeassignTodoToUser diff --git a/app/schema/mutations/user/assign_todo_to_user.py b/app/schema/mutations/user/assign_todo_to_user.py index 2c2e51d..aed00a0 100644 --- a/app/schema/mutations/user/assign_todo_to_user.py +++ b/app/schema/mutations/user/assign_todo_to_user.py @@ -1,7 +1,7 @@ import graphene from app.schema.types.response import ResponseField -from app.usecases.user import assign_todo_to_user +from app.usecases.user import assign_todo_to_user, deassign_todo_to_user class AssignTodoToUser(graphene.Mutation): @@ -18,3 +18,19 @@ class AssignTodoToUser(graphene.Mutation): return AssignTodoToUser( ResponseField(is_success=is_success, error_message=error_message) ) + + +class DeassignTodoToUser(graphene.Mutation): + class Arguments: + todo_id = graphene.String() + user_id = graphene.String() + + result = graphene.Field(ResponseField) + + def mutate(self, info, todo_id: str, user_id: str): + is_success = deassign_todo_to_user(user_id=user_id, todo_id=todo_id) + error_message = "Cannot deassign todo to user." if not is_success else None + + return AssignTodoToUser( + ResponseField(is_success=is_success, error_message=error_message) + ) diff --git a/app/usecases/user/__init__.py b/app/usecases/user/__init__.py index 8ef089f..0aaf3bc 100644 --- a/app/usecases/user/__init__.py +++ b/app/usecases/user/__init__.py @@ -1,4 +1,4 @@ -from .assign_todo_to_user import assign_todo_to_user +from .assign_todo_to_user import assign_todo_to_user, deassign_todo_to_user from .create_user import create_user from .delete_user import delete_user from .read_all_users import read_all_users diff --git a/app/usecases/user/assign_todo_to_user.py b/app/usecases/user/assign_todo_to_user.py index 2abdcba..70229fa 100644 --- a/app/usecases/user/assign_todo_to_user.py +++ b/app/usecases/user/assign_todo_to_user.py @@ -1,10 +1,10 @@ from app.models import User, Todo -from app.repositories.users import add_todo_to_user +from app.repositories.users import add_todo_to_user, remove_todo_from_user from app.usecases.todo import read_todo_by_id from app.usecases.user.read_user_by_id import read_user_by_id -def is_already_assigned(user: User, todo: Todo) -> bool: +def is_todo_assigned_to_user(user: User, todo: Todo) -> bool: return any([task == todo for task in user.tasks]) @@ -17,7 +17,22 @@ def assign_todo_to_user(user_id: str, todo_id: str) -> bool: if not is_success: return False - if is_already_assigned(user, todo): + if is_todo_assigned_to_user(user, todo): return False return add_todo_to_user(todo, user) + + +def deassign_todo_to_user(user_id: str, todo_id: str) -> bool: + user, is_success = read_user_by_id(user_id) + if not is_success: + return False + + todo, is_success = read_todo_by_id(todo_id) + if not is_success: + return False + + if not is_todo_assigned_to_user(user, todo): + return False + + return remove_todo_from_user(todo, user)