diff --git a/app/lib/features/catalog/data/catalog_failure_mapper.dart b/app/lib/features/catalog/data/catalog_failure_mapper.dart index e47769d..b9e88e1 100644 --- a/app/lib/features/catalog/data/catalog_failure_mapper.dart +++ b/app/lib/features/catalog/data/catalog_failure_mapper.dart @@ -5,6 +5,8 @@ import 'package:shuffle/core/platform/io_error.dart'; import 'package:shuffle/features/catalog/domain/catalog_failure.dart'; import 'package:supabase_flutter/supabase_flutter.dart'; +const _invalidInputCodes = {'P0001', '22003', '22P02'}; + /// Translates exceptions of `supabase_flutter` into a [CatalogFailure] /// (Spec #3 ยง 5.2). CatalogFailure mapCatalogError(Object error) { @@ -13,7 +15,9 @@ CatalogFailure mapCatalogError(Object error) { isIoNetworkError(error)) { return const CatalogFailure.network(); } - if (error is PostgrestException && error.code == 'P0001') { + // P0001: RPC input checks; 22003: number out of range (smallint cast); + // 22P02: invalid text representation. None gets better by repeating. + if (error is PostgrestException && _invalidInputCodes.contains(error.code)) { return const CatalogFailure.invalidInput(); } return const CatalogFailure.unexpected(); diff --git a/app/test/features/catalog/domain/catalog_domain_test.dart b/app/test/features/catalog/domain/catalog_domain_test.dart index 5f76b79..3092fe1 100644 --- a/app/test/features/catalog/domain/catalog_domain_test.dart +++ b/app/test/features/catalog/domain/catalog_domain_test.dart @@ -182,6 +182,13 @@ void main() { ), isA(), ); + for (final code in ['22003', '22P02']) { + expect( + mapCatalogError(PostgrestException(message: 'x', code: code)), + isA(), + reason: code, + ); + } expect( mapCatalogError(const PostgrestException(message: 'x', code: '42501')), isA(),