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
All checks were successful
Deploy miriamgemeinde / deploy (push) Successful in 7s
This commit is contained in:
@@ -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) {
|
||||||
|
|||||||
@@ -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'),
|
||||||
|
|||||||
Reference in New Issue
Block a user