Datenabruf anhand von Kategorie und Datum
This commit is contained in:
parent
b2a752879b
commit
f73d535281
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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');
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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) => {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
||||
|
||||
Loading…
Reference in New Issue