from typing import Any from ..connection import connect from .ensure_player_id_column import ensure_player_id_column from .resolve_row_player_key import PLAYER_SHARED, resolve_row_player_key def get_row( slug: str, definition: dict[str, Any], row_id: int, player_id: str = PLAYER_SHARED ) -> dict[str, Any] | None: """Filtre aussi par player_id (pas seulement id) : même si `row_id` est déjà un identifiant unique dans toute la table, ce garde-fou empêche un joueur de lire la ligne d'un AUTRE joueur en devinant/altérant un row_id (garantie utile dès qu'un objet per_player est exposé sur la route publique /jouer/, voir routes/public_play/).""" ensure_player_id_column(slug, definition["table_name"]) key = resolve_row_player_key(definition, player_id) conn = connect(slug) row = conn.execute( f"SELECT * FROM {definition['table_name']} WHERE id = ? AND player_id = ?", # nosec B608 # noqa: S608 - table_name vient de slugify()+prefixe obj_, jamais d'une entree brute ; valeurs parametrees (?) (row_id, key), ).fetchone() conn.close() return dict(row) if row else None