Fix composite submission dependency resolution

This commit is contained in:
gpt-engineer-app[bot]
2025-11-02 19:56:23 +00:00
parent 3c6d6a3bdf
commit 0a9820abfb

View File

@@ -467,7 +467,7 @@ serve(async (req) => {
} }
// Resolve dependencies in item data // Resolve dependencies in item data
const resolvedData = resolveDependencies(item.item_data, dependencyMap); const resolvedData = resolveDependencies(item.item_data, dependencyMap, sortedItems);
// Add submitter ID to the data for photo tracking // Add submitter ID to the data for photo tracking
resolvedData._submitter_id = submitterId; resolvedData._submitter_id = submitterId;
@@ -759,23 +759,136 @@ function topologicalSort(items: any[]): any[] {
return sorted; return sorted;
} }
function resolveDependencies(data: any, dependencyMap: Map<string, string>): any { function resolveDependencies(data: any, dependencyMap: Map<string, string>, sortedItems: any[]): any {
if (typeof data !== 'object' || data === null) { if (typeof data !== 'object' || data === null) {
return data; return data;
} }
if (Array.isArray(data)) { if (Array.isArray(data)) {
return data.map(item => resolveDependencies(item, dependencyMap)); return data.map(item => resolveDependencies(item, dependencyMap, sortedItems));
} }
const resolved: any = {}; const resolved: any = { ...data };
for (const [key, value] of Object.entries(data)) {
if (typeof value === 'string' && dependencyMap.has(value)) { // Phase 1: Resolve temporary index references FIRST
resolved[key] = dependencyMap.get(value); // These reference items by their position in the sorted items array
} else {
resolved[key] = resolveDependencies(value, dependencyMap); if (resolved._temp_manufacturer_ref !== undefined) {
const refIndex = resolved._temp_manufacturer_ref;
if (refIndex >= 0 && refIndex < sortedItems.length) {
const refItemId = sortedItems[refIndex].id;
if (dependencyMap.has(refItemId)) {
resolved.manufacturer_id = dependencyMap.get(refItemId);
edgeLogger.info('Resolved temp manufacturer ref', {
action: 'dependency_resolve_temp_ref',
refIndex,
refItemId,
resolvedId: resolved.manufacturer_id
});
}
}
delete resolved._temp_manufacturer_ref;
}
if (resolved._temp_operator_ref !== undefined) {
const refIndex = resolved._temp_operator_ref;
if (refIndex >= 0 && refIndex < sortedItems.length) {
const refItemId = sortedItems[refIndex].id;
if (dependencyMap.has(refItemId)) {
resolved.operator_id = dependencyMap.get(refItemId);
edgeLogger.info('Resolved temp operator ref', {
action: 'dependency_resolve_temp_ref',
refIndex,
refItemId,
resolvedId: resolved.operator_id
});
}
}
delete resolved._temp_operator_ref;
}
if (resolved._temp_property_owner_ref !== undefined) {
const refIndex = resolved._temp_property_owner_ref;
if (refIndex >= 0 && refIndex < sortedItems.length) {
const refItemId = sortedItems[refIndex].id;
if (dependencyMap.has(refItemId)) {
resolved.property_owner_id = dependencyMap.get(refItemId);
edgeLogger.info('Resolved temp property owner ref', {
action: 'dependency_resolve_temp_ref',
refIndex,
refItemId,
resolvedId: resolved.property_owner_id
});
}
}
delete resolved._temp_property_owner_ref;
}
if (resolved._temp_ride_model_ref !== undefined) {
const refIndex = resolved._temp_ride_model_ref;
if (refIndex >= 0 && refIndex < sortedItems.length) {
const refItemId = sortedItems[refIndex].id;
if (dependencyMap.has(refItemId)) {
resolved.ride_model_id = dependencyMap.get(refItemId);
edgeLogger.info('Resolved temp ride model ref', {
action: 'dependency_resolve_temp_ref',
refIndex,
refItemId,
resolvedId: resolved.ride_model_id
});
}
}
delete resolved._temp_ride_model_ref;
}
if (resolved._temp_designer_ref !== undefined) {
const refIndex = resolved._temp_designer_ref;
if (refIndex >= 0 && refIndex < sortedItems.length) {
const refItemId = sortedItems[refIndex].id;
if (dependencyMap.has(refItemId)) {
resolved.designer_id = dependencyMap.get(refItemId);
edgeLogger.info('Resolved temp designer ref', {
action: 'dependency_resolve_temp_ref',
refIndex,
refItemId,
resolvedId: resolved.designer_id
});
}
}
delete resolved._temp_designer_ref;
}
// Phase 2: Resolve direct foreign key references
// These are submission_item IDs that reference other items in the same submission
const foreignKeys = [
'park_id',
'manufacturer_id',
'designer_id',
'operator_id',
'property_owner_id',
'ride_model_id'
];
for (const key of foreignKeys) {
if (resolved[key] && typeof resolved[key] === 'string' && dependencyMap.has(resolved[key])) {
const oldValue = resolved[key];
resolved[key] = dependencyMap.get(resolved[key]);
edgeLogger.info('Resolved direct foreign key', {
action: 'dependency_resolve_fk',
key,
oldValue,
newValue: resolved[key]
});
} }
} }
// Phase 3: Recursively resolve nested objects
for (const [key, value] of Object.entries(resolved)) {
if (typeof value === 'object' && value !== null && !foreignKeys.includes(key)) {
resolved[key] = resolveDependencies(value, dependencyMap, sortedItems);
}
}
return resolved; return resolved;
} }