diff --git a/designer_v2/lib/main.dart b/designer_v2/lib/main.dart index b442de611..836293c40 100644 --- a/designer_v2/lib/main.dart +++ b/designer_v2/lib/main.dart @@ -29,7 +29,7 @@ Future main() async { ); }, (error, stackTrace) { // TODO: top-level error handling - print("Exception: $error"); + print("Error: $error"); print("Stack: $stackTrace"); }); } diff --git a/designer_v2/lib/repositories/api_client.dart b/designer_v2/lib/repositories/api_client.dart index ea0682207..af27508a3 100644 --- a/designer_v2/lib/repositories/api_client.dart +++ b/designer_v2/lib/repositories/api_client.dart @@ -15,6 +15,7 @@ abstract class StudyUApi { Future deleteStudy(Study study); Future saveStudyInvite(StudyInvite invite); Future fetchStudyInvite(String code); + Future fetchStudyFromInvite(String code); Future deleteStudyInvite(StudyInvite invite); Future> deleteParticipants( Study study, @@ -206,6 +207,20 @@ class StudyUApiClient extends SupabaseClientDependant ); } + @override + Future fetchStudyFromInvite(String code) async { + await _testDelay(); + try { + final request = await executeRpc( + 'get_study_record_from_invite', + params: {'invite_code': code}, + ); + return deserializeObject(request); + } catch (e) { + throw StudyInviteNotFoundException(); + } + } + @override Future saveStudyInvite(StudyInvite invite) async { await _testDelay(); @@ -262,7 +277,9 @@ class StudyUApiClient extends SupabaseClientDependant final result = await future; return result; } on SupabaseQueryError catch (e) { - if (onError == null || e.statusCode == null) { + if (onError == null || + onError[e.statusCode] == null || + e.statusCode == null) { throw _apiException(error: e); } final errorHandler = onError[e.statusCode]!; diff --git a/designer_v2/lib/repositories/invite_code_repository.dart b/designer_v2/lib/repositories/invite_code_repository.dart index 9589fefac..5293d2569 100644 --- a/designer_v2/lib/repositories/invite_code_repository.dart +++ b/designer_v2/lib/repositories/invite_code_repository.dart @@ -54,9 +54,11 @@ class InviteCodeRepository extends ModelRepository @override Future isCodeAlreadyUsed(String code) async { try { - await apiClient.fetchStudyInvite(code); + await apiClient.fetchStudyFromInvite(code); } on StudyInviteNotFoundException { return false; + } catch (e) { + rethrow; } return true; } diff --git a/designer_v2/lib/repositories/supabase_client.dart b/designer_v2/lib/repositories/supabase_client.dart index 619f4b132..e6e0b51bf 100644 --- a/designer_v2/lib/repositories/supabase_client.dart +++ b/designer_v2/lib/repositories/supabase_client.dart @@ -104,6 +104,21 @@ mixin SupabaseQueryMixin on SupabaseClientDependant { } } + Future executeRpc( + String functionName, { + Map? params, + }) async { + try { + return await this.supabaseClient.rpc(functionName, params: params); + } on PostgrestException catch (error) { + throw SupabaseQueryError( + statusCode: error.code, + message: error.message, + details: error.details, + ); + } + } + // - Deserialization List deserializeList(dynamic data) {