fetchAndParseTree method
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;
}