fetchAndParseTree method

Future<Map<String, List<Map<String, dynamic>>>> fetchAndParseTree(
  1. String rootUuid
)

Implementation

Future<Map<String, List<Map<String, dynamic>>>> fetchAndParseTree(
    String rootUuid) async {
  final treeData = await getFlatFolderTree(rootUuid);

  final rawFolders = treeData['folders'] as List? ?? [];
  final rawFiles =
      (treeData['files'] as List?) ?? (treeData['uploads'] as List?) ?? [];

  api.log(
      'Tree fetched: ${rawFolders.length} folders, ${rawFiles.length} files');

  final adjacency = <String, List<Map<String, dynamic>>>{};

  for (var f in rawFolders) {
    try {
      String uuid, encName, parent;
      if (f is List) {
        if (f.length < 3) continue;
        uuid = f[0];
        encName = f[1];
        parent = f[2];
      } else {
        if (f['deleted'] == true || f['trash'] == true) continue;
        uuid = f['uuid'];
        encName = f['name'];
        parent = f['parent'];
      }

      var decName = await crypto.tryDecrypt(encName, masterKeys);
      if (decName.startsWith('{')) {
        decName = json.decode(decName)['name'];
      }

      final item = {
        'uuid': uuid,
        'name': decName,
        'parent': parent,
        'type': 'folder'
      };
      if (!adjacency.containsKey(parent)) adjacency[parent] = [];
      adjacency[parent]!.add(item);
    } catch (_) {}
  }

  for (var f in rawFiles) {
    try {
      String uuid, encMeta, parent;
      if (f is List) {
        if (f.length < 6) continue;
        uuid = f[0];
        parent = f[4];
        encMeta = f[5];
      } else {
        if (f['deleted'] == true || f['trash'] == true) continue;
        uuid = f['uuid'];
        parent = f['parent'];
        encMeta = f['metadata'];
      }

      final decMeta = await crypto.tryDecrypt(encMeta, masterKeys);
      final meta = json.decode(decMeta);

      final item = {
        'uuid': uuid,
        'name': meta['name'] ?? 'Unknown',
        'parent': parent,
        'type': 'file',
        'size': meta['size'] ?? 0
      };
      if (!adjacency.containsKey(parent)) adjacency[parent] = [];
      adjacency[parent]!.add(item);
    } catch (_) {}
  }

  return adjacency;
}