Jason
|
5c3aca18eb
|
refactor(backend): implement transaction mechanism and i18n errors for provider service
This commit completes phase 4 service layer extraction by introducing:
1. **Transaction mechanism with 2PC (Two-Phase Commit)**:
- Introduced `run_transaction()` wrapper with snapshot-based rollback
- Implemented `LiveSnapshot` enum to capture and restore live config files
- Added `PostCommitAction` to separate config.json persistence from live file writes
- Applied to critical operations: add, update, switch providers
- Ensures atomicity: memory + config.json + live files stay consistent
2. **Internationalized error handling**:
- Added `AppError::Localized` variant with key + zh + en messages
- Implemented `AppError::localized()` helper function
- Migrated 24 error sites to use i18n-ready errors
- Enables frontend to display errors in user's preferred language
3. **Concurrency optimization**:
- Fixed `get_custom_endpoints()` to use read lock instead of write lock
- Ensured async IO operations (usage query) execute outside lock scope
- Added defensive RAII lock management with explicit scope blocks
4. **Code organization improvements**:
- Reduced commands/provider.rs from ~800 to ~320 lines (-60%)
- Expanded services/provider.rs with transaction infrastructure
- Added unit tests for validation and credential extraction
- Documented legacy file cleanup logic with inline comments
5. **Backfill mechanism refinement**:
- Ensured live config is synced back to memory before switching
- Maintains SSOT (Single Source of Truth) architecture principle
- Handles Codex dual-file (auth.json + config.toml) atomically
Breaking changes: None (internal refactoring only)
Performance: Improved read concurrency, no measurable overhead from snapshots
Test coverage: Added validation tests, updated service layer tests
|
2025-10-28 17:47:15 +08:00 |
|
Jason
|
c01e495eea
|
refactor(backend): phase 1 - unified error handling with thiserror
Introduce AppError enum to replace Result<T, String> pattern across
the codebase, improving error context preservation and type safety.
## Changes
### Core Infrastructure
- Add src/error.rs with AppError enum using thiserror
- Add thiserror dependency to Cargo.toml
- Implement helper functions: io(), json(), toml() for ergonomic error creation
- Implement From<PoisonError> for automatic lock error conversion
- Implement From<AppError> for String to maintain Tauri command compatibility
### Module Migrations (60% complete)
- config.rs: Full migration to AppError
- read_json_file, write_json_file, atomic_write
- archive_file, copy_file, delete_file
- claude_mcp.rs: Full migration to AppError
- get_mcp_status, read_mcp_json, upsert_mcp_server
- delete_mcp_server, validate_command_in_path
- set_mcp_servers_map
- codex_config.rs: Full migration to AppError
- write_codex_live_atomic with rollback support
- read_and_validate_codex_config_text
- validate_config_toml
- app_config.rs: Partial migration
- MultiAppConfig::load, MultiAppConfig::save
- store.rs: Partial migration
- AppState::save now returns Result<(), AppError>
- commands.rs: Minimal changes
- Use .map_err(Into::into) for compatibility
- mcp.rs: Minimal changes
- sync_enabled_to_claude uses Into::into conversion
### Documentation
- Add docs/BACKEND_REFACTOR_PLAN.md with detailed refactoring roadmap
## Benefits
- Type-safe error handling with preserved error chains
- Better error messages with file paths and context
- Reduced boilerplate code (118 Result<T, String> instances to migrate)
- Automatic error conversion for seamless integration
## Testing
- All existing tests pass (4/4)
- Compilation successful with no warnings
- Build time: 0.61s (no performance regression)
## Remaining Work
- claude_plugin.rs (7 functions)
- migration.rs, import_export.rs
- Add unit tests for error.rs
- Complete commands.rs migration after dependent modules
Co-authored-by: Claude <claude@anthropic.com>
|
2025-10-27 16:29:11 +08:00 |
|