diff --git a/app/models/event_file_models.py b/app/models/event_file_models.py index 247045d..0c7c10a 100644 --- a/app/models/event_file_models.py +++ b/app/models/event_file_models.py @@ -49,30 +49,53 @@ class Event_File_Base(BaseModel): """ Vision Transformer: Map DB keys to clean API keys and strip internal integers during READ operations. - During CREATE (POST) operations, we ensure resolved integers are preserved. + Falls back to Redis/DB lookups if random string IDs are missing from the view. """ - # 1. Map Random Strings to Clean Names + # 1. Map Primary Object ID rid = values.get('id_random') or values.get('event_file_id_random') if rid and isinstance(rid, str): values['id'] = rid values['event_file_id'] = rid - if h_rid := values.get('hosted_file_id_random'): values['hosted_file_id'] = h_rid - if f_rid := values.get('for_id_random'): values['for_id'] = f_rid - if e_rid := values.get('event_id_random'): values['event_id'] = e_rid - if ex_rid := values.get('event_exhibit_id_random'): values['event_exhibit_id'] = ex_rid - if loc_rid := values.get('event_location_id_random'): values['event_location_id'] = loc_rid - if pres_rid := values.get('event_presentation_id_random'): values['event_presentation_id'] = pres_rid - if pr_rid := values.get('event_presenter_id_random'): values['event_presenter_id'] = pr_rid - if s_rid := values.get('event_session_id_random'): values['event_session_id'] = s_rid - if t_rid := values.get('event_track_id_random'): values['event_track_id'] = t_rid - - # 2. Prevent leakage of integers during API responses (Vision Standard) - id_fields = [ - 'id', 'event_file_id', 'hosted_file_id', 'for_id', 'event_id', - 'event_exhibit_id', 'event_location_id', 'event_presentation_id', - 'event_presenter_id', 'event_session_id', 'event_track_id' + # 2. Map & Resolve Relational IDs + # (Field Name, Table Name) + id_map = [ + ('hosted_file_id', 'hosted_file'), + ('event_id', 'event'), + ('event_exhibit_id', 'event_exhibit'), + ('event_location_id', 'event_location'), + ('event_presentation_id', 'event_presentation'), + ('event_presenter_id', 'event_presenter'), + ('event_session_id', 'event_session'), + ('event_track_id', 'event_track'), + ('lu_file_purpose_id', 'lu_file_purpose'), ] + + # 2a. Handle specific relational fields + for field, table in id_map: + # Check for existing random string version + r_val = values.get(f'{field}_random') + if r_val and isinstance(r_val, str): + values[field] = r_val + elif values.get(field) and isinstance(values[field], int): + # Fallback: Resolve from Redis/DB if missing from view result + resolved_rid = get_id_random(values[field], table) + if resolved_rid: + values[field] = resolved_rid + values[f'{field}_random'] = resolved_rid + + # 2b. Handle Polymorphic for_id + if f_rid := values.get('for_id_random'): + values['for_id'] = f_rid + elif values.get('for_id') and isinstance(values.get('for_id'), int) and values.get('for_type'): + # Resolve based on the for_type + resolved_for_rid = get_id_random(values['for_id'], values['for_type']) + if resolved_for_rid: + values['for_id'] = resolved_for_rid + values['for_id_random'] = resolved_for_rid + + # 3. Final Vision Enforcement: Strip internal integers + id_fields = [f for f, t in id_map] + ['id', 'event_file_id', 'for_id'] for k in id_fields: val = values.get(k) if val is not None and not isinstance(val, str): diff --git a/tests/e2e/test_e2e_v3_demo_parity.py b/tests/e2e/test_e2e_v3_demo_parity.py index 818a3dd..50a5dc4 100644 --- a/tests/e2e/test_e2e_v3_demo_parity.py +++ b/tests/e2e/test_e2e_v3_demo_parity.py @@ -11,7 +11,8 @@ API_KEY = "PMM4n50teUCaOMMTN8qOJA" # Agent API Key TARGETS = [ ("event_badge", "JPUG-87-80-88"), ("event_exhibit", "xK_9yEj1bQY"), - ("event_exhibit_tracking", "KVypw_xntSY") + ("event_exhibit_tracking", "KVypw_xntSY"), + ("event_file", "a2pPIT_W28o") # Regression Target for Relational ID bug ] def get_headers():