import '../domain/domain.dart'; abstract interface class UserRepository { Future findByEmail(String email); Future findById(String id); Future insert(UserAccount user); Future updatePasswordHash({ required String userId, required String passwordHash, required DateTime updatedAt, }); } abstract interface class AuthSessionRepository { Future insert(AuthSession session); Future findByTokenHash(String tokenHash); Future revoke({required String sessionId, required DateTime revokedAt}); } enum SyncWriteStatus { accepted, ignoredOlder } final class SyncWriteResult { const SyncWriteResult({required this.status, required this.resource}); final SyncWriteStatus status; final SyncedResource resource; } abstract interface class SyncedResourceRepository { Future upsertWithLww(SyncedResource resource); Future> findAllForUserSince({ required String ownerUserId, DateTime? since, }); } final class ShareInboxItem { const ShareInboxItem({required this.share, required this.recipient}); final Share share; final ShareRecipient recipient; } abstract interface class ShareRepository { Future insertShare({ required Share share, required List recipients, }); Future> listInbox(String recipientUserId); Future findShareById(String shareId); Future findRecipient({ required String shareId, required String recipientUserId, }); Future updateRecipientStatus({ required String recipientId, required ShareRecipientStatus status, required DateTime respondedAt, }); Future> acceptShare({ required String recipientId, required DateTime respondedAt, required List resources, }); Future revokeShare({ required String shareId, required DateTime revokedAt, }); } abstract interface class PasswordHasher { Future hash(String password); Future verify({required String password, required String passwordHash}); } abstract interface class OpaqueTokenService { String generateToken(); String hashToken(String token); } abstract interface class Clock { DateTime now(); } abstract interface class IdGenerator { String newId(); }