new features
This commit is contained in:
@@ -248,7 +248,8 @@ class EventsService {
|
||||
k.farbe AS kategorie_farbe,
|
||||
k.icon AS kategorie_icon,
|
||||
v.datum_von, v.datum_bis, v.ganztaegig,
|
||||
v.alle_gruppen, v.zielgruppen, v.abgesagt, v.anmeldung_erforderlich
|
||||
v.alle_gruppen, v.zielgruppen, v.abgesagt, v.anmeldung_erforderlich,
|
||||
v.wiederholung, v.wiederholung_parent_id
|
||||
FROM veranstaltungen v
|
||||
LEFT JOIN veranstaltung_kategorien k ON k.id = v.kategorie_id
|
||||
WHERE (v.datum_von BETWEEN $1 AND $2 OR v.datum_bis BETWEEN $1 AND $2 OR (v.datum_von <= $1 AND v.datum_bis >= $2))
|
||||
@@ -274,7 +275,8 @@ class EventsService {
|
||||
k.farbe AS kategorie_farbe,
|
||||
k.icon AS kategorie_icon,
|
||||
v.datum_von, v.datum_bis, v.ganztaegig,
|
||||
v.alle_gruppen, v.zielgruppen, v.abgesagt, v.anmeldung_erforderlich
|
||||
v.alle_gruppen, v.zielgruppen, v.abgesagt, v.anmeldung_erforderlich,
|
||||
v.wiederholung, v.wiederholung_parent_id
|
||||
FROM veranstaltungen v
|
||||
LEFT JOIN veranstaltung_kategorien k ON k.id = v.kategorie_id
|
||||
WHERE v.datum_von > NOW()
|
||||
@@ -454,6 +456,8 @@ class EventsService {
|
||||
|
||||
/**
|
||||
* Updates an existing event.
|
||||
* If the event is a recurrence parent and wiederholung is provided,
|
||||
* it deletes all future instances and regenerates them.
|
||||
* Returns the updated record or null if not found.
|
||||
*/
|
||||
async updateEvent(id: string, data: UpdateVeranstaltungData): Promise<Veranstaltung | null> {
|
||||
@@ -475,6 +479,7 @@ class EventsService {
|
||||
max_teilnehmer: data.max_teilnehmer,
|
||||
anmeldung_erforderlich: data.anmeldung_erforderlich,
|
||||
anmeldung_bis: data.anmeldung_bis,
|
||||
wiederholung: data.wiederholung,
|
||||
};
|
||||
|
||||
for (const [col, val] of Object.entries(fieldMap)) {
|
||||
@@ -494,7 +499,58 @@ class EventsService {
|
||||
values
|
||||
);
|
||||
if (result.rows.length === 0) return null;
|
||||
return rowToVeranstaltung(result.rows[0]);
|
||||
|
||||
const updated = result.rows[0];
|
||||
|
||||
// If this is a recurrence parent and wiederholung was updated, regenerate instances
|
||||
if (data.wiederholung !== undefined && updated.wiederholung_parent_id === null) {
|
||||
// Delete all existing children of this parent
|
||||
await pool.query(
|
||||
`DELETE FROM veranstaltungen WHERE wiederholung_parent_id = $1`,
|
||||
[id]
|
||||
);
|
||||
|
||||
if (data.wiederholung) {
|
||||
// Regenerate instances from the (possibly new) dates and config
|
||||
const datumVon = data.datum_von ? new Date(data.datum_von) : new Date(updated.datum_von);
|
||||
const datumBis = data.datum_bis ? new Date(data.datum_bis) : new Date(updated.datum_bis);
|
||||
const occurrenceDates = this.generateRecurrenceDates(datumVon, datumBis, data.wiederholung);
|
||||
if (occurrenceDates.length > 0) {
|
||||
const duration = datumBis.getTime() - datumVon.getTime();
|
||||
for (const occDate of occurrenceDates) {
|
||||
const occBis = new Date(occDate.getTime() + duration);
|
||||
await pool.query(
|
||||
`INSERT INTO veranstaltungen (
|
||||
wiederholung_parent_id, titel, beschreibung, ort, ort_url, kategorie_id,
|
||||
datum_von, datum_bis, ganztaegig, zielgruppen, alle_gruppen,
|
||||
max_teilnehmer, anmeldung_erforderlich, erstellt_von
|
||||
) VALUES ($1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11,$12,$13,$14)`,
|
||||
[
|
||||
id,
|
||||
updated.titel,
|
||||
updated.beschreibung ?? null,
|
||||
updated.ort ?? null,
|
||||
updated.ort_url ?? null,
|
||||
updated.kategorie_id ?? null,
|
||||
occDate,
|
||||
occBis,
|
||||
updated.ganztaegig,
|
||||
updated.zielgruppen,
|
||||
updated.alle_gruppen,
|
||||
updated.max_teilnehmer ?? null,
|
||||
updated.anmeldung_erforderlich,
|
||||
updated.erstellt_von,
|
||||
]
|
||||
);
|
||||
}
|
||||
logger.info(`Regenerated ${occurrenceDates.length} recurrence instances for event ${id}`);
|
||||
}
|
||||
} else {
|
||||
logger.info(`Removed recurrence from event ${id}, all instances deleted`);
|
||||
}
|
||||
}
|
||||
|
||||
return rowToVeranstaltung(updated);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user