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