37 lines
1.6 KiB
Python
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 |