mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 09:51:13 -05:00
Fix composite submission dependency resolution
This commit is contained in:
@@ -467,7 +467,7 @@ serve(async (req) => {
|
||||
}
|
||||
|
||||
// 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
|
||||
resolvedData._submitter_id = submitterId;
|
||||
@@ -759,23 +759,136 @@ function topologicalSort(items: any[]): any[] {
|
||||
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) {
|
||||
return data;
|
||||
}
|
||||
|
||||
if (Array.isArray(data)) {
|
||||
return data.map(item => resolveDependencies(item, dependencyMap));
|
||||
return data.map(item => resolveDependencies(item, dependencyMap, sortedItems));
|
||||
}
|
||||
|
||||
const resolved: any = {};
|
||||
for (const [key, value] of Object.entries(data)) {
|
||||
if (typeof value === 'string' && dependencyMap.has(value)) {
|
||||
resolved[key] = dependencyMap.get(value);
|
||||
} else {
|
||||
resolved[key] = resolveDependencies(value, dependencyMap);
|
||||
const resolved: any = { ...data };
|
||||
|
||||
// Phase 1: Resolve temporary index references FIRST
|
||||
// These reference items by their position in the sorted items array
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user