82 lines
3.2 KiB
Dart
82 lines
3.2 KiB
Dart
import 'package:supabase_flutter/supabase_flutter.dart';
|
|
import '../models/game_model.dart';
|
|
|
|
class GameController {
|
|
final _supabase = Supabase.instance.client;
|
|
|
|
// 1. LER JOGOS (Stream em Tempo Real)
|
|
Stream<List<Game>> get gamesStream {
|
|
return _supabase
|
|
.from('games') // 1. Fica à escuta da tabela original (Garante o Tempo Real!)
|
|
.stream(primaryKey: ['id'])
|
|
.asyncMap((event) async {
|
|
// 2. Sempre que a tabela 'games' mudar (novo jogo, alteração de resultado),
|
|
// vamos buscar os dados já misturados com as imagens à nossa View.
|
|
final viewData = await _supabase
|
|
.from('games_with_logos')
|
|
.select()
|
|
.order('game_date', ascending: false);
|
|
|
|
// 3. Convertemos para a nossa lista de objetos Game
|
|
return viewData.map((json) => Game.fromMap(json)).toList();
|
|
});
|
|
}
|
|
|
|
// =========================================================================
|
|
// 👇 NOVO: LER JOGOS COM FILTROS DE EQUIPA E TEMPORADA (MANTÉM OS LOGOS)
|
|
// =========================================================================
|
|
// =========================================================================
|
|
// 👇 LER JOGOS COM FILTROS DE EQUIPA E TEMPORADA (SEM ERROS DE QUERY)
|
|
// =========================================================================
|
|
Stream<List<Game>> getFilteredGames({required String teamFilter, required String seasonFilter}) {
|
|
return _supabase
|
|
.from('games')
|
|
.stream(primaryKey: ['id'])
|
|
.asyncMap((event) async {
|
|
|
|
// 1. Começamos a query APENAS com o select (Sem o order ainda!)
|
|
var query = _supabase.from('games_with_logos').select();
|
|
|
|
// 2. Se a temporada não for "Todas", aplicamos o filtro AQUI
|
|
if (seasonFilter != 'Todas') {
|
|
query = query.eq('season', seasonFilter);
|
|
}
|
|
|
|
// 3. Executamos a query e aplicamos o ORDER BY no final
|
|
final viewData = await query.order('game_date', ascending: false);
|
|
|
|
List<Game> games = viewData.map((json) => Game.fromMap(json)).toList();
|
|
|
|
// 4. Filtramos a equipa em memória
|
|
if (teamFilter != 'Todas') {
|
|
games = games.where((g) => g.myTeam == teamFilter || g.opponentTeam == teamFilter).toList();
|
|
}
|
|
|
|
return games;
|
|
});
|
|
}
|
|
// 2. CRIAR JOGO
|
|
// Retorna o ID do jogo criado para podermos navegar para o placar
|
|
Future<String?> createGame(String myTeam, String opponent, String season) async {
|
|
try {
|
|
final response = await _supabase.from('games').insert({
|
|
'my_team': myTeam,
|
|
'opponent_team': opponent,
|
|
'season': season,
|
|
'my_score': 0,
|
|
'opponent_score': 0,
|
|
'status': 'Decorrer', // Começa como "Decorrer"
|
|
'game_date': DateTime.now().toIso8601String(),
|
|
}).select().single(); // .select().single() retorna o objeto criado
|
|
|
|
return response['id']; // Retorna o UUID gerado pelo Supabase
|
|
} catch (e) {
|
|
print("Erro ao criar jogo: $e");
|
|
return null;
|
|
}
|
|
}
|
|
|
|
void dispose() {
|
|
// Não é necessário fechar streams do Supabase manualmente aqui
|
|
}
|
|
} |