Datenabruf anhand von Kategorie und Datum

This commit is contained in:
Niklas 2025-01-14 20:56:06 +01:00
parent b2a752879b
commit f73d535281
5 changed files with 96 additions and 100 deletions

View File

@ -18,8 +18,8 @@ Future<void> main() async {
throw Exception('Error loading .env file: $e'); // Print error if any
}
await Supabase.initialize(
url: dotenv.env['NEXT_PUBLIC_SUPABASE_URL'] ?? 'default_url',
anonKey: dotenv.env['NEXT_PUBLIC_SUPABASE_ANON_KEY'] ?? 'default_key',
url: dotenv.env['NEXT_TEST_SUPABASE_URL'] ?? 'default_url',
anonKey: dotenv.env['NEXT_TEST_SUPABASE_ANON_KEY'] ?? 'default_key',
);
await autoLogin();
var singleCategories = Categories.instance;

View File

@ -234,3 +234,21 @@ class _Event_Card_small extends State<Event_Card_small> {
);
}
}
//fetchGroupedEvents
/* Future<List<Map<String, dynamic>>> fetchGroupedEvents(String category) async {
try {
final response = await supabase.rpc('get_events_grouped_by_date_today',
params: {'cat_id': category});
// Cast auf die gewünschte Struktur
return (response as List)
.map((entry) => {
'start_date': entry['start_date'], // Das Gruppierungsdatum
'events': (entry['events'] as List)
.cast<Map<String, dynamic>>() // Event-Details
})
.toList();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
*/

View File

