auto-claude: subtask-4-3 - Create gRPC-based deliveries provider

Add grpcDeliveriesProvider as a gRPC-based alternative to deliveriesProvider.
The new provider uses GrpcCqrsApiClient.getDeliveries() for improved
performance and type safety. Follows the existing pattern with:
- FutureProvider.family pattern for route-specific queries
- Authentication check before API calls
- Result.when() for proper error handling
- Warehouse delivery appended at the end

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Mathias Beaulieu-Duncan 2026-01-20 13:09:56 -05:00
parent 1d3c06bc4c
commit 4a9377e0a9
2 changed files with 44 additions and 3 deletions

View File

@ -3,7 +3,7 @@
"spec": "002-migrate-api-routes-from-http-to-grpc", "spec": "002-migrate-api-routes-from-http-to-grpc",
"state": "building", "state": "building",
"subtasks": { "subtasks": {
"completed": 9, "completed": 10,
"total": 13, "total": 13,
"in_progress": 1, "in_progress": 1,
"failed": 0 "failed": 0
@ -18,8 +18,8 @@
"max": 1 "max": 1
}, },
"session": { "session": {
"number": 10, "number": 11,
"started_at": "2026-01-20T12:45:59.858836" "started_at": "2026-01-20T12:45:59.858836"
}, },
"last_update": "2026-01-20T13:08:01.853317" "last_update": "2026-01-20T13:09:16.962328"
} }

View File

@ -132,6 +132,47 @@ final grpcDeliveryRoutesProvider = FutureProvider<List<DeliveryRoute>>((ref) asy
); );
}); });
/// Provider for deliveries using gRPC.
///
/// This is the gRPC-based alternative to [deliveriesProvider].
/// Uses [GrpcCqrsApiClient] for improved performance and type safety.
/// Takes a [routeFragmentId] parameter to fetch deliveries for a specific route.
///
/// Example usage:
/// ```dart
/// final deliveries = ref.watch(grpcDeliveriesProvider(routeFragmentId));
/// deliveries.when(
/// data: (data) => displayDeliveries(data),
/// loading: () => showLoading(),
/// error: (error, stack) => showError(error),
/// );
/// ```
final grpcDeliveriesProvider = FutureProvider.family<List<Delivery>, int>((ref, routeFragmentId) async {
final authService = ref.watch(authServiceProvider);
final isAuthenticated = await authService.isAuthenticated();
if (!isAuthenticated) {
throw Exception('User not authenticated');
}
final grpcClient = ref.watch(grpcClientProvider);
final result = await grpcClient.getDeliveries(routeFragmentId: routeFragmentId);
final deliveries = result.when(
success: (deliveries) => deliveries,
onError: (error) {
debugPrint('ERROR fetching deliveries for route $routeFragmentId via gRPC: ${error.message}');
if (error.originalException != null) {
debugPrint('Original exception: ${error.originalException}');
}
throw Exception(error.message);
},
);
// Always append the warehouse delivery at the end
return [...deliveries, Delivery.createWarehouseDelivery()];
});
final deliveriesProvider = FutureProvider.family<List<Delivery>, int>((ref, routeFragmentId) async { final deliveriesProvider = FutureProvider.family<List<Delivery>, int>((ref, routeFragmentId) async {
final authService = ref.watch(authServiceProvider); final authService = ref.watch(authServiceProvider);
final isAuthenticated = await authService.isAuthenticated(); final isAuthenticated = await authService.isAuthenticated();