import '../core/networking/api_client.dart';
import '../models/messaging_models.dart';
import 'messaging_repository.dart';
class HttpMessagingRepository implements MessagingRepository {
const HttpMessagingRepository(this.client);
final ApiClient client;
@override
Future<List<MessagingDeviceData>> listOwnDevices() async {
return _devices(await client.getJson('/messaging/devices'));
}
@override
Future<String> registerDevice(MessagingDeviceData device) async {
final response = await client.postJson(
'/messaging/devices',
body: device.toJson(),
);
return _string(response['device_id']);
}
@override
Future<bool> revokeDevice(String deviceId) async {
final response = await client.deleteJson(
'/messaging/devices/${Uri.encodeComponent(deviceId)}',
);
return response['revoked'] == true;
}
@override
Future<List<MessagingDeviceData>> listUserDevices(int userId) async {
return _devices(await client.getJson('/messaging/users/$userId/devices'));
}
@override
Future<List<MessagingConversationData>> listConversations() async {
final response = await client.getJson('/messaging/conversations');
final raw = response['conversations'];
return raw is List
? raw
.whereType<Map<String, dynamic>>()
.map(MessagingConversationData.fromJson)
.toList(growable: false)
: const [];
}
@override
Future<MessagingConversationData> createConversation(
List<int> participantUserIds,
) async {
final response = await client.postJson(
'/messaging/conversations',
body: {'participant_user_ids': participantUserIds},
);
return MessagingConversationData.fromJson(response);
}
@override
Future<MessagingMessageList> listMessages(
int conversationId, {
int? before,
int limit = 50,
}) async {
return MessagingMessageList.fromJson(
await client.getJson(
'/messaging/conversations/$conversationId/messages',
queryParameters: {
'limit': '$limit',
if (before != null) 'before': '$before',
},
),
);
}
@override
Future<StoredMessageData> sendMessage(
int conversationId,
EncryptedMessageEnvelope envelope,
) async {
return StoredMessageData.fromJson(
await client.postJson(
'/messaging/conversations/$conversationId/messages',
body: envelope.toJson(),
),
);
}
List<MessagingDeviceData> _devices(Map<String, dynamic> response) {
final raw = response['devices'];
return raw is List
? raw
.whereType<Map<String, dynamic>>()
.map(MessagingDeviceData.fromJson)
.toList(growable: false)
: const [];
}
String _string(Object? value) => value is String ? value : '';
}
