From ec28f5067bc6e956c88cd7c7e153c787434861a9 Mon Sep 17 00:00:00 2001 From: Tim Shedor Date: Mon, 16 Sep 2024 19:20:59 -0700 Subject: [PATCH] fix(supabase): handle offline errors --- ...ffline_first_with_supabase_repository.dart | 59 ++++++++++++++++++- 1 file changed, 58 insertions(+), 1 deletion(-) diff --git a/packages/brick_offline_first_with_supabase/lib/src/offline_first_with_supabase_repository.dart b/packages/brick_offline_first_with_supabase/lib/src/offline_first_with_supabase_repository.dart index 70bd246c..043c880a 100644 --- a/packages/brick_offline_first_with_supabase/lib/src/offline_first_with_supabase_repository.dart +++ b/packages/brick_offline_first_with_supabase/lib/src/offline_first_with_supabase_repository.dart @@ -64,6 +64,63 @@ abstract class OfflineFirstWithSupabaseRepository remoteProvider: supabaseProvider, ); + @override + Future delete( + TModel instance, { + OfflineFirstDeletePolicy policy = OfflineFirstDeletePolicy.optimisticLocal, + Query? query, + }) async { + try { + return await super.delete(instance, policy: policy, query: query); + } on PostgrestException catch (e) { + logger.warning('#delete supabase failure: $e'); + + if (policy == OfflineFirstDeletePolicy.requireRemote) { + throw OfflineFirstException(e); + } + + return false; + } + } + + @override + Future> get({ + OfflineFirstGetPolicy policy = OfflineFirstGetPolicy.awaitRemoteWhenNoneExist, + query, + bool seedOnly = false, + }) async { + try { + return await super.get( + policy: policy, + query: query, + seedOnly: seedOnly, + ); + } on PostgrestException catch (e) { + logger.warning('#get supabase failure: $e'); + + if (policy == OfflineFirstGetPolicy.awaitRemote) { + throw OfflineFirstException(e); + } + + return []; + } + } + + @protected + @override + Future> hydrate({ + bool deserializeSqlite = true, + Query? query, + }) async { + try { + return await super.hydrate(deserializeSqlite: deserializeSqlite, query: query); + } on PostgrestException catch (e) { + logger.warning('#hydrate supabase failure: $e'); + } + + return []; + } + @override @mustCallSuper Future initialize() async { @@ -92,7 +149,7 @@ abstract class OfflineFirstWithSupabaseRepository logger.warning('#upsert supabase failure: $e'); if (policy == OfflineFirstUpsertPolicy.requireRemote) { - throw OfflineFirstException(Exception(e)); + throw OfflineFirstException(e); } return instance;