@ -44,21 +44,6 @@ class _HomePage extends State<HomePage> with RouteAware {
super.dispose();
}
/* @override
void didPopNext() {
// Called when returning to this screen
_updateData();
} */
/* @override
void didChangeDependencies() {
super.didChangeDependencies();
// Diese Methode wird aufgerufen, wenn der Screen in den Fokus kommt
ModalRoute.of(context)?.addScopedWillPopCallback(() {
_updateData();
return Future.value(true);
});
} */
@override
void initState() {
super.initState();
@ -69,65 +54,6 @@ class _HomePage extends State<HomePage> with RouteAware {
_fetchDataFuture = Categories.instance.updateCategoryAmount('Ingolstadt');
}
//fetchGroupedEvents
Future<List<Map<String, dynamic>>> fetchGroupedEvents(String category) async {
try {
final response = await supabase
.rpc('get_events_grouped_by_date', params: {'cat_id': category});
// Cast auf die gewünschte Struktur
return (response as List)
.map((entry) => {
'start_date': entry['start_date'], // Das Gruppierungsdatum
'events': (entry['events'] as List)
.cast<Map<String, dynamic>>() // Event-Details
})
.toList();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
Future<List<Map<String, dynamic>>> fetchEvents(String category) async {
try {
//final today = DateTime.now().toUtc().toString().split(' ')[0];
final response = await supabase
.from("events")
//.innerJoin('event_category', 'events.id = event_category.event_id')
.select(
'id,name,description,detail,subheader,main_category_id,location(name),time!inner(*),event_category!inner(event_id)')
.eq('event_category.category_id', category);
//.gte('time.start_date', DateTime.now().toIso8601String().split('T')[0]) // Beginn des heutigen Tages
//.lt('time.start_date', DateTime.now().add(Duration(days: 1)).toIso8601String().split('T')[0]); // Morgen;
//select('id, name, cities(id, name)')
//find all events mit Ort und zusatzinfos die die Kathegorie haben welche ausgewählt wurde am heutigen Tag dann kommender Tag usw.
//final test = response[0]['time'][0]['start_date'];
return (response as List).cast<Map<String, dynamic>>();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
Future<List<Map<String, dynamic>>> fetchEventsToday(String category) async {
try {
final today = DateTime.now().toUtc().toString().split(' ')[0];
final response = await supabase
.from("events")
//.innerJoin('event_category', 'events.id = event_category.event_id')
.select(
'id,name,description,detail,subheader,main_category_id,location(name),time!inner(*),event_category!inner(event_id)')
.eq('event_category.category_id', category) //;
.eq('time.start_date', today);
//.gte('time.start_date', DateTime.now().toIso8601String().split('T')[0]) // Beginn des heutigen Tages
//.lt('time.start_date', DateTime.now().add(Duration(days: 1)).toIso8601String().split('T')[0]); // Morgen;
//select('id, name, cities(id, name)')
//find all events mit Ort und zusatzinfos die die Kathegorie haben welche ausgewählt wurde am heutigen Tag dann kommender Tag usw.
//final test = response[0]['time'][0]['start_date'];
return (response as List).cast<Map<String, dynamic>>();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
Future<void> _refresh() async {
setState(() {
// Aktualisiere die Liste (Beispiel: Einfügen neuer Daten)
@ -135,28 +61,6 @@ class _HomePage extends State<HomePage> with RouteAware {
});
}
Future<List<Map<String, dynamic>>> fetchEventsTomorrow(
String category) async {
try {
final today = DateTime.now().toUtc().toString().split(' ')[0];
final response = await supabase
.from("events")
//.innerJoin('event_category', 'events.id = event_category.event_id')
.select(
'id,name,description,detail,subheader,location(name),time!inner(*),event_category!inner(event_id)')
.eq('event_category.category_id', category) //;
.eq('time.start_date', today);
//.gte('time.start_date', DateTime.now().toIso8601String().split('T')[0]) // Beginn des heutigen Tages
//.lt('time.start_date', DateTime.now().add(Duration(days: 1)).toIso8601String().split('T')[0]); // Morgen;
//select('id, name, cities(id, name)')
//find all events mit Ort und zusatzinfos die die Kathegorie haben welche ausgewählt wurde am heutigen Tag dann kommender Tag usw.
//final test = response[0]['time'][0]['start_date'];
return (response as List).cast<Map<String, dynamic>>();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
@override
Widget build(BuildContext context) {
var size = MediaQuery.of(context).size;

View File

@ -3,6 +3,7 @@ import 'dart:async';
import 'package:flutter/material.dart';
import 'package:Emma_home/utils/class.dart';
//import 'dart:convert';
import 'package:intl/intl.dart';
import 'package:Emma_home/main.dart';
const Duration fakeAPIDuration = Duration(milliseconds: 50);
@ -127,11 +128,13 @@ class Categories extends ChangeNotifier {
for (var index = 0; index < _categories.length; index++) {
//TODO: man müsste sicherstellen, dass die Main Category bei allen Events existent ist. Und dass in den jeweilige Subcategorien nicht die MainCatgeorie vorkommt. Erst dann kann das möglich sein.
//müsste man auch in der Admin Page ermöglichen.
final today = DateTime.now().toUtc().toString().split(' ')[0];
final response = await supabase
.from("events")
.select(
'id,name,main_category_id,location(name),event_category!inner(event_id)')
.eq('event_category.category_id', _categories[index].category);
'id,name,main_category_id,location(name),event_category!inner(event_id),time!inner(*)')
.eq('event_category.category_id',
_categories[index].category); //.gte('time.start_date', today);
var temp = (response.length);
_categories[index].amount = temp;
notifyListeners();
@ -188,10 +191,34 @@ class SupabaseDataService {
}
}
Future<List<Map<String, dynamic>>> fetchGroupedEvents_day(
String category) async {
try {
final String formattedDate =
DateFormat('yyyy-MM-dd').format(DateTime.now());
final response = await supabase.rpc('get_events_grouped_by_date_in_date',
params: {'cat_id': category, 'day': formattedDate});
//final response = await supabase.rpc('get_events_grouped_input_date', params: {'day': formattedDate});
// Cast auf die gewünschte Struktur
return (response as List)
.map((entry) => {
'start_date': entry['start_date'], // Das Gruppierungsdatum
'events': (entry['events'] as List)
.cast<Map<String, dynamic>>() // Event-Details
})
.toList();
} catch (e) {
throw Exception('Failed to fetch data: $e');
}
}
Future<List<Map<String, dynamic>>> fetchGroupedEvents(String category) async {
try {
final String formattedDate =
DateFormat('yyyy-MM-dd').format(DateTime.now());
final response = await supabase
.rpc('get_events_grouped_by_date', params: {'cat_id': category});
//final response = await supabase.rpc('get_events_grouped_input_date', params: {'day': formattedDate});
// Cast auf die gewünschte Struktur
return (response as List)
.map((entry) => {

47
sql_functions.sql Normal file
View File

@ -0,0 +1,47 @@
CREATE OR REPLACE FUNCTION get_events_grouped_by_date_in_date(cat_id UUID, day date)
RETURNS TABLE(
start_date DATE,
events JSON
) AS $$
BEGIN
RETURN QUERY
WITH time_grouped AS (
SELECT
time.start_date::date AS group_start_date,
events.id AS event_id,
events.name AS event_name,
events.description AS event_description,
events.detail AS event_detail,
events.subheader AS event_subheader,
events.main_category_id AS event_main_cat,
location.name AS location_title,
time.start_date AS start_timestamp,
time.end_date AS end_timestamp
FROM events
INNER JOIN location ON events.location_id = location.id
INNER JOIN time ON time.event_id = events.id
INNER JOIN event_category ON event_category.event_id = events.id
WHERE event_category.category_id = cat_id AND time.start_date::date >= now()
GROUP BY time.start_date::date, events.id, location.name, time.start_date, time.end_date
)
SELECT
group_start_date AS start_date,
json_agg(json_build_object(
'id', event_id,
'name', event_name,
'description', event_description,
'detail', event_detail,
'subheader', event_subheader,
'main_category_id', event_main_cat,
'location_name', location_title,
'start', start_timestamp,
'end', end_timestamp
)) AS events
FROM time_grouped
GROUP BY group_start_date
ORDER BY group_start_date DESC;
END;
$$ LANGUAGE plpgsql;