diff --git a/app/models/__init__.py b/app/models/__init__.py index e69de29..d478f39 100644 --- a/app/models/__init__.py +++ b/app/models/__init__.py @@ -0,0 +1,2 @@ +from .todo import Todo +from .user import User diff --git a/app/repositories/users.py b/app/repositories/users.py index 0fa5998..8e38d04 100644 --- a/app/repositories/users.py +++ b/app/repositories/users.py @@ -1,8 +1,10 @@ from typing import List -from app.models.user import User +from app.models import Todo, User -user_list: List[User] = [User("id", "Jane Doe"), User(username="John Doe")] +jane = User("id", "Jane Doe") +jane.tasks = [Todo(title="Test")] +user_list: List[User] = [jane, User(username="John Doe")] def get_all_users() -> List[User]: @@ -36,3 +38,8 @@ def remove_user(user_id: str) -> User: user = get_user_by_id(user_id) index = user_list.index(user) return user_list.pop(index) + + +def add_todo_to_user(todo: Todo, user: User) -> bool: + user.tasks.append(todo) + return True diff --git a/app/schema/mutations/mutation.py b/app/schema/mutations/mutation.py index a11941e..2092135 100644 --- a/app/schema/mutations/mutation.py +++ b/app/schema/mutations/mutation.py @@ -1,7 +1,12 @@ import graphene from app.schema.mutations.todo import CreateTodo, DeleteTodo, CloseTodo, UpdateTodo -from app.schema.mutations.user import CreateUser, UpdateUser, DeleteUser +from app.schema.mutations.user import ( + CreateUser, + UpdateUser, + DeleteUser, + AssignTodoToUser, +) class Mutation(graphene.ObjectType): @@ -14,3 +19,4 @@ class Mutation(graphene.ObjectType): create_user = CreateUser.Field() update_user = UpdateUser.Field() delete_user = DeleteUser.Field() + assign_todo_to_user = AssignTodoToUser.Field() diff --git a/app/schema/mutations/todo/close_todo.py b/app/schema/mutations/todo/close_todo.py index 5b9586a..2eb4a25 100644 --- a/app/schema/mutations/todo/close_todo.py +++ b/app/schema/mutations/todo/close_todo.py @@ -1,7 +1,7 @@ import graphene from app.schema.types.todo import TodoResponseField -from app.usecases.todo.close_todo import close_todo +from app.usecases.todo import close_todo class CloseTodo(graphene.Mutation): diff --git a/app/schema/mutations/todo/create_todo.py b/app/schema/mutations/todo/create_todo.py index dc416fc..a0875c8 100644 --- a/app/schema/mutations/todo/create_todo.py +++ b/app/schema/mutations/todo/create_todo.py @@ -1,7 +1,7 @@ import graphene from app.schema.types.todo import TodoResponseField -from app.usecases import create_todo +from app.usecases.todo import create_todo class CreateTodo(graphene.Mutation): diff --git a/app/schema/mutations/todo/delete_todo.py b/app/schema/mutations/todo/delete_todo.py index fabe525..6daeeee 100644 --- a/app/schema/mutations/todo/delete_todo.py +++ b/app/schema/mutations/todo/delete_todo.py @@ -1,7 +1,7 @@ import graphene from app.schema.types.todo import TodoResponseField -from app.usecases import delete_todo +from app.usecases.todo import delete_todo class DeleteTodo(graphene.Mutation): diff --git a/app/schema/mutations/todo/update_todo.py b/app/schema/mutations/todo/update_todo.py index dbe2664..dc47494 100644 --- a/app/schema/mutations/todo/update_todo.py +++ b/app/schema/mutations/todo/update_todo.py @@ -2,7 +2,7 @@ import graphene from app.models.todo import Todo from app.schema.types.todo import TodoInputType, TodoResponseField -from app.usecases import update_todo +from app.usecases.todo import update_todo class UpdateTodo(graphene.Mutation): diff --git a/app/schema/mutations/user/__init__.py b/app/schema/mutations/user/__init__.py index 98b8b56..1f63ca8 100644 --- a/app/schema/mutations/user/__init__.py +++ b/app/schema/mutations/user/__init__.py @@ -1,3 +1,4 @@ from .create_user import CreateUser from .delete_user import DeleteUser from .update_user import UpdateUser +from .assign_todo_to_user import AssignTodoToUser diff --git a/app/schema/mutations/user/assign_todo_to_user.py b/app/schema/mutations/user/assign_todo_to_user.py new file mode 100644 index 0000000..2c2e51d --- /dev/null +++ b/app/schema/mutations/user/assign_todo_to_user.py @@ -0,0 +1,20 @@ +import graphene + +from app.schema.types.response import ResponseField +from app.usecases.user import assign_todo_to_user + + +class AssignTodoToUser(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 = assign_todo_to_user(user_id=user_id, todo_id=todo_id) + error_message = "Cannot assign todo to user." if not is_success else None + + return AssignTodoToUser( + ResponseField(is_success=is_success, error_message=error_message) + ) diff --git a/app/schema/mutations/user/create_user.py b/app/schema/mutations/user/create_user.py index 0697c84..0b27f90 100644 --- a/app/schema/mutations/user/create_user.py +++ b/app/schema/mutations/user/create_user.py @@ -1,7 +1,7 @@ import graphene from app.schema.types.user import UserResponseField -from app.usecases.user.create_user import create_user +from app.usecases.user import create_user class CreateUser(graphene.Mutation): diff --git a/app/schema/mutations/user/delete_user.py b/app/schema/mutations/user/delete_user.py index b645427..19660ce 100644 --- a/app/schema/mutations/user/delete_user.py +++ b/app/schema/mutations/user/delete_user.py @@ -1,7 +1,7 @@ import graphene from app.schema.types.user import UserResponseField -from app.usecases.user.delete_user import delete_user +from app.usecases.user import delete_user class DeleteUser(graphene.Mutation): diff --git a/app/schema/mutations/user/update_user.py b/app/schema/mutations/user/update_user.py index 837ed37..876713c 100644 --- a/app/schema/mutations/user/update_user.py +++ b/app/schema/mutations/user/update_user.py @@ -2,7 +2,7 @@ import graphene from app.models.user import User from app.schema.types.user import UserInputType, UserResponseField -from app.usecases.user.update_user import update_user +from app.usecases.user import update_user class UpdateUser(graphene.Mutation): diff --git a/app/schema/queries/todo.py b/app/schema/queries/todo.py index 2608c94..d2d9efa 100644 --- a/app/schema/queries/todo.py +++ b/app/schema/queries/todo.py @@ -3,7 +3,7 @@ Defines the query and how to interact with """ from app.schema.types.todo import TodoResponseField, TodoListResponseField -from app.usecases import read_all_todos, read_todo_by_id +from app.usecases.todo import read_all_todos, read_todo_by_id def resolve_list_todos(self, info) -> TodoListResponseField: diff --git a/app/schema/queries/user.py b/app/schema/queries/user.py index 82486a8..5c773f6 100644 --- a/app/schema/queries/user.py +++ b/app/schema/queries/user.py @@ -1,6 +1,5 @@ from app.schema.types.user import UserListResponseField, UserResponseField -from app.usecases.user.read_all_users import read_all_users -from app.usecases.user.read_user_by_id import read_user_by_id +from app.usecases.user import read_all_users, read_user_by_id def resolve_list_users(self, info): @@ -9,5 +8,5 @@ def resolve_list_users(self, info): def resolve_get_user(self, info, user_id: str): - user = read_user_by_id(user_id) + user, _ = read_user_by_id(user_id) return UserResponseField(user=user) diff --git a/app/schema/types/user.py b/app/schema/types/user.py index 736dd17..fded72b 100644 --- a/app/schema/types/user.py +++ b/app/schema/types/user.py @@ -1,11 +1,13 @@ import graphene from app.schema.types.response import ResponseField +from app.schema.types.todo import TodoType class UserType(graphene.ObjectType): user_id = graphene.String() username = graphene.String() + tasks = graphene.List(TodoType) class UserInputType(graphene.InputObjectType): diff --git a/app/usecases/__init__.py b/app/usecases/__init__.py index eca73bb..e69de29 100644 --- a/app/usecases/__init__.py +++ b/app/usecases/__init__.py @@ -1,6 +0,0 @@ -from app.usecases.todo.close_todo import close_todo -from app.usecases.todo.create_todo import create_todo -from app.usecases.todo.delete_todo import delete_todo -from app.usecases.todo.read_all_todos import read_all_todos -from app.usecases.todo.read_todo_by_id import read_todo_by_id -from app.usecases.todo.update_todo import update_todo diff --git a/app/usecases/todo/__init__.py b/app/usecases/todo/__init__.py index e69de29..eca73bb 100644 --- a/app/usecases/todo/__init__.py +++ b/app/usecases/todo/__init__.py @@ -0,0 +1,6 @@ +from app.usecases.todo.close_todo import close_todo +from app.usecases.todo.create_todo import create_todo +from app.usecases.todo.delete_todo import delete_todo +from app.usecases.todo.read_all_todos import read_all_todos +from app.usecases.todo.read_todo_by_id import read_todo_by_id +from app.usecases.todo.update_todo import update_todo diff --git a/app/usecases/user/__init__.py b/app/usecases/user/__init__.py index e69de29..8ef089f 100644 --- a/app/usecases/user/__init__.py +++ b/app/usecases/user/__init__.py @@ -0,0 +1,6 @@ +from .assign_todo_to_user import assign_todo_to_user +from .create_user import create_user +from .delete_user import delete_user +from .read_all_users import read_all_users +from .read_user_by_id import read_user_by_id +from .update_user import update_user diff --git a/app/usecases/user/assign_todo_to_user.py b/app/usecases/user/assign_todo_to_user.py new file mode 100644 index 0000000..09b8c40 --- /dev/null +++ b/app/usecases/user/assign_todo_to_user.py @@ -0,0 +1,15 @@ +from app.repositories.users import add_todo_to_user +from app.usecases.todo import read_todo_by_id +from app.usecases.user.read_user_by_id import read_user_by_id + + +def assign_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 + + return add_todo_to_user(todo, user) diff --git a/app/usecases/user/read_user_by_id.py b/app/usecases/user/read_user_by_id.py index 939a658..afef6e7 100644 --- a/app/usecases/user/read_user_by_id.py +++ b/app/usecases/user/read_user_by_id.py @@ -1,6 +1,11 @@ +from typing import Tuple + from app.models.user import User from app.repositories.users import get_user_by_id -def read_user_by_id(user_id: str) -> User: - return get_user_by_id(user_id) +def read_user_by_id(user_id: str) -> Tuple[User, bool]: + try: + return get_user_by_id(user_id), True + except IndexError: + return None, False