Sprint 8: Events + Hundesitting

Events:
- Backend events.py: CRUD, Typen (ausstellung/training/treffen/markt/wettkampf/sonstiges)
  Haversine-Filter, Monats-Gruppierung in der Liste
- Frontend events.js: Liste/Karte-Toggle, Typ-Filter-Chips, farbige Marker,
  Detail-Modal, Erstellen/Bearbeiten-Formular mit GPS-Button

Hundesitting:
- Backend sitting.py: Sitter-Profile (create/update/me), Anfragen (send/accept/decline/cancel),
  Inbox für Sitter, Haversine-Sortierung, Service-Filter
- Frontend sitting.js: 3 Tabs (Suchen/Profil/Anfragen), Sitter-Karten mit Distanz,
  Detail-Modal + Anfrage-Formular, Profil-Verwaltung

DB: events, sitters, sitting_requests Tabellen hinzugefügt
SW-Cache: by-v21 → by-v22
This commit is contained in:
rene 2026-04-14 06:19:15 +02:00
parent ec17dfb029
commit 5f8fd3bd51
9 changed files with 1680 additions and 2 deletions

View file

@ -207,6 +207,39 @@ const API = (() => {
leave(id) { return del(`/walks/${id}/join`); },
};
// ----------------------------------------------------------
// EVENTS
// ----------------------------------------------------------
const events = {
list(params = {}) {
const q = new URLSearchParams(params).toString();
return get(`/events${q ? '?' + q : ''}`);
},
get(id) { return get(`/events/${id}`); },
create(data) { return post('/events', data); },
update(id, data) { return patch(`/events/${id}`, data); },
delete(id) { return del(`/events/${id}`); },
};
// ----------------------------------------------------------
// SITTING
// ----------------------------------------------------------
const sitting = {
list(lat = null, lon = null, radius = 30000, service = null) {
const p = new URLSearchParams({ radius });
if (lat !== null) { p.set('lat', lat); p.set('lon', lon); }
if (service) { p.set('service', service); }
return get(`/sitting?${p}`);
},
me() { return get('/sitting/me'); },
create(data) { return post('/sitting', data); },
updateMe(data) { return patch('/sitting/me', data); },
requests() { return get('/sitting/requests'); },
inbox() { return get('/sitting/inbox'); },
sendRequest(data){ return post('/sitting/requests', data); },
updateRequest(id, status) { return patch(`/sitting/requests/${id}`, { status }); },
};
// ----------------------------------------------------------
// WETTER
// ----------------------------------------------------------
@ -284,7 +317,7 @@ const API = (() => {
return {
get, post, put, patch, del, upload,
auth, dogs, diary, health, tieraerzte, poison,
places, routes, walks, weather, push,
places, routes, walks, events, sitting, weather, push,
subscribeToPush, getLocation,
APIError,
};