applyLocalIdMapping function

Future<void> applyLocalIdMapping({
  1. required String oldLocalId,
  2. required String newLocalId,
  3. String? parentLocalId,
})

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 (_) {}
}