Implement OrgPersistenceRepository with LocalStorageAdapter
epic-organization-selection-infrastructure-task-006 — Implement the concrete OrgPersistenceRepository class backed by LocalStorageAdapter. Use the namespaced key constant defined in task-001. Implement getSelectedOrganizationId() and saveSelectedOrganizationId(), delegating all storage operations to the injected LocalStorageAdapter. Ensure the implementation fulfills the abstract interface from task-005.
Acceptance Criteria
Technical Requirements
Execution Context
Tier 3 - 413 tasks
Can start after Tier 2 completes
Implementation Notes
File location: lib/infrastructure/repositories/local_org_persistence_repository.dart. Follow constructor injection pattern: final LocalStorageAdapter _adapter; const LocalOrgPersistenceRepository(this._adapter);. Use the key constant as LocalStorageKeys.selectedOrgId (or whatever constant name task-001 defines) — import only from the infrastructure constants file. Keep both methods to 2-3 lines each; any added complexity is a sign the responsibility boundary is wrong.
This class should be a thin delegation layer — if business logic appears here, it belongs in a use case instead.
Testing Requirements
Unit tests are covered in task-008. For this task, verify manually or via a simple integration smoke test that saving and reading an org ID round-trips correctly through the real LocalStorageAdapter on device/emulator. Ensure the class can be instantiated with a mock adapter without any errors.
SharedPreferences behaves differently on iOS (NSUserDefaults) vs Android (SharedPreferences) for edge cases such as first-launch cold reads, storage quota exceeded, or process kill mid-write. If the adapter does not account for these differences, the persistence layer can silently return null on one platform while returning a stale value on the other, causing incorrect routing decisions downstream.
Mitigation & Contingency
Mitigation: Write platform-specific integration tests using flutter_test device runners for both iOS and Android. Document known platform delta in the adapter's inline comments and encode defensive fallback for null returns at the repository boundary.
Contingency: If platform delta causes persistent issues, replace SharedPreferences with flutter_secure_storage for this key — the LocalStorageAdapter abstraction makes this a single-file swap with no impact on the repository or service layer.
The shared_preferences Flutter plugin may have a version conflict with other plugins already in the project pubspec.yaml. A conflict discovered late in the epic blocks all downstream epics.
Mitigation & Contingency
Mitigation: Resolve and pin the shared_preferences version in pubspec.yaml as the very first task of this epic before writing any implementation code. Run flutter pub get and resolve any version conflicts immediately.
Contingency: If version pinning is impossible due to transitive conflicts, implement LocalStorageAdapter using path_provider + dart:io for JSON file storage as an alternative — the interface contract remains unchanged.