Files
ENI-PythonAdvanced_14/src/app/graphql/resolvers/user_resolver.py
2025-12-18 14:52:33 +01:00

37 lines
1.6 KiB
Python

import strawberry
from strawberry import Info
from app.core.exceptions import AuthZException, NotFoundBLLException
# Par simplification, nos resolvers consomment directement la couche DAL, mais dans une vraie application, il faudrait passer par une couche BLL (Services).
from app.repositories import fake_db_repo
from app.graphql.resolvers.auth_helper import get_current_user_from_info
from app.models.notemodel import NoteModel
from app.models.usermodel import UserModel
async def get_user_by_id(info: Info, id: strawberry.ID) -> UserModel:
""" Resolver pour le champ 'user(id: ID!)'. """
# TODO 2.2: Récupérer le current_user (get_current_user_from_info)
user_to_view = await fake_db_repo.get_user_by_id(int(id))
if not user_to_view:
raise NotFoundBLLException(resource_name="User", resource_id=id)
# TODO 2.2: Implémenter le contrôle d'accès (A01)
# Règle : admin OU 'is_self'
# Lever AuthZException si l'accès est refusé
return user_to_view
async def get_note_owner_resolver(root: NoteModel, info: Info) -> UserModel:
""" Resolver pour le champ imbriqué 'Note.owner'. """
# 'root' est l'objet 'Note' parent
owner = await fake_db_repo.get_user_by_id(root.owner_id)
if not owner:
raise NotFoundBLLException(resource_name="User", resource_id=root.owner_id)
# TODO 2.3: (Défense en profondeur)
# Problème : 'owner' contient des champs sensibles (email).
# Retourner un UserModel, mais avec l'email masqué (ex: "[Redacted]").
return owner # INSECURE: retourne l'objet complet avec l'email