diff --git a/app/config/app.py b/app/config/app.py index 2c0d34d..1442408 100644 --- a/app/config/app.py +++ b/app/config/app.py @@ -4,7 +4,7 @@ from starlette.graphql import GraphQLApp from starlette.middleware.cors import CORSMiddleware from app.schema.mutations.mutations import Mutations -from app.schema.queries.todo import TodoQuery +from app.schema.queries.queries import Query origins = ["*"] methods = ["*"] @@ -21,7 +21,7 @@ def create_app() -> FastAPI: allow_headers=headers, ) app.add_route( - "/", GraphQLApp(schema=graphene.Schema(query=TodoQuery, mutation=Mutations)) + "/", GraphQLApp(schema=graphene.Schema(query=Query, mutation=Mutations)) ) return app diff --git a/app/models/user.py b/app/models/user.py new file mode 100644 index 0000000..2dcfd74 --- /dev/null +++ b/app/models/user.py @@ -0,0 +1,8 @@ +from uuid import uuid4 + + +class User: + def __init__(self, user_id: str = None, username: str = "X"): + self.user_id = user_id or uuid4() + self.username = username + self.tasks = [] diff --git a/app/repositories/users.py b/app/repositories/users.py new file mode 100644 index 0000000..c0c71c5 --- /dev/null +++ b/app/repositories/users.py @@ -0,0 +1,40 @@ +from typing import List + +from app.models.user import User + +user_list: List[User] = [User("id", "Jane Doe"), User(username="John Doe")] + + +def get_all_users() -> List[User]: + return user_list + + +def get_user_by_id(user_id: str) -> User: + return [user for user in user_list if user.user_id == user_id][0] + + +def add_user(username: str) -> User: + user = User(username=username) + user_list.append(user) + return user + + +def edit_user(user_id: str, data) -> User: + user = get_user_by_id(user_id) + + if title := data.get("title"): + user.title = title + if is_done := data.get("is_done"): + user.is_done = is_done + + return user + + +def user_exists(user_id: str) -> bool: + return any([user.user_id == user_id for user in user_list]) + + +def remove_user(user_id: str) -> User: + user = get_user_by_id(user_id) + index = user_list.index(user) + return user_list.pop(index) diff --git a/app/schema/mutations/close_todo.py b/app/schema/mutations/close_todo.py index 0489dd9..136607d 100644 --- a/app/schema/mutations/close_todo.py +++ b/app/schema/mutations/close_todo.py @@ -1,7 +1,7 @@ import graphene from app.schema.types.todo import TodoType -from app.usecases.close_todo import close_todo +from app.usecases.todo.close_todo import close_todo class CloseTodo(graphene.Mutation): diff --git a/app/schema/queries/queries.py b/app/schema/queries/queries.py new file mode 100644 index 0000000..7915100 --- /dev/null +++ b/app/schema/queries/queries.py @@ -0,0 +1,28 @@ +import graphene + +from app.schema.types.todo import TodoListResponseField, TodoResponseField +from .todo import resolve_get_todo, resolve_list_todos +from .user import resolve_list_users, resolve_get_user +from ..types.user import UserListResponseField, UserResponseField + + +class Query(graphene.ObjectType): + """Schema Queries""" + + """Task Queries""" + list_todos = graphene.Field(TodoListResponseField, resolver=resolve_list_todos) + + get_todo = graphene.Field( + TodoResponseField, + todo_id=graphene.String(required=True), + resolver=resolve_get_todo, + ) + + """User Queries""" + list_users = graphene.Field(UserListResponseField, resolver=resolve_list_users) + + get_user = graphene.Field( + UserResponseField, + user_id=graphene.String(required=True), + resolver=resolve_get_user, + ) diff --git a/app/schema/queries/todo.py b/app/schema/queries/todo.py index cd4a50a..2608c94 100644 --- a/app/schema/queries/todo.py +++ b/app/schema/queries/todo.py @@ -1,36 +1,30 @@ -import graphene +""" +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 -class TodoQuery(graphene.ObjectType): - """ - Defines the query and how to interact with - """ +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 - list_todos = graphene.Field(TodoListResponseField) + return TodoListResponseField( + todos=todos, is_success=is_success, error_message=error_message + ) - 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 - ) +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 - 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/queries/user.py b/app/schema/queries/user.py new file mode 100644 index 0000000..82486a8 --- /dev/null +++ b/app/schema/queries/user.py @@ -0,0 +1,13 @@ +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 + + +def resolve_list_users(self, info): + users = read_all_users() + return UserListResponseField(users=users) + + +def resolve_get_user(self, info, user_id: str): + user = read_user_by_id(user_id) + return UserResponseField(user=user) diff --git a/app/schema/types/response.py b/app/schema/types/response.py new file mode 100644 index 0000000..eab61b3 --- /dev/null +++ b/app/schema/types/response.py @@ -0,0 +1,6 @@ +import graphene + + +class ResponseField(graphene.ObjectType): + is_success = graphene.Boolean(default_value=True) + error_message = graphene.String() diff --git a/app/schema/types/todo.py b/app/schema/types/todo.py index d80dd5d..46091a9 100644 --- a/app/schema/types/todo.py +++ b/app/schema/types/todo.py @@ -1,5 +1,7 @@ import graphene +from app.schema.types.response import ResponseField + class TodoType(graphene.ObjectType): """ @@ -21,11 +23,6 @@ class TodoInputType(graphene.InputObjectType): is_done = graphene.Boolean(default_value=False) -class ResponseField(graphene.ObjectType): - is_success = graphene.Boolean(default_value=True) - error_message = graphene.String() - - class TodoResponseField(ResponseField): todo = graphene.Field(TodoType) diff --git a/app/schema/types/user.py b/app/schema/types/user.py new file mode 100644 index 0000000..43c2e1b --- /dev/null +++ b/app/schema/types/user.py @@ -0,0 +1,16 @@ +import graphene + +from app.schema.types.response import ResponseField + + +class UserType(graphene.ObjectType): + user_id = graphene.String() + username = graphene.String() + + +class UserListResponseField(ResponseField): + users = graphene.List(UserType) + + +class UserResponseField(ResponseField): + user = graphene.Field(UserType) diff --git a/app/usecases/__init__.py b/app/usecases/__init__.py index c076bc3..eca73bb 100644 --- a/app/usecases/__init__.py +++ b/app/usecases/__init__.py @@ -1,5 +1,6 @@ -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 +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 new file mode 100644 index 0000000..e69de29 diff --git a/app/usecases/close_todo.py b/app/usecases/todo/close_todo.py similarity index 100% rename from app/usecases/close_todo.py rename to app/usecases/todo/close_todo.py diff --git a/app/usecases/create_todo.py b/app/usecases/todo/create_todo.py similarity index 100% rename from app/usecases/create_todo.py rename to app/usecases/todo/create_todo.py diff --git a/app/usecases/delete_todo.py b/app/usecases/todo/delete_todo.py similarity index 100% rename from app/usecases/delete_todo.py rename to app/usecases/todo/delete_todo.py diff --git a/app/usecases/read_all_todos.py b/app/usecases/todo/read_all_todos.py similarity index 100% rename from app/usecases/read_all_todos.py rename to app/usecases/todo/read_all_todos.py diff --git a/app/usecases/read_todo_by_id.py b/app/usecases/todo/read_todo_by_id.py similarity index 100% rename from app/usecases/read_todo_by_id.py rename to app/usecases/todo/read_todo_by_id.py diff --git a/app/usecases/update_todo.py b/app/usecases/todo/update_todo.py similarity index 100% rename from app/usecases/update_todo.py rename to app/usecases/todo/update_todo.py diff --git a/app/usecases/user/__init__.py b/app/usecases/user/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/usecases/user/read_all_users.py b/app/usecases/user/read_all_users.py new file mode 100644 index 0000000..e0d04b3 --- /dev/null +++ b/app/usecases/user/read_all_users.py @@ -0,0 +1,8 @@ +from typing import List + +from app.models.user import User +from app.repositories.users import get_all_users + + +def read_all_users() -> List[User]: + return get_all_users() diff --git a/app/usecases/user/read_user_by_id.py b/app/usecases/user/read_user_by_id.py new file mode 100644 index 0000000..939a658 --- /dev/null +++ b/app/usecases/user/read_user_by_id.py @@ -0,0 +1,6 @@ +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)