applyLocalIdMapping function
Implementation
Future<void> applyLocalIdMapping({
required String oldLocalId,
required String newLocalId,
String? parentLocalId,
}) async {
if (oldLocalId == newLocalId) return;
final parent = (parentLocalId ?? '').trim();
try {
// 1) Move the document itself inside its parent collection.
if (parent.isNotEmpty) {
final oldDoc = await db.collection(parent).doc(oldLocalId).get();
if (oldDoc != null) {
final map = Map<String, dynamic>.from(oldDoc);
map['local_id'] = newLocalId;
map['parent_local_id'] = parent;
final parsed = _parseNumericLocalId(newLocalId);
if (parsed != null) {
_fillFromParsedLocalId(map, parsed);
}
await db.collection(parent).doc(newLocalId).set(map);
await db.collection(parent).doc(oldLocalId).delete();
}
}
} catch (_) {}
try {
// 2) Move the children collection (collection name == parent local_id).
final children = await db.collection(oldLocalId).get();
if (children != null) {
final parsedParent = _parseNumericLocalId(newLocalId);
for (final entry in children.entries) {
final docId = _docIdFromKey(entry.key);
final raw = entry.value;
if (raw is! Map) continue;
final map = Map<String, dynamic>.from(raw);
map['local_id'] = docId;
final plid = map['parent_local_id']?.toString();
if (plid == null || plid.isEmpty || plid == oldLocalId) {
map['parent_local_id'] = newLocalId;
}
if (parsedParent != null) {
_fillFromParsedLocalId(map, parsedParent);
}
await db.collection(newLocalId).doc(docId).set(map);
await db.collection(oldLocalId).doc(docId).delete();
}
}
} catch (_) {}
}