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:
2026-07-19 21:54:45 +02:00
parent 715fdd4335
commit 010e055404
12 changed files with 3445 additions and 1 deletions

View File

@ -92,6 +92,57 @@ class RemoteResourceMappings extends Table {
];
}
class ShareInboxItems extends Table {
@override
String get tableName => 'share_inbox_items';
TextColumn get shareId => text()();
TextColumn get senderUserId => text().withLength(min: 1)();
TextColumn get resourceType => text()();
TextColumn get payloadJson => text().withLength(min: 1)();
TextColumn get status => text()();
DateTimeColumn get createdAt => dateTime()();
DateTimeColumn get updatedAt => dateTime()();
DateTimeColumn get respondedAt => dateTime().nullable()();
@override
Set<Column> get primaryKey => {shareId};
@override
List<String> get customConstraints => [
"CHECK (resource_type IN ('program', 'workoutTemplate'))",
"CHECK (status IN ('pending', 'accepted', 'declined', 'revoked'))",
];
}
class PendingShareActions extends Table {
@override
String get tableName => 'pending_share_actions';
TextColumn get id => text()();
TextColumn get actionType => text()();
TextColumn get shareId => text().nullable()();
TextColumn get resourceType => text().nullable()();
TextColumn get payloadJson => text().nullable()();
TextColumn get recipientEmailsJson => text().nullable()();
DateTimeColumn get createdAt => dateTime()();
DateTimeColumn get lastAttemptAt => dateTime().nullable()();
IntColumn get attemptCount =>
integer().customConstraint('NOT NULL CHECK (attempt_count >= 0)')();
TextColumn get status => text()();
@override
Set<Column> get primaryKey => {id};
@override
List<String> get customConstraints => [
"CHECK (action_type IN ('send', 'accept', 'decline', 'revoke'))",
"CHECK (resource_type IS NULL OR resource_type IN "
"('program', 'workoutTemplate'))",
"CHECK (status IN ('pending', 'succeeded', 'failed'))",
];
}
class MediaAssets extends SyncableTable {
@override
String get tableName => 'media_assets';