feat(server): partage ciblé de programmes et séances entre comptes (ticket #51)

Ajoute l'endpoint api/share_api.dart, les use cases de partage
(application/share_use_cases.dart) et l'adapter Postgres
(infrastructure/postgres/share_repository.dart). L'acceptation d'un
partage crée une nouvelle ressource synced_resources avec de nouveaux
IDs pour le destinataire, sans jamais modifier la ressource source de
l'émetteur ; gestion des conflits révoqué/déjà répondu. dart pub get
OK, dart analyze clean, dart test 24/24 vert. Use case d'acceptation
relu manuellement et jugé correct ; pas de test de bout en bout contre
un vrai PostgreSQL faute d'accès Docker dans ce sandbox.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
2026-07-19 10:34:09 +02:00
parent c232bdcec1
commit db6e84be06
15 changed files with 1531 additions and 13 deletions

View File

@ -40,6 +40,40 @@ abstract interface class SyncedResourceRepository {
});
}
final class ShareInboxItem {
const ShareInboxItem({required this.share, required this.recipient});
final Share share;
final ShareRecipient recipient;
}
abstract interface class ShareRepository {
Future<void> insertShare({
required Share share,
required List<ShareRecipient> recipients,
});
Future<List<ShareInboxItem>> listInbox(String recipientUserId);
Future<Share?> findShareById(String shareId);
Future<ShareRecipient?> findRecipient({
required String shareId,
required String recipientUserId,
});
Future<void> updateRecipientStatus({
required String recipientId,
required ShareRecipientStatus status,
required DateTime respondedAt,
});
Future<void> revokeShare({
required String shareId,
required DateTime revokedAt,
});
}
abstract interface class PasswordHasher {
Future<String> hash(String password);