fix(v3-vision): implement fallback resolution for relational IDs

1. Added fallback mechanism to Event_File_Base to resolve string IDs from integers when views return partial data.\n2. Added 'a2pPIT_W28o' as a permanent regression test target.\n3. Hardened lu_file_purpose_id stripping.
This commit is contained in:
Scott Idem
2026-02-06 18:13:40 -05:00
parent 8270f7ff7a
commit 2a7c27ba80
2 changed files with 42 additions and 18 deletions

View File

@@ -49,30 +49,53 @@ class Event_File_Base(BaseModel):
""" """
Vision Transformer: Vision Transformer:
Map DB keys to clean API keys and strip internal integers during READ operations. 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') rid = values.get('id_random') or values.get('event_file_id_random')
if rid and isinstance(rid, str): if rid and isinstance(rid, str):
values['id'] = rid values['id'] = rid
values['event_file_id'] = rid values['event_file_id'] = rid
if h_rid := values.get('hosted_file_id_random'): values['hosted_file_id'] = h_rid # 2. Map & Resolve Relational IDs
if f_rid := values.get('for_id_random'): values['for_id'] = f_rid # (Field Name, Table Name)
if e_rid := values.get('event_id_random'): values['event_id'] = e_rid id_map = [
if ex_rid := values.get('event_exhibit_id_random'): values['event_exhibit_id'] = ex_rid ('hosted_file_id', 'hosted_file'),
if loc_rid := values.get('event_location_id_random'): values['event_location_id'] = loc_rid ('event_id', 'event'),
if pres_rid := values.get('event_presentation_id_random'): values['event_presentation_id'] = pres_rid ('event_exhibit_id', 'event_exhibit'),
if pr_rid := values.get('event_presenter_id_random'): values['event_presenter_id'] = pr_rid ('event_location_id', 'event_location'),
if s_rid := values.get('event_session_id_random'): values['event_session_id'] = s_rid ('event_presentation_id', 'event_presentation'),
if t_rid := values.get('event_track_id_random'): values['event_track_id'] = t_rid ('event_presenter_id', 'event_presenter'),
('event_session_id', 'event_session'),
# 2. Prevent leakage of integers during API responses (Vision Standard) ('event_track_id', 'event_track'),
id_fields = [ ('lu_file_purpose_id', 'lu_file_purpose'),
'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'
] ]
# 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: for k in id_fields:
val = values.get(k) val = values.get(k)
if val is not None and not isinstance(val, str): if val is not None and not isinstance(val, str):

View File

@@ -11,7 +11,8 @@ API_KEY = "PMM4n50teUCaOMMTN8qOJA" # Agent API Key
TARGETS = [ TARGETS = [
("event_badge", "JPUG-87-80-88"), ("event_badge", "JPUG-87-80-88"),
("event_exhibit", "xK_9yEj1bQY"), ("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(): def get_headers():