feat(online): partage client - use cases, inbox cache et import local (ticket #66)
Ajoute l'adapter API distant de partage (infrastructure/remote/share_api.dart) et les use cases associés (application/use_cases.dart), avec cache d'inbox et import local des ressources partagées acceptées. Étend le modèle Drift (migration schemaVersion 11→12) et les entités du domaine en conséquence. flutter pub get OK, build_runner OK, dart format appliqué, analyze propre (mêmes infos préexistantes), 124/124 tests verts, build APK debug validé. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
@ -146,6 +146,17 @@ final class _FakeBootstrap implements AppDependencies {
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
deviceId: 'device-1',
|
||||
),
|
||||
shareUseCases = ShareUseCases(
|
||||
tokenStore: _FakeAuthTokenStore(),
|
||||
remoteShareApi: _FakeRemoteShareApi(),
|
||||
inboxRepository: _FakeShareInboxRepository(),
|
||||
pendingActionRepository: _FakePendingShareActionRepository(),
|
||||
localChanges: _FakeLocalSyncChangeRepository(),
|
||||
programRepository: _FakeProgramRepository(),
|
||||
templateRepository: _FakeWorkoutTemplateRepository(),
|
||||
clock: _FakeClock(DateTime.utc(2026, 7, 17, 12)),
|
||||
ids: _FakeIds(),
|
||||
),
|
||||
activeWorkoutSessionUseCases = ActiveWorkoutSessionUseCases(
|
||||
sessionRepository: activeRepository,
|
||||
templateRepository: _FakeWorkoutTemplateRepository(),
|
||||
@ -207,6 +218,9 @@ final class _FakeBootstrap implements AppDependencies {
|
||||
@override
|
||||
final SyncUseCases syncUseCases;
|
||||
|
||||
@override
|
||||
final ShareUseCases shareUseCases;
|
||||
|
||||
@override
|
||||
final ExerciseUseCases exerciseUseCases;
|
||||
|
||||
@ -390,6 +404,72 @@ final class _FakeLocalSyncChangeRepository
|
||||
) async {}
|
||||
}
|
||||
|
||||
final class _FakeRemoteShareApi implements RemoteShareApi {
|
||||
@override
|
||||
Future<RemoteSyncedItem> acceptShare(String shareId, String token) async {
|
||||
throw const RemoteAuthException(RemoteAuthFailure.network);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<void> declineShare(String shareId, String token) async {}
|
||||
|
||||
@override
|
||||
Future<List<ShareInboxItem>> fetchInbox(String token) async => const [];
|
||||
|
||||
@override
|
||||
Future<void> revokeShare(String shareId, String token) async {}
|
||||
|
||||
@override
|
||||
Future<RemoteShareSendResult> sendShare({
|
||||
required ShareResourceType resourceType,
|
||||
required Map<String, Object?> payload,
|
||||
required List<String> recipientEmails,
|
||||
required String token,
|
||||
}) async {
|
||||
return const RemoteShareSendResult(
|
||||
shareId: 'share-1',
|
||||
recipientUserIds: [],
|
||||
unresolvedEmails: [],
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
final class _FakeShareInboxRepository implements ShareInboxRepository {
|
||||
@override
|
||||
Future<ShareInboxItem?> findByShareId(String shareId) async => null;
|
||||
|
||||
@override
|
||||
Future<List<ShareInboxItem>> listAll() async => const [];
|
||||
|
||||
@override
|
||||
Future<void> markStatus(
|
||||
String shareId,
|
||||
ShareInboxStatus status,
|
||||
DateTime respondedAt,
|
||||
) async {}
|
||||
|
||||
@override
|
||||
Future<void> upsert(ShareInboxItem item) async {}
|
||||
|
||||
@override
|
||||
Future<void> upsertAll(List<ShareInboxItem> items) async {}
|
||||
}
|
||||
|
||||
final class _FakePendingShareActionRepository
|
||||
implements PendingShareActionRepository {
|
||||
@override
|
||||
Future<void> add(PendingShareAction action) async {}
|
||||
|
||||
@override
|
||||
Future<List<PendingShareAction>> listPending() async => const [];
|
||||
|
||||
@override
|
||||
Future<void> markFailed(String id, DateTime attemptedAt) async {}
|
||||
|
||||
@override
|
||||
Future<void> markSucceeded(String id, DateTime attemptedAt) async {}
|
||||
}
|
||||
|
||||
final class _FakeActiveSessionRepository implements ActiveSessionRepository {
|
||||
ActiveWorkoutSession? session;
|
||||
final restStates = <ActiveRestState>[];
|
||||
|
||||
Reference in New Issue
Block a user