7.4 KiB
7.4 KiB
Plan: Implement Custom Data Location Feature
This document outlines the plan to implement the feature allowing users to specify a custom location for the PasteBar application's data.
1. Goals
- Allow users to specify a custom parent directory for application data via the settings UI.
- The application will create and manage a
pastebar-data
subdirectory within the user-specified location. - This
pastebar-data
directory will contain the database file (pastebar-db.data
), theclip-images
folder, and theclipboard-images
folder. - Provide options to either move the existing data, copy it, or use the new location without moving/copying.
- Ensure the application uses the data from the new location after a restart.
- Handle potential errors gracefully and inform the user.
- Update the application state and backend configuration accordingly.
2. Backend (Rust - src-tauri
)
2.1. Configuration (user_settings_service.rs
)
- The
UserConfig
struct'scustom_db_path: Option<String>
will now be repurposed to store the path to the user-selected parent directory. The application logic will handle appending the/pastebar-data/
segment. This requires no change to the struct itself, only to how the path is interpreted.
2.2. Path Logic (db.rs
and new helpers)
- We will introduce new helper functions to consistently resolve data paths, whether default or custom.
get_data_dir() -> PathBuf
: This will be the core helper. It checks for acustom_db_path
in the settings.- If present, it returns
PathBuf::from(custom_path)
. - If
None
, it returns the default application data directory.
- If present, it returns
get_db_path()
: This function will be refactored to useget_data_dir().join("pastebar-db.data")
.get_clip_images_dir()
: A new helper that returnsget_data_dir().join("clip-images")
.get_clipboard_images_dir()
: A new helper that returnsget_data_dir().join("clipboard-images")
.
2.3. New & Updated Tauri Commands (user_settings_command.rs
)
-
cmd_validate_custom_db_path(path: String) -> Result<bool, String>
- No change in purpose. This command will still check if the user-selected directory is valid and writable.
-
cmd_check_custom_data_path(path: String) -> Result<PathStatus, String>
- A new command to check the status of a selected directory. It returns one of the following statuses:
Empty
,NotEmpty
,IsPastebarDataAndNotEmpty
.
- A new command to check the status of a selected directory. It returns one of the following statuses:
-
cmd_set_and_relocate_data(new_parent_dir_path: String, operation: String) -> Result<String, String>
(renamed fromset_and_relocate_db
)new_parent_dir_path
: The new directory path selected by the user.operation
: Either "move", "copy", or "none".- Updated Steps:
- Get the source paths:
- Current DB file path.
- Current
clip-images
directory path. - Current
clipboard-images
directory path.
- Define the new data directory:
let new_data_dir = Path::new(&new_parent_dir_path);
- Create the new data directory:
fs::create_dir_all(&new_data_dir)
. - Perform file/directory operations for each item (DB file,
clip-images
dir,clipboard-images
dir):- If "move":
fs::rename(source, destination)
. - If "copy":
fs::copy
for the file, and a recursive copy function for the directories. - If "none", do nothing.
- Handle cases where source items might not exist (e.g.,
clip-images
folder hasn't been created yet) by skipping them gracefully.
- If "move":
- If successful, call
user_settings_service::set_custom_db_path(&new_parent_dir_path)
. - Return a success or error message.
- Get the source paths:
-
cmd_revert_to_default_data_location() -> Result<String, String>
(renamed and simplified)- Updated Steps:
- Call
user_settings_service::remove_custom_db_path()
to clear the custom data path setting. - Return a success message indicating the setting has been removed.
- Call
- Updated Steps:
3. Frontend (React)
- The UI has been updated to refer to "Custom Application Data Location" instead of "Custom Database Location".
- A third radio button option, "Use new location", has been added.
- The
handleBrowse
function now calls thecmd_check_custom_data_path
command to analyze the selected directory and prompts the user accordingly. - The
settingsStore.ts
has been updated to support the "none" operation.
4. User Interaction Flow (Mermaid Diagram)
graph TD
subgraph User Flow
A[User navigates to User Preferences] --> B{Custom Data Path Set?};
B -- Yes --> C[Display Current Custom Path];
B -- No --> D[Display Current Path: Default];
C --> E[Show "Revert to Default" Button];
D --> F[User Selects New Parent Directory];
F --> G{Path Status?};
G -- Empty --> H[Set Path];
G -- Not Empty --> I{Confirm "pastebar-data" subfolder};
I -- Yes --> J[Append "pastebar-data" to path];
J --> H;
I -- No --> H;
G -- Is 'pastebar-data' and Not Empty --> K[Alert user existing data will be used];
K --> H;
H --> L[User Selects Operation: Move/Copy/None];
L --> M[User Clicks "Apply and Restart"];
end
subgraph Backend Logic
M --> N[Frontend calls `cmd_set_and_relocate_data`];
N -- Success --> O[1. Create new data dir if needed];
O --> P[2. Move/Copy/Skip data];
P --> Q[3. Update `custom_db_path` in settings];
Q --> R[Show Success Toast & Relaunch App];
N -- Error --> S[Show Error Toast];
E --> T[User Clicks "Revert"];
T --> U[Frontend calls `cmd_revert_to_default_data_location`];
U -- Success --> V[Move/Copy data back to default app dir & clear setting];
V --> W[Show Success Toast & Relaunch App];
U -- Error --> X[Show Error Toast];
end
D -- "Browse..." --> F;
5. Implementation Summary
The following changes have been implemented:
packages/pastebar-app-ui/src/pages/settings/UserPreferences.tsx
:- Renamed "Custom Database Location" to "Custom Application Data Location".
- Added a third radio button for the "Use new location" option.
- Updated the
handleBrowse
function to call the newcmd_check_custom_data_path
command and handle the different path statuses with user prompts.
packages/pastebar-app-ui/src/store/settingsStore.ts
:- Updated the
applyCustomDbPath
function to accept the "none" operation. - Updated the
revertToDefaultDbPath
function to call the renamed backend command.
- Updated the
src-tauri/src/commands/user_settings_command.rs
:- Added the
cmd_check_custom_data_path
command. - Renamed
cmd_set_and_relocate_db
tocmd_set_and_relocate_data
and updated its logic to handle the "none" operation and the new data directory structure. - Renamed
cmd_revert_to_default_db_location
tocmd_revert_to_default_data_location
and updated its logic.
- Added the
src-tauri/src/db.rs
:- Refactored the
get_data_dir
function to no longer automatically appendpastebar-data
. - Added
get_clip_images_dir
andget_clipboard_images_dir
helper functions.
- Refactored the
src-tauri/src/main.rs
:- Registered the new and renamed commands in the
invoke_handler
.
- Registered the new and renamed commands in the
src-tauri/Cargo.toml
:- Added the
fs_extra
dependency for recursive directory copying.
- Added the
src-tauri/src/services/items_service.rs
andsrc-tauri/src/services/history_service.rs
:- Updated to use the new
get_clip_images_dir
andget_clipboard_images_dir
helper functions.
- Updated to use the new