from ..connection import connect from .constants import QUEST_STATUS_CHOICES, QUEST_RESULT_CHOICES from .ensure_quests_schema import ensure_quests_schema from .get_quest import get_quest def update_quest(slug, quest_id, fields): """Met à jour uniquement les clés reconnues et valides de `fields` — ignore tout le reste plutôt que de lever, même esprit que sanitize_collision_rules (jamais confiance dans ce qu'envoie le client). title vide => ignoré (garde l'ancien plutôt qu'un titre vide).""" ensure_quests_schema(slug) if get_quest(slug, quest_id) is None: return None updates = {} if "title" in fields: title = (fields["title"] or "").strip() if title: updates["title"] = title if "objectif" in fields: updates["objectif"] = (fields["objectif"] or "").strip() if "recompense_score" in fields: try: updates["recompense_score"] = int(fields["recompense_score"]) except (TypeError, ValueError): pass if "status" in fields and fields["status"] in QUEST_STATUS_CHOICES: updates["status"] = fields["status"] if "resultat" in fields: resultat = fields["resultat"] if resultat in QUEST_RESULT_CHOICES: updates["resultat"] = resultat elif resultat is None: updates["resultat"] = None if not updates: return get_quest(slug, quest_id) conn = connect(slug) set_clause = ", ".join(f"{key} = ?" for key in updates) conn.execute(f"UPDATE _quests SET {set_clause} WHERE id = ?", (*updates.values(), quest_id)) conn.commit() conn.close() return get_quest(slug, quest_id)