Centralize legacy cloud bridge

This commit is contained in:
2026-06-04 13:09:45 +02:00
parent a9ed201adf
commit 1984b71a0a
9 changed files with 475 additions and 107 deletions

View File

@@ -1,7 +1,10 @@
#pragma once
#include "foundation/result.h"
#include <cstddef>
#include <limits>
#include <string>
#include <string_view>
namespace pp::app {
@@ -33,6 +36,25 @@ struct CloudBulkUploadPlan {
bool show_progress = false;
};
struct CloudDownloadRequest {
std::string selected_file;
std::string selected_path;
std::string selected_name;
};
class CloudServices {
public:
virtual ~CloudServices() = default;
virtual void show_save_required_warning() = 0;
virtual void prompt_publish(bool save_before_upload) = 0;
virtual void begin_bulk_upload(int progress_total, bool show_progress) = 0;
virtual void upload_all_bulk_files() = 0;
virtual void end_bulk_upload() = 0;
virtual void show_browser() = 0;
virtual void start_download(const CloudDownloadRequest& request) = 0;
};
[[nodiscard]] constexpr CloudUploadPlan plan_cloud_upload(
bool has_canvas,
bool is_new_document,
@@ -76,4 +98,66 @@ struct CloudBulkUploadPlan {
};
}
[[nodiscard]] inline pp::foundation::Status execute_cloud_upload_plan(
const CloudUploadPlan& plan,
CloudServices& services)
{
switch (plan.action) {
case CloudUploadAction::unavailable_no_canvas:
return pp::foundation::Status::success();
case CloudUploadAction::show_save_required_warning:
services.show_save_required_warning();
return pp::foundation::Status::success();
case CloudUploadAction::prompt_publish:
services.prompt_publish(plan.save_before_upload);
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown cloud upload action");
}
[[nodiscard]] inline pp::foundation::Status execute_cloud_bulk_upload_plan(
const CloudBulkUploadPlan& plan,
CloudServices& services)
{
services.begin_bulk_upload(plan.progress_total, plan.show_progress);
services.upload_all_bulk_files();
services.end_bulk_upload();
return pp::foundation::Status::success();
}
[[nodiscard]] inline pp::foundation::Status execute_cloud_browse_action(
CloudBrowseAction action,
CloudServices& services)
{
switch (action) {
case CloudBrowseAction::unavailable_no_canvas:
return pp::foundation::Status::success();
case CloudBrowseAction::show_browser:
services.show_browser();
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown cloud browse action");
}
[[nodiscard]] inline pp::foundation::Status execute_cloud_download_selection_action(
CloudDownloadSelectionAction action,
CloudServices& services,
const CloudDownloadRequest& request)
{
switch (action) {
case CloudDownloadSelectionAction::wait_for_selection:
return pp::foundation::Status::success();
case CloudDownloadSelectionAction::start_download:
if (request.selected_file.empty()) {
return pp::foundation::Status::invalid_argument("cloud download requires a selected file");
}
services.start_download(request);
return pp::foundation::Status::success();
}
return pp::foundation::Status::invalid_argument("unknown cloud download selection action");
}
}