diff --git a/app/main.py b/app/main.py index b785f78..d80c4eb 100644 --- a/app/main.py +++ b/app/main.py @@ -1,4 +1,5 @@ import graphene +import uvicorn from fastapi import FastAPI from starlette.graphql import GraphQLApp from starlette.middleware.cors import CORSMiddleware @@ -19,3 +20,7 @@ app.add_middleware( app.add_route( "/", GraphQLApp(schema=graphene.Schema(query=TodoQuery, mutation=Mutations)) ) + + +if __name__ == "__main__": + uvicorn.run("app.main:app", host="0.0.0.0", port=8000, reload=True) diff --git a/app/schema/mutations/create_todo.py b/app/schema/mutations/create_todo.py index c27ac2b..bb3d69c 100644 --- a/app/schema/mutations/create_todo.py +++ b/app/schema/mutations/create_todo.py @@ -12,4 +12,4 @@ class CreateTodo(graphene.Mutation): def mutate(self, info, title: str): todo = create_todo(title) - return CreateTodo(todo=todo) \ No newline at end of file + return CreateTodo(todo=todo) diff --git a/app/schema/mutations/delete_todo.py b/app/schema/mutations/delete_todo.py index b03419d..e525fa6 100644 --- a/app/schema/mutations/delete_todo.py +++ b/app/schema/mutations/delete_todo.py @@ -12,4 +12,4 @@ class DeleteTodo(graphene.Mutation): def mutate(self, info, todo_id: str): todo = delete_todo(todo_id) - return DeleteTodo(todo=todo) \ No newline at end of file + return DeleteTodo(todo=todo) diff --git a/app/schema/mutations/update_todo.py b/app/schema/mutations/update_todo.py index 30ef667..38c88d4 100644 --- a/app/schema/mutations/update_todo.py +++ b/app/schema/mutations/update_todo.py @@ -13,4 +13,4 @@ class UpdateTodo(graphene.Mutation): def mutate(self, info, todo: Todo): res = update_todo(todo.todo_id, todo.__dict__) - return UpdateTodo(todo=res) \ No newline at end of file + return UpdateTodo(todo=res) diff --git a/app/schema/queries/todo.py b/app/schema/queries/todo.py index 9016352..cd4a50a 100644 --- a/app/schema/queries/todo.py +++ b/app/schema/queries/todo.py @@ -1,9 +1,6 @@ -from typing import List - import graphene -from app.models.todo import Todo -from app.schema.types.todo import TodoType, TodoResponseField +from app.schema.types.todo import TodoResponseField, TodoListResponseField from app.usecases import read_all_todos, read_todo_by_id @@ -11,18 +8,29 @@ class TodoQuery(graphene.ObjectType): """ Defines the query and how to interact with """ - list_todos = graphene.Field(graphene.List(TodoType)) - def resolve_list_todos(self, info) -> List[Todo]: - return read_all_todos() + list_todos = graphene.Field(TodoListResponseField) - get_todo = graphene.Field(TodoResponseField, - todo_id=graphene.String(required=True)) + def resolve_list_todos(self, info) -> TodoListResponseField: + try: + todos = read_all_todos() + is_success = True + error_message = None + except Exception as e: + error_message = str(e) + is_success = False + todos = None + + return TodoListResponseField( + todos=todos, is_success=is_success, error_message=error_message + ) + + get_todo = graphene.Field(TodoResponseField, todo_id=graphene.String(required=True)) def resolve_get_todo(self, info, todo_id: str) -> TodoResponseField: todo, is_success = read_todo_by_id(todo_id) error_message = "This element does not exist." if not is_success else None - return TodoResponseField(todo=todo, - is_success=is_success, - error_message=error_message) + return TodoResponseField( + todo=todo, is_success=is_success, error_message=error_message + ) diff --git a/app/schema/types/todo.py b/app/schema/types/todo.py index 624b9ca..d80dd5d 100644 --- a/app/schema/types/todo.py +++ b/app/schema/types/todo.py @@ -28,3 +28,11 @@ class ResponseField(graphene.ObjectType): class TodoResponseField(ResponseField): todo = graphene.Field(TodoType) + + +class TodoListResponseField(ResponseField): + todos = graphene.Field(graphene.List(TodoType)) + + +class CreateTodoResponseField(ResponseField): + todo = graphene.Field(TodoType) diff --git a/app/usecases/__init__.py b/app/usecases/__init__.py index 065e235..c076bc3 100644 --- a/app/usecases/__init__.py +++ b/app/usecases/__init__.py @@ -2,3 +2,4 @@ from .create_todo import create_todo from .delete_todo import delete_todo from .read_all_todos import read_all_todos from .read_todo_by_id import read_todo_by_id +from .update_todo import update_todo diff --git a/app/usecases/delete_todo.py b/app/usecases/delete_todo.py index ed32c46..54c8dd7 100644 --- a/app/usecases/delete_todo.py +++ b/app/usecases/delete_todo.py @@ -1,6 +1,7 @@ +from app.models.todo import Todo from app.repositories.todos import todo_exists, remove_todo -def delete_todo(todo_id: str) -> None: +def delete_todo(todo_id: str) -> Todo: if todo_exists(todo_id): return remove_todo(todo_id) diff --git a/app/usecases/update_todo.py b/app/usecases/update_todo.py index d9ef99b..3ff285d 100644 --- a/app/usecases/update_todo.py +++ b/app/usecases/update_todo.py @@ -5,4 +5,4 @@ from app.repositories.todos import edit_todo, todo_exists def update_todo(todo_id: str, data) -> Todo: if todo_exists(todo_id): return edit_todo(todo_id, data) - return None \ No newline at end of file + return None