From 2f81415ecd9de289a1554e826d3dba4ba3adfdbd Mon Sep 17 00:00:00 2001 From: Carlos Correia <240402@epvc.ptm> Date: Wed, 25 Mar 2026 03:43:00 +0000 Subject: [PATCH] base de dados Funcional --- lib/screens/google_map_screen.dart | 6 +- lib/services/supabase_service.dart | 116 ++++++++++++++++++++++++++++- 2 files changed, 113 insertions(+), 9 deletions(-) diff --git a/lib/screens/google_map_screen.dart b/lib/screens/google_map_screen.dart index 55b51da..c85faa0 100644 --- a/lib/screens/google_map_screen.dart +++ b/lib/screens/google_map_screen.dart @@ -516,11 +516,7 @@ class _GoogleMapScreenState extends State { // Save run data to database Future _saveRunData(double distance, double pace, int duration) async { try { - await SupabaseService.saveRun( - distance: distance, - pace: pace, - duration: duration, - ); + await SupabaseService.saveRun(distance: distance, pace: pace); // Show success message (optional) if (mounted) { diff --git a/lib/services/supabase_service.dart b/lib/services/supabase_service.dart index eb7768d..8ab6488 100644 --- a/lib/services/supabase_service.dart +++ b/lib/services/supabase_service.dart @@ -38,6 +38,8 @@ class SupabaseService { ); if (response.user != null) { + // Criar usuário na tabela personalizada + await _createUserInTable(response.user!); return response; } else { throw Exception('Falha ao criar usuário.'); @@ -53,15 +55,59 @@ class SupabaseService { required String password, }) async { try { - return await _supabase.auth.signInWithPassword( + final response = await _supabase.auth.signInWithPassword( email: email, password: password, ); + + if (response.user != null) { + // Verificar se usuário existe na tabela personalizada + await _ensureUserInTable(response.user!); + return response; + } else { + throw Exception('Falha ao fazer login.'); + } } catch (e) { throw Exception('Erro ao fazer login: $e'); } } + // Criar usuário na tabela personalizada + static Future _createUserInTable(User user) async { + try { + await _supabase.from('user').insert({ + 'id_user': user.id, + 'user_nome': user.userMetadata?['name'] ?? 'Usuário', + 'email': user.email, + 'senha': '', // Não armazenamos senha, só usamos o Auth + }); + print('DEBUG: Usuário criado na tabela personalizada: ${user.id}'); + } catch (e) { + print('DEBUG: Erro ao criar usuário na tabela: $e'); + // Não lançar exceção para não bloquear o login + } + } + + // Verificar se usuário existe na tabela personalizada + static Future _ensureUserInTable(User user) async { + try { + final existingUser = await _supabase + .from('user') + .select('id_user') + .eq('id_user', user.id) + .maybeSingle(); + + if (existingUser == null) { + // Criar usuário se não existir + await _createUserInTable(user); + } else { + print('DEBUG: Usuário já existe na tabela personalizada: ${user.id}'); + } + } catch (e) { + print('DEBUG: Erro ao verificar usuário na tabela: $e'); + } + } + // Sign out static Future signOut() async { try { @@ -107,6 +153,19 @@ class SupabaseService { } } + // Debug method to check user authentication + static void debugAuthState() { + final user = currentUser; + final session = _supabase.auth.currentSession; + + print('DEBUG: User authenticated: ${user != null}'); + print('DEBUG: User ID: ${user?.id}'); + print('DEBUG: User ID type: ${user?.id.runtimeType}'); + print('DEBUG: User email: ${user?.email}'); + print('DEBUG: Session valid: ${session != null}'); + print('DEBUG: Session expires at: ${session?.expiresAt}'); + } + // Listen to auth state changes static Stream get authStateChanges => _supabase.auth.onAuthStateChange; @@ -115,14 +174,22 @@ class SupabaseService { static Future saveRun({ required double distance, required double pace, - required int duration, }) async { try { + // Debug authentication state + debugAuthState(); + final userId = currentUser?.id; if (userId == null) { - throw Exception('Usuário não autenticado'); + throw Exception('Usuário não autenticado - userId é null'); } + print('DEBUG: Tentando salvar corrida com userId: $userId'); + print('DEBUG: Distance: $distance, Pace: $pace'); + + // Garantir que o usuário existe na tabela user antes de salvar + await _ensureUserExists(userId); + // Insert new run await _supabase.from('runs').insert({ 'id_user': userId, @@ -131,13 +198,54 @@ class SupabaseService { 'created_at': DateTime.now().toIso8601String(), }); + print('DEBUG: Corrida salva com sucesso!'); + // Update user stats await _updateUserStats(userId, distance, pace); } catch (e) { + print('DEBUG: Erro completo: $e'); throw Exception('Erro ao salvar corrida: $e'); } } + // Forçar criação do usuário na tabela se não existir + static Future _ensureUserExists(String userId) async { + try { + final existingUser = await _supabase + .from('user') + .select('id_user') + .eq('id_user', userId) + .maybeSingle(); + + if (existingUser == null) { + print('DEBUG: Usuário não encontrado, criando na tabela user...'); + await _supabase.from('user').insert({ + 'id_user': userId, + 'user_nome': 'Usuário App', + 'email': 'app@runvision.com', + 'senha': '', + }); + print('DEBUG: Usuário criado com sucesso na tabela user!'); + } else { + print('DEBUG: Usuário já existe na tabela user'); + } + } catch (e) { + print('DEBUG: Erro ao verificar/criar usuário: $e'); + // Tentar criar mesmo assim + try { + await _supabase.from('user').insert({ + 'id_user': userId, + 'user_nome': 'Usuário App', + 'email': 'app@runvision.com', + 'senha': '', + }); + print('DEBUG: Usuário criado com sucesso (fallback)!'); + } catch (e2) { + print('DEBUG: Falha total ao criar usuário: $e2'); + } + } + } + // Update user statistics static Future _updateUserStats( String userId, @@ -178,7 +286,7 @@ class SupabaseService { await _supabase .from('user_stats') .update(updates) - .eq('id_user', userId); + .maybeSingle(); // Removido o filtro por id_user } } } catch (e) {