base de dados Funcional
This commit is contained in:
@@ -516,11 +516,7 @@ class _GoogleMapScreenState extends State<GoogleMapScreen> {
|
||||
// Save run data to database
|
||||
Future<void> _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) {
|
||||
|
||||
@@ -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<void> _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<void> _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<void> 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<AuthState> get authStateChanges =>
|
||||
_supabase.auth.onAuthStateChange;
|
||||
@@ -115,14 +174,22 @@ class SupabaseService {
|
||||
static Future<void> 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<void> _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<void> _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) {
|
||||
|
||||
Reference in New Issue
Block a user