My Meetups - Open Community Groups#942
Conversation
Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
|
Note Reviews pausedIt looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the Use the following commands to manage reviews:
Use the checkboxes below for quick actions:
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configurationConfiguration used: Organization UI Review profile: CHILL Plan: Pro Run ID: 📒 Files selected for processing (7)
✅ Files skipped from review due to trivial changes (1)
🚧 Files skipped from review as they are similar to previous changes (5)
WalkthroughAdds a full-stack "My Meetups" feature enabling users to browse their upcoming and past meetups. Shared domain types and constants are defined, a Snowflake-backed server service builds parameterized SQL queries for upcoming/past meetups with optional search and community/role/status filtering, Express API endpoints validate and serve the data, and an Angular HTTP service, route configuration, and multi-component dashboard UI (with search, filters, tabs, and pagination) complete the feature. ChangesMy Meetups Feature
Sequence Diagram(s)sequenceDiagram
actor User
participant Dashboard as MeetupsDashboardComponent
participant TopBar as MeetupsTopBarComponent
participant List as MeetupsListComponent
participant AngularSvc as MeetupsService (Angular)
participant Server as Express /api/meetups
participant Snowflake as Database
User->>Dashboard: navigate to /meetups
Dashboard->>TopBar: render with filter inputs
TopBar->>AngularSvc: getMeetupFilters()
AngularSvc->>Server: GET /api/meetups/filters
Server->>Snowflake: execute filters SQL
Snowflake-->>Server: MeetupFilterRow[]
Server-->>AngularSvc: MeetupFilterOptionsResponse
AngularSvc-->>TopBar: communityOptions, roleOptions
User->>TopBar: enter search / select filter
TopBar->>Dashboard: searchQueryChange / communityChange / roleChange / statusChange
Dashboard->>List: update filter signals
List->>AngularSvc: getMyMeetups(params)
AngularSvc->>Server: GET /api/meetups?...
Server->>Snowflake: execute upcoming/past SQL
Snowflake-->>Server: MeetupRow[]
Server-->>AngularSvc: MyMeetupsResponse
AngularSvc-->>List: signal updated
List-->>User: render MeetupsTableComponent
Estimated code review effort🎯 4 (Complex) | ⏱️ ~60 minutes Possibly related PRs
Suggested labels
🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✏️ Tip: You can configure your own custom pre-merge checks in the settings. ✨ Finishing Touches🧪 Generate unit tests (beta)
Warning There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure. 🔧 ESLint
ESLint install failed. For unrecoverable errors, disable the tool in CodeRabbit configuration. Comment |
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds “My Meetups” functionality end-to-end (shared types/constants, backend API + Snowflake queries, and Angular UI) to let authenticated users browse/filter upcoming and past meetups.
Changes:
- Introduces shared meetups interfaces and constants (paging, sorting, filter defaults).
- Adds backend
/api/meetups+/api/meetups/filtersendpoints backed by Snowflake queries and row mapping. - Adds Angular meetups module (routes, dashboard, filters/search top bar, list/table rendering with pagination & sorting).
Reviewed changes
Copilot reviewed 20 out of 20 changed files in this pull request and generated 3 comments.
Show a summary per file
| File | Description |
|---|---|
| packages/shared/src/interfaces/meetups.interface.ts | Adds shared meetups data contracts for API/UI. |
| packages/shared/src/interfaces/index.ts | Re-exports meetups interfaces for shared consumption. |
| packages/shared/src/constants/meetups.constants.ts | Centralizes meetups defaults/validation constants and empty responses. |
| packages/shared/src/constants/index.ts | Re-exports meetups constants. |
| apps/lfx-one/src/server/services/meetups.service.ts | Implements Snowflake-backed meetups fetching, filtering, sorting, and mapping. |
| apps/lfx-one/src/server/server.ts | Mounts new /api/meetups router. |
| apps/lfx-one/src/server/routes/meetups.route.ts | Defines meetups API routes. |
| apps/lfx-one/src/server/controllers/meetups.controller.ts | Parses/validates query params and enforces authentication for meetups endpoints. |
| apps/lfx-one/src/app/shared/services/meetups.service.ts | Angular HTTP client wrapper for meetups endpoints. |
| apps/lfx-one/src/app/modules/meetups/meetups.routes.ts | Adds Angular meetups page routing with auth guard. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/meetups-dashboard.component.ts | Dashboard state management for tabs and filters. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/meetups-dashboard.component.html | Dashboard layout: tabs, filters bar, list/table. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-top-bar/meetups-top-bar.component.ts | Search + filter controls and loading filter options from API. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-top-bar/meetups-top-bar.component.html | Renders search and filter dropdowns. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-table/meetups-table.component.ts | Meetups table with sort icons, ARIA sort mapping, and row click navigation. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-table/meetups-table.component.html | Table markup, sortable headers, empty state row. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-list/meetups-list.component.ts | Orchestrates fetching, paging, sorting, and empty-state behavior per tab. |
| apps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-list/meetups-list.component.html | Conditional rendering for upcoming/past tables and empty states. |
| apps/lfx-one/src/app/layouts/main-layout/main-layout.component.ts | Adds “My Meetups” item to main navigation. |
| apps/lfx-one/src/app/app.routes.ts | Adds /meetups route and /me/meetups redirect. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
There was a problem hiding this comment.
Actionable comments posted: 1
🧹 Nitpick comments (1)
apps/lfx-one/src/app/shared/services/meetups.service.ts (1)
24-24: ⚡ Quick winUse
!== undefinedcheck for consistency with other numeric/boolean params.Line 24 uses a truthy check (
if (params.pageSize)), which would skippageSize: 0. While 0 is likely invalid for pagination, this pattern is inconsistent with the checks forisPast(line 18) andoffset(line 25), both of which use!== undefined. For defensive programming and consistency, use the same pattern.♻️ Suggested change for consistency
- if (params.pageSize) httpParams = httpParams.set('pageSize', String(params.pageSize)); + if (params.pageSize !== undefined) httpParams = httpParams.set('pageSize', String(params.pageSize));🤖 Prompt for AI Agents
Verify each finding against current code. Fix only still-valid issues, skip the rest with a brief reason, keep changes minimal, and validate. In `@apps/lfx-one/src/app/shared/services/meetups.service.ts` at line 24, The pageSize parameter check on line 24 uses a truthy check (`if (params.pageSize)`) which is inconsistent with the `!== undefined` checks used for isPast on line 18 and offset on line 25. Replace the truthy check with `if (params.pageSize !== undefined)` to maintain consistency across all parameter validation checks and to properly handle edge cases like pageSize: 0.
🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.
Inline comments:
In `@apps/lfx-one/src/server/controllers/meetups.controller.ts`:
- Around line 80-110: In the parseMeetupsOptions method, apply the .trim()
method to the community and role query parameter assignments (currently on the
lines that return undefined if not present) to match the consistent trimming
behavior already applied to searchQuery. This ensures that leading and trailing
whitespace in these filter values is removed, preventing filter mismatches
caused by user input inconsistencies.
---
Nitpick comments:
In `@apps/lfx-one/src/app/shared/services/meetups.service.ts`:
- Line 24: The pageSize parameter check on line 24 uses a truthy check (`if
(params.pageSize)`) which is inconsistent with the `!== undefined` checks used
for isPast on line 18 and offset on line 25. Replace the truthy check with `if
(params.pageSize !== undefined)` to maintain consistency across all parameter
validation checks and to properly handle edge cases like pageSize: 0.
🪄 Autofix (Beta)
Fix all unresolved CodeRabbit comments on this PR:
- Push a commit to this branch (recommended)
- Create a new PR with the fixes
ℹ️ Review info
⚙️ Run configuration
Configuration used: Organization UI
Review profile: CHILL
Plan: Pro
Run ID: 18a350fc-f81c-403d-adeb-52e137276d50
📒 Files selected for processing (20)
apps/lfx-one/src/app/app.routes.tsapps/lfx-one/src/app/layouts/main-layout/main-layout.component.tsapps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-list/meetups-list.component.htmlapps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-list/meetups-list.component.tsapps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-table/meetups-table.component.htmlapps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-table/meetups-table.component.tsapps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-top-bar/meetups-top-bar.component.htmlapps/lfx-one/src/app/modules/meetups/meetups-dashboard/components/meetups-top-bar/meetups-top-bar.component.tsapps/lfx-one/src/app/modules/meetups/meetups-dashboard/meetups-dashboard.component.htmlapps/lfx-one/src/app/modules/meetups/meetups-dashboard/meetups-dashboard.component.tsapps/lfx-one/src/app/modules/meetups/meetups.routes.tsapps/lfx-one/src/app/shared/services/meetups.service.tsapps/lfx-one/src/server/controllers/meetups.controller.tsapps/lfx-one/src/server/routes/meetups.route.tsapps/lfx-one/src/server/server.tsapps/lfx-one/src/server/services/meetups.service.tspackages/shared/src/constants/index.tspackages/shared/src/constants/meetups.constants.tspackages/shared/src/interfaces/index.tspackages/shared/src/interfaces/meetups.interface.ts
Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
|
@tegioz thanks, if there was another system that wanted to populate meetups say from another source like meetup.com or luma, how would they go about doing that? just make sure the data is structured properly and fetched via meetups.service.ts? |
|
No worries @caniszczyk 🙂 If the data from those sources was also stored in Snowflake, we could update the meetups dynamic tables to include data from the other providers as well, in addition to the OCG raw data tables, to present a common facade/view for meetups. This new feature is based on that data abstraction already, to hide the particularities of the OCG raw data, and speed the queries up. It'd be interesting to include a That'd be on the data side. On the LFX Self Serve app side, we may need to extend some types for additional participation roles supported by the other providers, or adjust some filters (i.e. some concepts like the |
Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
Signed-off-by: Sergio Castaño Arteaga <tegioz@icloud.com>
Hi!
I'm one of the maintainers of Open Community Groups 👋
This PR introduces a new
My Meetupssection, as requested by @caniszczyk. It works pretty similar to theMy Eventssection, but it lists meetups from Open Community Groups. You can see it in action in the video below.My Meetupsfeeds from Snowflake, querying some dynamic tables we've prepared. @skalepp has helped us by creating them in the LF Snowflake instance. So far we've only been able to test it locally, using our own Auth0/Snowflake accounts, but it seems like it's working fine 🙂/cc @jeefy @cynthia-sg
lfx-ss-meetups.mov