assist
This commit is contained in:
@@ -6,44 +6,47 @@ class TeamController {
|
||||
|
||||
// 1. STREAM (Realtime)
|
||||
Stream<List<Map<String, dynamic>>> get teamsStream {
|
||||
final userId = _supabase.auth.currentUser?.id;
|
||||
|
||||
if (userId == null) return const Stream.empty();
|
||||
|
||||
return _supabase
|
||||
.from('teams')
|
||||
.stream(primaryKey: ['id'])
|
||||
.order('name', ascending: true)
|
||||
.map((data) => List<Map<String, dynamic>>.from(data));
|
||||
.eq('user_id', userId); // ✅ Bem feito, este já estava certo!
|
||||
}
|
||||
|
||||
// 2. CRIAR (Agora aceita um File e faz o Upload!)
|
||||
// 2. CRIAR (Agora guarda o dono da equipa!)
|
||||
Future<void> createTeam(String name, String season, File? imageFile) async {
|
||||
try {
|
||||
final userId = _supabase.auth.currentUser?.id;
|
||||
if (userId == null) throw Exception("Utilizador não autenticado.");
|
||||
|
||||
String? uploadedImageUrl;
|
||||
|
||||
// Se o utilizador escolheu uma imagem, fazemos o upload primeiro
|
||||
if (imageFile != null) {
|
||||
// Criar um nome único para o ficheiro (ex: id do user + timestamp)
|
||||
final userId = _supabase.auth.currentUser?.id ?? 'default';
|
||||
final fileName = '${userId}_${DateTime.now().millisecondsSinceEpoch}.png';
|
||||
final storagePath = 'teams/$fileName';
|
||||
|
||||
// Faz o upload para o bucket 'avatars' (podes usar o mesmo ou criar um chamado 'teams_logos')
|
||||
await _supabase.storage.from('avatars').upload(
|
||||
storagePath,
|
||||
imageFile,
|
||||
fileOptions: const FileOptions(cacheControl: '3600', upsert: true)
|
||||
);
|
||||
|
||||
// Vai buscar o URL público
|
||||
uploadedImageUrl = _supabase.storage.from('avatars').getPublicUrl(storagePath);
|
||||
}
|
||||
|
||||
// Agora insere a equipa na base de dados (com ou sem URL)
|
||||
// Agora insere a equipa na base de dados com o ID DO DONO!
|
||||
await _supabase.from('teams').insert({
|
||||
'user_id': userId, // 👈 CRUCIAL: Diz à base de dados de quem é esta equipa!
|
||||
'name': name,
|
||||
'season': season,
|
||||
'image_url': uploadedImageUrl ?? '', // Se não houver foto, guarda vazio
|
||||
'image_url': uploadedImageUrl ?? '',
|
||||
'is_favorite': false,
|
||||
});
|
||||
print("✅ Equipa guardada no Supabase!");
|
||||
print("✅ Equipa guardada no Supabase com dono associado!");
|
||||
} catch (e) {
|
||||
print("❌ Erro ao criar equipa: $e");
|
||||
}
|
||||
@@ -52,6 +55,7 @@ class TeamController {
|
||||
// 3. ELIMINAR
|
||||
Future<void> deleteTeam(String id) async {
|
||||
try {
|
||||
// Como segurança extra, podemos garantir que só apaga se for o dono (opcional se tiveres RLS no Supabase)
|
||||
await _supabase.from('teams').delete().eq('id', id);
|
||||
} catch (e) {
|
||||
print("❌ Erro ao eliminar: $e");
|
||||
@@ -80,13 +84,19 @@ class TeamController {
|
||||
}
|
||||
}
|
||||
|
||||
// 6. CONTAR JOGADORES (STREAM EM TEMPO REAL)
|
||||
Future<List<Map<String, dynamic>>> getTeamsWithStats() async {
|
||||
// 6. VIEW DAS EQUIPAS (AQUI ESTAVA O TEU ERRO DE LISTAGEM!)
|
||||
Future<List<Map<String, dynamic>>> getTeamsWithStats() async {
|
||||
final userId = _supabase.auth.currentUser?.id;
|
||||
if (userId == null) return []; // Retorna lista vazia se não houver login
|
||||
|
||||
final data = await _supabase
|
||||
.from('teams_with_stats') // Lemos da View que criámos!
|
||||
.from('teams_with_stats')
|
||||
.select('*')
|
||||
.eq('user_id', userId) // 👈 CRUCIAL: Só puxa as estatísticas das tuas equipas!
|
||||
.order('name', ascending: true);
|
||||
|
||||
return List<Map<String, dynamic>>.from(data);
|
||||
}
|
||||
|
||||
void dispose() {}
|
||||
}
|
||||
Reference in New Issue
Block a user