57 lines
1.4 KiB
Dart
57 lines
1.4 KiB
Dart
import 'dart:convert';
|
|
|
|
import 'package:seshat/data/services/api_client.dart';
|
|
import 'package:seshat/data/services/websocket_client.dart';
|
|
import 'package:seshat/domain/models/owner.dart';
|
|
import 'package:seshat/utils/result.dart';
|
|
|
|
class OwnerRepository {
|
|
OwnerRepository({
|
|
required ApiClient apiClient,
|
|
required WebsocketClient wsClient,
|
|
}) : _apiClient = apiClient,
|
|
_wsClient = wsClient;
|
|
|
|
final ApiClient _apiClient;
|
|
final WebsocketClient _wsClient;
|
|
List<Owner>? _cachedOwners;
|
|
|
|
Future<Result<Owner>> postOwner(
|
|
String firstName,
|
|
String lastName,
|
|
String contact,
|
|
) async {
|
|
return Result.ok(
|
|
Owner(firstName: firstName, lastName: lastName, contact: contact, id: 50),
|
|
);
|
|
}
|
|
|
|
Future<Result<List<Owner>>> getOwners() async {
|
|
if (_cachedOwners == null) {
|
|
final result = await _apiClient.getOwners();
|
|
|
|
if (result is Ok<List<Owner>>) {
|
|
_cachedOwners = result.value;
|
|
}
|
|
|
|
return result;
|
|
} else {
|
|
return Result.ok(_cachedOwners!);
|
|
}
|
|
}
|
|
|
|
Stream<Owner> liveOwners() async* {
|
|
await for (String data in await _wsClient.connect()) {
|
|
Map<String, dynamic> decodedData = jsonDecode(
|
|
data,
|
|
).cast<Map<String, dynamic>>();
|
|
Owner owner = Owner.fromJSON(decodedData);
|
|
if (_cachedOwners == null) {
|
|
await getOwners();
|
|
} else {
|
|
_cachedOwners!.add(owner);
|
|
yield* Stream.value(owner);
|
|
}
|
|
}
|
|
}
|
|
}
|