Refactor event retrieval logic: Implement server-side filtering for past events based on user preference, enhancing performance and simplifying client-side code. Update API call in EventManagement component to include past events parameter.
All checks were successful
Deploy miriamgemeinde / deploy (push) Successful in 7s

This commit is contained in:
Torsten Schulz (local)
2026-04-29 15:23:37 +02:00
parent f7e8b31fdb
commit d412331f8e
2 changed files with 33 additions and 22 deletions

View File

@@ -4,14 +4,39 @@ const { startOfDay } = require('date-fns');
const getAllEvents = async (req, res) => { const getAllEvents = async (req, res) => {
try { try {
const includePast = String(req.query?.includePast || '').toLowerCase();
const wantsPast = includePast === '1' || includePast === 'true' || includePast === 'yes';
const where = wantsPast
? undefined
: {
[Op.or]: [
{
date: {
[Op.or]: [
{ [Op.gte]: startOfDay(new Date()) },
{ [Op.eq]: null },
],
},
},
// Recurring events without a fixed date
{ dayOfWeek: { [Op.gte]: 0 } },
],
};
const events = await Event.findAll({ const events = await Event.findAll({
where,
include: [ include: [
{ model: Institution, as: 'institution' }, { model: Institution, as: 'institution' },
{ model: EventPlace, as: 'eventPlace' }, { model: EventPlace, as: 'eventPlace' },
{ model: EventType, as: 'eventType' }, { model: EventType, as: 'eventType' },
{ model: ContactPerson, as: 'contactPersons', through: { attributes: [] } } { model: ContactPerson, as: 'contactPersons', through: { attributes: [] } }
], ],
order: ['name', 'date', 'time'] order: [
['date', 'ASC'],
['time', 'ASC'],
['name', 'ASC'],
],
}); });
res.json(events); res.json(events);
} catch (error) { } catch (error) {

View File

@@ -83,26 +83,7 @@ export default {
filteredEvents() { filteredEvents() {
let filtered = this.events; let filtered = this.events;
// Filter vergangene Events aus // Vergangenheitsfilter erfolgt serverseitig (GET /events?includePast=1)
if (!this.showPastEvents) {
const today = new Date();
today.setHours(0, 0, 0, 0);
filtered = filtered.filter(event => {
// Events mit Wochentag (ohne festes Datum) immer anzeigen
if (event.dayOfWeek !== null && event.dayOfWeek !== undefined && !event.date) {
return true;
}
// Events mit Datum: nur zukünftige oder heutige anzeigen
if (event.date) {
const eventDate = new Date(event.date);
eventDate.setHours(0, 0, 0, 0);
return eventDate >= today;
}
// Events ohne Datum und ohne Wochentag anzeigen
return true;
});
}
// Suchfilter anwenden // Suchfilter anwenden
if (this.searchQuery.trim()) { if (this.searchQuery.trim()) {
@@ -121,6 +102,11 @@ export default {
return filtered; return filtered;
} }
}, },
watch: {
showPastEvents() {
this.fetchData();
}
},
async created() { async created() {
await this.fetchData(); await this.fetchData();
this.hasNewsletterPreview = !!localStorage.getItem('newsletter_import_last_result'); this.hasNewsletterPreview = !!localStorage.getItem('newsletter_import_last_result');
@@ -176,7 +162,7 @@ export default {
async fetchData() { async fetchData() {
try { try {
const [eventResponse, institutionResponse, eventPlaceResponse, contactPersonResponse, eventTypeResponse] = await Promise.all([ const [eventResponse, institutionResponse, eventPlaceResponse, contactPersonResponse, eventTypeResponse] = await Promise.all([
axios.get('/events'), axios.get('/events', { params: { includePast: this.showPastEvents ? 1 : 0 } }),
axios.get('/institutions'), axios.get('/institutions'),
axios.get('/event-places'), axios.get('/event-places'),
axios.get('/contact-persons'), axios.get('/contact-persons'),