import '../../core/network/i_api_client.dart'; import 'models/friend_request.dart'; abstract class FriendRepository { Future> getFriends(); Future getRequestById(String friendshipId); Future> getRequestsByIds( List friendshipIds, ); Future acceptRequest(String friendshipId); Future declineRequest(String friendshipId); } class FriendRepositoryImpl implements FriendRepository { final IApiClient _apiClient; static const _prefix = '/api/v1/friends'; FriendRepositoryImpl(this._apiClient); @override Future> getFriends() async { final response = await _apiClient.get>(_prefix); final data = response.data; if (data == null) { throw StateError('Invalid getFriends response: empty payload'); } return data .map((item) => item as Map) .map( (item) => FriendUser.fromJson(item['friend'] as Map), ) .toList(growable: false); } @override Future getRequestById(String friendshipId) async { final response = await _apiClient.get>( '$_prefix/requests/$friendshipId', ); final data = response.data; if (data == null) { throw StateError('Invalid getRequestById response: empty payload'); } return FriendRequest.fromJson(data); } @override Future> getRequestsByIds( List friendshipIds, ) async { if (friendshipIds.isEmpty) { return const {}; } final pairs = await Future.wait( friendshipIds.map((id) async { final request = await getRequestById(id); return MapEntry(id, request); }), ); return Map.fromEntries(pairs); } @override Future acceptRequest(String friendshipId) async { final response = await _apiClient.post>( '$_prefix/requests/$friendshipId/accept', ); final data = response.data; if (data == null) { throw StateError('Invalid acceptRequest response: empty payload'); } return FriendRequest.fromJson(data); } @override Future declineRequest(String friendshipId) async { final response = await _apiClient.post>( '$_prefix/requests/$friendshipId/decline', ); final data = response.data; if (data == null) { throw StateError('Invalid declineRequest response: empty payload'); } return FriendRequest.fromJson(data); } }