mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-20 11:31:11 -05:00
Fix composite submission dependency resolution
This commit is contained in:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user