You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
| ICS time fix | 0.19.0 | Correct UTC times in ICS when confirming/cancelling bookings from the database |
82
85
83
86
## [Unreleased]
84
87
88
+
## [0.19.0] - 2026-03-13
89
+
90
+
### Added
91
+
92
+
-**CSRF protection** — double-submit cookie pattern on all 31 POST handlers via middleware
93
+
-**Booking rate limiting** — per-IP rate limiting (10 req / 5 min) on all booking endpoints using `X-Forwarded-For`
94
+
-**Input validation** — server-side validation on all booking forms (name 1–255, email format, notes max 5000, date max 365 days)
95
+
-**Double-booking prevention** — partial unique index on `(event_type_id, start_at)` + `BEGIN IMMEDIATE` transactions
96
+
-**Crash-proof handlers** — all `.unwrap()` in web handlers replaced with proper error responses
97
+
-**Graceful shutdown** — SIGINT/SIGTERM handling with `with_graceful_shutdown()` to drain in-flight requests
98
+
-**Structured logging** — 50 `tracing` log points across auth, bookings, CalDAV, admin, email, DB migrations. Configurable via `RUST_LOG` (default: `calrs=info,tower_http=info`)
99
+
-**HTTP request tracing** — `tower-http` TraceLayer logs every request with method, path, status, and latency
100
+
-**ICS attendee names** — calendar event SUMMARY now shows "{title} — {guest_first} & {host_first}" (e.g. "30min call — John & Olivier") instead of just the event type title
101
+
-**ICS guest notes** — guest notes included as DESCRIPTION field in ICS calendar events
102
+
-**Host confirmation email** — host receives a "Booking confirmed" email (without ICS attachment) after approving a pending booking. Previously only the guest was notified.
103
+
-**32 new tests** (191 → 223) covering ICS generation, input validation, CSRF functions, time extraction
104
+
105
+
### Fixed
106
+
107
+
-**ICS times at midnight on confirm/cancel** — `format_time_from_dt()` returned 12-hour display format ("2:00 PM") but `convert_to_utc()` expected 24-hour "HH:MM", causing all ICS events generated from database bookings (confirm, approve, cancel, decline, reminders) to have midnight times with zero duration. Added `extract_time_24h()` helper.
108
+
-**Missing host email on booking approval** — both `confirm_booking` (dashboard) and `approve_booking_by_token` (email link) only sent the guest a confirmation email, never notifying the host.
109
+
-**Silent email failures** — `send_host_notification` errors were discarded via `let _ =`. Now logged at error level with the target email address.
0 commit comments