Repository navigation
feat(devtoberfest): iCal + RSS calendar feeds and add-to-calendar links (#1714) - #1721
Merged
Merged
Conversation
…ks (#1714) Add public, anonymous calendar/syndication feeds for the Devtoberfest schedule, plus per-session add-to-calendar affordances. Backend (pure helpers + thin routes, mirroring devtoberfest-feed.js): - srv/lib/parse-session-length.js: free-text SESSIONLENGTH -> minutes (default 60) - srv/lib/devtoberfest-ical.js: RFC 5545 VCALENDAR (buildICS/buildEventICS), UTC Z-form DTSTART/DTEND, CRLF folding, text escaping, addToCalendarLinks - srv/lib/devtoberfest-rss.js: RSS 2.0 (buildRSS) - assembleFeed now carries sessionLength + sessionCode - New anonymous routes reusing assembleFeed (?edition override): GET /api/devtoberfest/feed.ics (text/calendar, public max-age=300) GET /api/devtoberfest/feed.xml (application/rss+xml) GET /api/devtoberfest/session/:id.ics (single-session download; ?to=google|outlook 302-redirects via server-built links) Approuter: feed.ics/feed.xml added to the anonymous alternation; new anonymous session/:id rule (both above the /api catch-all). Frontend: - calendar-links.ts: edition-aware href builders (client stays trivial; all date/URL logic stays server-side) - DetailPanel: Download .ics / Google / Outlook per scheduled session - Calendar App: webcal Subscribe + RSS links in the header Tests: 83 unit tests (pure helpers, routes, client helper, Vue) + smoke tests for the live feeds. Docs: cdn-caching.md updated.
…nels Per-session .ics / add-to-calendar links now carry the active edition in the schedule and sessions-grid views too (previously calendar-only), so a download while browsing a past edition resolves the correct session. Closes the known limitation noted in #1714.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #1714.
Adds public iCal and RSS calendar feeds for the Devtoberfest schedule, plus per-session add-to-calendar links (Google/Outlook) and a page-level Subscribe (webcal) / RSS affordance.
What's included
New public, anonymous endpoints (reuse the existing
assembleFeed;?edition=<id>override, current edition default):GET /api/devtoberfest/feed.ics— whole-schedule VCALENDAR, subscribable viawebcal://(text/calendar,public, max-age=300)GET /api/devtoberfest/feed.xml— RSS 2.0 of sessions (application/rss+xml)GET /api/devtoberfest/session/:id.ics— single-session download;?to=google|outlook302-redirects to the provider's add-event page (targets built server-side → no open-redirect surface)Backend — pure helpers + thin routes, matching the
devtoberfest-feed.jspattern:parse-session-length.js(free-textSESSIONLENGTH→ minutes, default 60 — the facade has no end time)devtoberfest-ical.js(RFC 5545: UTCZ-form DTSTART/DTEND, CRLF line-folding that never splits a multi-byte char, text escaping)devtoberfest-rss.js(RSS 2.0, RFC-822 dates, XML escaping)assembleFeednow carriessessionLength+sessionCodeApprouter: feed routes added to the anonymous
/api/devtoberfest/*alternation; new anonymoussession/:idrule — both above the/apicatch-all.Frontend: edition-aware href builder (
calendar-links.ts) keeps the client trivial (all date/URL logic stays server-side); DetailPanel gains Download .ics / Google / Outlook per scheduled session; the calendar header gains Subscribe + RSS.Design decisions
Z-form DTSTART/DTEND rather than TZID+VTIMEZONE — RFC-valid, unambiguous, clients localize automatically; avoids hand-authoring DST rules.CALENDARINVITEpass-through intentionally not used (parse+default chosen).Testing
vite build(island gate) green.test:smoke, post-deploy).cdn-caching.mdupdated.Deploy notes
srv/lib/*files are only reachable from the main srv routes, not fromcontent-store.js's graph (which is what srv-qa copies).app/island code → full deploy + content publish per the usual rules.