extract common behavior
This commit is contained in:
@@ -99,94 +99,61 @@ auto sia_provider::get_directory_item_count(const std::string &api_path) const
|
||||
return 0U;
|
||||
}
|
||||
|
||||
auto sia_provider::get_directory_items(const std::string &api_path,
|
||||
directory_item_list &list) const
|
||||
auto sia_provider::get_directory_items_impl(const std::string &api_path,
|
||||
directory_item_list &list) const
|
||||
-> api_error {
|
||||
bool exists{};
|
||||
auto res = is_directory(api_path, exists);
|
||||
if (res != api_error::success) {
|
||||
return res;
|
||||
}
|
||||
if (not exists) {
|
||||
return api_error::directory_not_found;
|
||||
json object_list{};
|
||||
if (not get_object_list(api_path, object_list)) {
|
||||
return api_error::comm_error;
|
||||
}
|
||||
|
||||
try {
|
||||
json object_list{};
|
||||
if (not get_object_list(api_path, object_list)) {
|
||||
return api_error::comm_error;
|
||||
}
|
||||
if (object_list.contains("entries")) {
|
||||
for (const auto &entry : object_list.at("entries")) {
|
||||
try {
|
||||
auto name = entry.at("name").get<std::string>();
|
||||
auto entry_api_path = utils::path::create_api_path(name);
|
||||
|
||||
if (object_list.contains("entries")) {
|
||||
for (const auto &entry : object_list.at("entries")) {
|
||||
try {
|
||||
auto name = entry.at("name").get<std::string>();
|
||||
auto entry_api_path = utils::path::create_api_path(name);
|
||||
auto directory = utils::string::ends_with(name, "/");
|
||||
if (directory && (entry_api_path == api_path)) {
|
||||
continue;
|
||||
}
|
||||
|
||||
auto directory = utils::string::ends_with(name, "/");
|
||||
if (directory && (entry_api_path == api_path)) {
|
||||
api_file file{};
|
||||
|
||||
api_meta_map meta{};
|
||||
if (get_item_meta(entry_api_path, meta) == api_error::item_not_found) {
|
||||
file = create_api_file(
|
||||
entry_api_path, "",
|
||||
directory ? 0U : entry["size"].get<std::uint64_t>());
|
||||
get_api_item_added()(directory, file);
|
||||
auto res = get_item_meta(entry_api_path, meta);
|
||||
if (res != api_error::success) {
|
||||
utils::error::raise_error(__FUNCTION__, res,
|
||||
"failed to get item meta");
|
||||
continue;
|
||||
}
|
||||
|
||||
api_file file{};
|
||||
|
||||
api_meta_map meta{};
|
||||
if (get_item_meta(entry_api_path, meta) ==
|
||||
api_error::item_not_found) {
|
||||
file = create_api_file(
|
||||
entry_api_path, "",
|
||||
directory ? 0U : entry["size"].get<std::uint64_t>());
|
||||
get_api_item_added()(directory, file);
|
||||
res = get_item_meta(entry_api_path, meta);
|
||||
if (res != api_error::success) {
|
||||
utils::error::raise_error(__FUNCTION__, res,
|
||||
"failed to get item meta");
|
||||
continue;
|
||||
}
|
||||
} else {
|
||||
file = create_api_file(
|
||||
entry_api_path,
|
||||
directory ? 0U : entry["size"].get<std::uint64_t>(), meta);
|
||||
}
|
||||
|
||||
directory_item dir_item{};
|
||||
dir_item.api_parent = file.api_parent;
|
||||
dir_item.api_path = file.api_path;
|
||||
dir_item.directory = directory;
|
||||
dir_item.meta = meta;
|
||||
dir_item.resolved = true;
|
||||
dir_item.size = file.file_size;
|
||||
list.emplace_back(std::move(dir_item));
|
||||
} catch (const std::exception &e) {
|
||||
utils::error::raise_api_path_error(__FUNCTION__, api_path, e,
|
||||
"failed to process entry|" +
|
||||
entry.dump());
|
||||
} else {
|
||||
file = create_api_file(
|
||||
entry_api_path,
|
||||
directory ? 0U : entry["size"].get<std::uint64_t>(), meta);
|
||||
}
|
||||
|
||||
directory_item dir_item{};
|
||||
dir_item.api_parent = file.api_parent;
|
||||
dir_item.api_path = file.api_path;
|
||||
dir_item.directory = directory;
|
||||
dir_item.meta = meta;
|
||||
dir_item.resolved = true;
|
||||
dir_item.size = file.file_size;
|
||||
list.emplace_back(std::move(dir_item));
|
||||
} catch (const std::exception &e) {
|
||||
utils::error::raise_api_path_error(__FUNCTION__, api_path, e,
|
||||
"failed to process entry|" +
|
||||
entry.dump());
|
||||
}
|
||||
}
|
||||
} catch (const std::exception &e) {
|
||||
utils::error::raise_api_path_error(__FUNCTION__, api_path, e,
|
||||
"failed to get directory items");
|
||||
return api_error::error;
|
||||
}
|
||||
|
||||
std::sort(list.begin(), list.end(),
|
||||
[](const auto &item1, const auto &item2) -> bool {
|
||||
return (item1.directory && not item2.directory) ||
|
||||
(not(item2.directory && not item1.directory) &&
|
||||
(item1.api_path.compare(item2.api_path) < 0));
|
||||
});
|
||||
|
||||
list.insert(list.begin(), directory_item{
|
||||
"..",
|
||||
"",
|
||||
true,
|
||||
});
|
||||
list.insert(list.begin(), directory_item{
|
||||
".",
|
||||
"",
|
||||
true,
|
||||
});
|
||||
return api_error::success;
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user