@@ -58,50 +58,68 @@ class DatasyncManager {
5858 /// To fix the above error added @mainActor
5959 @MainActor
6060 func syncData( ) async throws -> Bool {
61-
62- //Disabling temporarily. To be put back after incorporating syncing mechanism
63- // if isSynching {
64- // print("Already syncing")
65- // return false
66- // } else {
67- // isSynching = true
68- // }
61+ print ( " 🔄 Starting sync... " )
6962
7063 let changesets = dbInstance. getChangesets ( )
71- print ( " Starting to sync data changesets: \( changesets. count) " )
72-
64+ print ( " Found \( changesets. count) changesets for synced=false " )
65+
66+ // Filter changesets that have valid edited versions
67+ let validChangesets = changesets. filter {
68+ let intId = Int ( $0. elementId) ?? - 1
69+ switch $0. elementType {
70+ case . way:
71+ let exists = self . dbInstance. getWay ( id: intId, version: . edited) != nil
72+ if !exists {
73+ print ( " ⚠️ Edited way not found for ID: \( intId) " )
74+ }
75+ return exists
76+ case . node:
77+ let exists = self . dbInstance. getNode ( id: intId, version: . edited) != nil
78+ if !exists {
79+ print ( " ⚠️ Edited node not found for ID: \( intId) " )
80+ }
81+ return exists
82+ default :
83+ return false
84+ }
85+ }
86+
87+ print ( " 📦 Found \( validChangesets. count) unsynced changesets with valid edits " )
88+
7389 var nodesToSync : [ String : StoredNode ] = [ : ]
7490 var waysToSync : [ String : StoredWay ] = [ : ]
75-
76- for changeset in changesets {
77- print ( " changeset.elementType \( changeset. elementType) , ID \( changeset. id) changeset.elementId \( changeset. elementId) " )
78- if changeset. elementType == . node, let node = dbInstance. getNode ( id: Int ( changeset. elementId) ?? - 1 , version: . edited) {
79- nodesToSync [ changeset. id] = node
80- } else if changeset. elementType == . way, let way = dbInstance. getWay ( id: Int ( changeset. elementId) ?? - 1 , version: . edited) {
81- waysToSync [ changeset. id] = way
91+
92+ for cs in validChangesets {
93+ let intId = Int ( cs. elementId) ?? - 1
94+ if cs. elementType == . node,
95+ let node = dbInstance. getNode ( id: intId, version: . edited) {
96+ nodesToSync [ cs. id] = node
97+ } else if cs. elementType == . way,
98+ let way = dbInstance. getWay ( id: intId, version: . edited) {
99+ waysToSync [ cs. id] = way
82100 }
83101 }
84102
85103 var syncSuccess = true
86104
105+ if nodesToSync. isEmpty && waysToSync. isEmpty {
106+ print ( " ✅ No edited elements found to sync " )
107+ return true
108+ }
109+
87110 for (key, node) in nodesToSync {
88- var payload = node. asOSMNode ( )
111+ print ( " 📤 Syncing node ID: \( node. id) " )
112+ let payload = node. asOSMNode ( )
89113 do {
90114 let isFinished = try await syncNode ( node: payload)
91115 if isFinished {
92- // ✅ Mark changeset as submitted
93116 DispatchQueue . main. async {
94117 self . dbInstance. assignChangesetId ( obj: key, changesetId: 0 )
95118 }
96-
97- // 🔄 Fetch updated node from OSM
98- let updatedNode = try await fetchNode2 ( nodeId: " \( payload. id) " )
99- // refreshOriginalNodeIfNewer(updatedNode)
100-
101- print ( " ✅ Sync finished for node: \( payload. id) " )
119+ print ( " ✅ Node sync finished: \( payload. id) " )
102120 } else {
121+ print ( " ❌ Node sync failed silently: \( payload. id) " )
103122 syncSuccess = false
104- return false
105123 }
106124 } catch {
107125 print ( " ❌ Failed to sync node: \( error. localizedDescription) " )
@@ -110,34 +128,33 @@ class DatasyncManager {
110128 }
111129 }
112130
113-
114131 for (key, way) in waysToSync {
115- var payload = way. asOSMWay ( )
132+ print ( " 📤 Syncing way ID: \( way. id) " )
133+ let payload = way. asOSMWay ( )
116134 do {
117135 let isFinished = try await syncWay ( way: payload)
118136 if isFinished {
119- // Update changeset locally
120137 DispatchQueue . main. async {
121138 self . dbInstance. assignChangesetId ( obj: key, changesetId: 0 )
122139 }
123-
124- let updatedWay = try await fetchway2 ( wayId: " \( payload. id) " )
125- //refreshOriginalWayIfNewer(updatedWay)
140+ print ( " ✅ Way sync finished: \( payload. id) " )
126141 } else {
142+ print ( " ❌ Way sync failed silently: \( payload. id) " )
127143 syncSuccess = false
128- return false
129144 }
130145 } catch {
131- print ( " Failed to sync way: \( error. localizedDescription) " )
146+ print ( " ❌ Failed to sync way: \( error. localizedDescription) " )
132147 syncSuccess = false
133148 throw error
134149 }
135150 }
136151
137- isSynching = false
152+ print ( " Sync finished " )
138153 return syncSuccess
139154 }
140155
156+
157+
141158 func refreshOriginalWayIfNewer( _ newWay: OSMWay ) {
142159 guard let existing = DatabaseConnector . shared. getWay ( id: newWay. id, version: . original) else {
143160 DatabaseConnector . shared. saveOSMElements ( [ newWay] )
0 commit comments