feat: Add dynamic web portal for workshop module selection#5
Draft
feat: Add dynamic web portal for workshop module selection#5
Conversation
- Express + EJS portal with GitHub-inspired dark theme - Routes: home (/), modules (/modules, /modules/:id), agenda (/agenda) - 7 workshop modules (module-00 through module-06) via moduleService - Custom NotFoundError / ValidationError classes with HTTP status codes - Helmet security headers, morgan logging, express-session for preferences - CSRF protection via csrf-csrf double-submit cookie pattern - Session cookie with sameSite:strict, secure flag tied to NODE_ENV - 9 passing Jest/Supertest tests across routes and service layers Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
…ced error handling Co-authored-by: raykao <860691+raykao@users.noreply.github.com>
… first Co-authored-by: raykao <860691+raykao@users.noreply.github.com>
Copilot
AI
changed the title
[WIP] Build a new UI for workshop web app
feat: Add dynamic web portal for workshop module selection
Mar 6, 2026
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.
Workshop content was only accessible as static markdown files with no way for attendees to build a personalized agenda or filter exercises by language preference. This adds a Node.js/Express portal that serves the workshop dynamically.
Portal structure (
portal/)csrf-csrf), EJS templatinggetAllModules(),getModuleById(),filterByLanguage()over 7 hardcoded module definitions (module-00 → module-06) with duration, format, objectives, and language support metadataGET /— Home page with language toggle (Java / JavaScript) and per-module checkboxesGET /modules,GET /modules/:id— Module listing and detail (throwsNotFoundErroron unknown id)GET /agenda,POST /agenda— Personalized agenda built from selected modules + language; POST validates language against allowlist and redirects to GET with query paramsNotFoundError(404) andValidationError(400) each carry a numericstatusCode; error handler mapserr.statusCodeto response status and hides internals for untrusted errors#0d1117/#161b22), module cards with duration/format badges, "Always Included" indicator for required modules (welcome, wrap-up), language tag chipsrequest.agentSecurity notes
request.agentbefore submittingsecure+sameSite: strictin production;SESSION_SECRETread from env['javascript', 'java']allowlist before being reflected into the redirect URL💬 We'd love your input! Share your thoughts on Copilot coding agent in our 2 minute survey.