|
|
|
|
@@ -104,7 +104,7 @@ class EventsService {
|
|
|
|
|
/** Returns all event categories ordered by name. */
|
|
|
|
|
async getKategorien(): Promise<VeranstaltungKategorie[]> {
|
|
|
|
|
const result = await pool.query(`
|
|
|
|
|
SELECT id, name, beschreibung, farbe, icon, erstellt_von, erstellt_am, aktualisiert_am
|
|
|
|
|
SELECT id, name, beschreibung, farbe, icon, zielgruppen, erstellt_von, erstellt_am, aktualisiert_am
|
|
|
|
|
FROM veranstaltung_kategorien
|
|
|
|
|
ORDER BY name ASC
|
|
|
|
|
`);
|
|
|
|
|
@@ -114,6 +114,7 @@ class EventsService {
|
|
|
|
|
beschreibung: row.beschreibung ?? null,
|
|
|
|
|
farbe: row.farbe ?? null,
|
|
|
|
|
icon: row.icon ?? null,
|
|
|
|
|
zielgruppen: row.zielgruppen ?? [],
|
|
|
|
|
erstellt_von: row.erstellt_von ?? null,
|
|
|
|
|
erstellt_am: new Date(row.erstellt_am),
|
|
|
|
|
aktualisiert_am: new Date(row.aktualisiert_am),
|
|
|
|
|
@@ -123,10 +124,10 @@ class EventsService {
|
|
|
|
|
/** Creates a new event category. */
|
|
|
|
|
async createKategorie(data: CreateKategorieData, userId: string): Promise<VeranstaltungKategorie> {
|
|
|
|
|
const result = await pool.query(
|
|
|
|
|
`INSERT INTO veranstaltung_kategorien (name, beschreibung, farbe, icon, erstellt_von)
|
|
|
|
|
VALUES ($1, $2, $3, $4, $5)
|
|
|
|
|
RETURNING id, name, beschreibung, farbe, icon, erstellt_von, erstellt_am, aktualisiert_am`,
|
|
|
|
|
[data.name, data.beschreibung ?? null, data.farbe ?? null, data.icon ?? null, userId]
|
|
|
|
|
`INSERT INTO veranstaltung_kategorien (name, beschreibung, farbe, icon, zielgruppen, erstellt_von)
|
|
|
|
|
VALUES ($1, $2, $3, $4, $5, $6)
|
|
|
|
|
RETURNING id, name, beschreibung, farbe, icon, zielgruppen, erstellt_von, erstellt_am, aktualisiert_am`,
|
|
|
|
|
[data.name, data.beschreibung ?? null, data.farbe ?? null, data.icon ?? null, data.zielgruppen ?? [], userId]
|
|
|
|
|
);
|
|
|
|
|
const row = result.rows[0];
|
|
|
|
|
return {
|
|
|
|
|
@@ -135,6 +136,7 @@ class EventsService {
|
|
|
|
|
beschreibung: row.beschreibung ?? null,
|
|
|
|
|
farbe: row.farbe ?? null,
|
|
|
|
|
icon: row.icon ?? null,
|
|
|
|
|
zielgruppen: row.zielgruppen ?? [],
|
|
|
|
|
erstellt_von: row.erstellt_von ?? null,
|
|
|
|
|
erstellt_am: new Date(row.erstellt_am),
|
|
|
|
|
aktualisiert_am: new Date(row.aktualisiert_am),
|
|
|
|
|
@@ -151,11 +153,12 @@ class EventsService {
|
|
|
|
|
if (data.beschreibung !== undefined) { fields.push(`beschreibung = $${idx++}`); values.push(data.beschreibung); }
|
|
|
|
|
if (data.farbe !== undefined) { fields.push(`farbe = $${idx++}`); values.push(data.farbe); }
|
|
|
|
|
if (data.icon !== undefined) { fields.push(`icon = $${idx++}`); values.push(data.icon); }
|
|
|
|
|
if (data.zielgruppen !== undefined) { fields.push(`zielgruppen = $${idx++}`); values.push(data.zielgruppen); }
|
|
|
|
|
|
|
|
|
|
if (fields.length === 0) {
|
|
|
|
|
// Nothing to update — return the existing record
|
|
|
|
|
const existing = await pool.query(
|
|
|
|
|
`SELECT id, name, beschreibung, farbe, icon, erstellt_von, erstellt_am, aktualisiert_am
|
|
|
|
|
`SELECT id, name, beschreibung, farbe, icon, zielgruppen, erstellt_von, erstellt_am, aktualisiert_am
|
|
|
|
|
FROM veranstaltung_kategorien WHERE id = $1`,
|
|
|
|
|
[id]
|
|
|
|
|
);
|
|
|
|
|
@@ -163,7 +166,8 @@ class EventsService {
|
|
|
|
|
const row = existing.rows[0];
|
|
|
|
|
return {
|
|
|
|
|
id: row.id, name: row.name, beschreibung: row.beschreibung ?? null,
|
|
|
|
|
farbe: row.farbe ?? null, icon: row.icon ?? null, erstellt_von: row.erstellt_von ?? null,
|
|
|
|
|
farbe: row.farbe ?? null, icon: row.icon ?? null, zielgruppen: row.zielgruppen ?? [],
|
|
|
|
|
erstellt_von: row.erstellt_von ?? null,
|
|
|
|
|
erstellt_am: new Date(row.erstellt_am), aktualisiert_am: new Date(row.aktualisiert_am),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
@@ -174,14 +178,15 @@ class EventsService {
|
|
|
|
|
const result = await pool.query(
|
|
|
|
|
`UPDATE veranstaltung_kategorien SET ${fields.join(', ')}
|
|
|
|
|
WHERE id = $${idx}
|
|
|
|
|
RETURNING id, name, beschreibung, farbe, icon, erstellt_von, erstellt_am, aktualisiert_am`,
|
|
|
|
|
RETURNING id, name, beschreibung, farbe, icon, zielgruppen, erstellt_von, erstellt_am, aktualisiert_am`,
|
|
|
|
|
values
|
|
|
|
|
);
|
|
|
|
|
if (result.rows.length === 0) return null;
|
|
|
|
|
const row = result.rows[0];
|
|
|
|
|
return {
|
|
|
|
|
id: row.id, name: row.name, beschreibung: row.beschreibung ?? null,
|
|
|
|
|
farbe: row.farbe ?? null, icon: row.icon ?? null, erstellt_von: row.erstellt_von ?? null,
|
|
|
|
|
farbe: row.farbe ?? null, icon: row.icon ?? null, zielgruppen: row.zielgruppen ?? [],
|
|
|
|
|
erstellt_von: row.erstellt_von ?? null,
|
|
|
|
|
erstellt_am: new Date(row.erstellt_am), aktualisiert_am: new Date(row.aktualisiert_am),
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
@@ -419,7 +424,7 @@ class EventsService {
|
|
|
|
|
token = inserted.rows[0].token;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
const baseUrl = (process.env.ICAL_BASE_URL ?? '').replace(/\/$/, '');
|
|
|
|
|
const baseUrl = (process.env.ICAL_BASE_URL || process.env.CORS_ORIGIN || '').replace(/\/$/, '');
|
|
|
|
|
const subscribeUrl = `${baseUrl}/api/events/calendar.ics?token=${token}`;
|
|
|
|
|
|
|
|
|
|
return { token, subscribeUrl };
|
|
|
|
|
|