diff --git a/app/cruds/cruds_todos.py b/app/cruds/cruds_todos.py index c276ed851e..adc186acc7 100644 --- a/app/cruds/cruds_todos.py +++ b/app/cruds/cruds_todos.py @@ -11,10 +11,8 @@ async def get_items_by_user_id( db: AsyncSession, user_id: str, ) -> Sequence[models_todos.TodosItem]: - """ - Return all items from a given user - """ - + # On récupère tous les éléments TodosItem + # dont le user_id correspond à celui que l'on recherche result = await db.execute( select(models_todos.TodosItem).where( models_todos.TodosItem.user_id == user_id, @@ -23,35 +21,19 @@ async def get_items_by_user_id( return result.scalars().all() -async def get_item_by_id( - db: AsyncSession, - id: str, -) -> models_todos.TodosItem | None: - """ - Return an item by its id - """ - - result = await db.execute( - select(models_todos.TodosItem).where( - models_todos.TodosItem.id == id, - ) - ) - return result.scalars().first() - - async def create_item( db: AsyncSession, item: models_todos.TodosItem, ) -> models_todos.TodosItem: - """ - Create a new item - """ - + # Avec `db.add(item)` l'élément est placé tout seul dans la bonne table de la bdd. + # todo_item est en effet une instance du model : models_todos.TodosItem db.add(item) try: await db.commit() return item except IntegrityError as error: + # En cas d'erreur d'ajout de l'objet, on revient en arrière (rollback de la db) + # pour annuler les modifications de la db et on lève une erreur. await db.rollback() raise ValueError(error) @@ -61,9 +43,7 @@ async def edit_done_status( id: str, done: bool, ) -> None: - """ - Mark an item as done or not done - """ + # On met à jour le champ `done` de l'élément TodosItem await db.execute( update(models_todos.TodosItem) diff --git a/app/endpoints/todos.py b/app/endpoints/todos.py index 3c55785b1a..0263e5169c 100644 --- a/app/endpoints/todos.py +++ b/app/endpoints/todos.py @@ -10,6 +10,7 @@ from app.schemas import schemas_todos from app.utils.types.tags import Tags +# We create a router, an object used by FastAPI to route requests to the right endpoints router = APIRouter() @@ -54,7 +55,8 @@ async def create_todo( id=todo_id, creation=creation_time, user_id=user.id, - **item.dict(), # We add all informations contained in the schema, the operation is called unpacking + **item.dict(), # We add all informations contained in the schema, + # the operation is called unpacking ) try: res = await cruds_todos.create_item( @@ -63,7 +65,8 @@ async def create_todo( ) return res except ValueError as error: - # If we failed to create the object in the database, we send back a 400 error code with the detail of the error + # If we failed to create the object in the database, + # we send back a 400 error code with the detail of the error raise HTTPException(status_code=400, detail=str(error)) diff --git a/app/models/models_todos.py b/app/models/models_todos.py index 0707df28b0..807e20f25d 100644 --- a/app/models/models_todos.py +++ b/app/models/models_todos.py @@ -7,13 +7,21 @@ class TodosItem(Base): + # Le nom de la table dans la base de données est `todos_item` __tablename__ = "todos_item" + # `index=true` permet de retrouver plus rapidement + # les éléments par leur `id` ou `user_id` dans la base de données id: Mapped[str] = mapped_column(String, primary_key=True, index=True) + # user_id est une relationship de type ForeignKey, + # c'est à dire un champ qui fait référence au champ d'un autre model. + # Ici on fait référence au champ `id` du modèle `core_user` (défini dans le ficher models_core). user_id: Mapped[str] = mapped_column( ForeignKey("core_user.id"), nullable=False, index=True ) + # Le nom de l'élément ne peut pas être None avec `nullable=false` name: Mapped[str] = mapped_column(String, nullable=False) creation: Mapped[date] = mapped_column(Date, nullable=False) + # Au contraire, la deadline est optionnelle, elle peut donc contenir soit une `date` soit un objet `None` deadline: Mapped[date | None] = mapped_column(Date, nullable=True) done: Mapped[bool] = mapped_column(Boolean, nullable=False) diff --git a/app/schemas/schemas_todos.py b/app/schemas/schemas_todos.py index 0fb8804e48..1810e9854e 100644 --- a/app/schemas/schemas_todos.py +++ b/app/schemas/schemas_todos.py @@ -3,15 +3,18 @@ from pydantic import BaseModel +# Schema de base. Contiens toutes les données communes à tous les schemas class TodosItemBase(BaseModel): name: str deadline: date | None = None done: bool = False + # Required later to initiate schema using models class Config: orm_mode = True +# Format des données présente dans la base de donnée class TodosItemComplete(TodosItemBase): id: str user_id: str