feat(snowflake-connectors): meetings implementation [CM-1034]#3998
feat(snowflake-connectors): meetings implementation [CM-1034]#3998
Conversation
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
|
|
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
There was a problem hiding this comment.
Pull request overview
Adds “meetings” platform support to the Snowflake connectors pipeline, including new activity types for meeting invitations and attendance, plus the necessary enum/config updates so meetings is recognized across the codebase.
Changes:
- Introduces
MEETINGSas a supported platform/org source and wires it into source priority. - Adds meetings activity types (
invited-meeting,attended-meeting) with scoring grid + DB registration. - Extends the transformer pipeline to allow a single row to produce multiple activities and updates the consumer to emit them all.
Reviewed changes
Copilot reviewed 13 out of 14 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| services/libs/types/src/enums/platforms.ts | Adds MEETINGS to PlatformType. |
| services/libs/types/src/enums/organizations.ts | Adds MEETINGS to organization source enums. |
| services/libs/integrations/src/integrations/meetings/types.ts | Defines meetings activity types + scoring grid. |
| services/libs/integrations/src/integrations/index.ts | Exports meetings integration types. |
| services/libs/data-access-layer/src/organizations/attributesConfig.ts | Adds meetings to org attribute source priority list. |
| services/apps/snowflake_connectors/src/integrations/types.ts | Registers meetings meeting-attendance as a data source name. |
| services/apps/snowflake_connectors/src/integrations/meetings/meeting-attendance/transformer.ts | Implements meetings attendance transformer producing invited/attended activities. |
| services/apps/snowflake_connectors/src/integrations/meetings/meeting-attendance/buildSourceQuery.ts | Adds Snowflake query for exporting meeting attendance rows + incremental logic. |
| services/apps/snowflake_connectors/src/integrations/index.ts | Registers meetings platform and its source in the connectors registry. |
| services/apps/snowflake_connectors/src/core/transformerBase.ts | Updates transformer API to allow multiple activities per row; normalizes safeTransformRow to arrays. |
| services/apps/snowflake_connectors/src/consumer/transformerConsumer.ts | Updates consumer to handle multiple transformed activities per input row. |
| backend/src/database/migrations/V1775219382__addMeetingsActivityTypes.sql | Inserts new meetings activity types into activityTypes. |
| backend/src/database/migrations/U1775219382__addMeetingsActivityTypes.sql | (Present but empty) rollback migration file for the above insert. |
| .claude/skills/scaffold-snowflake-connector/SKILL.md | Updates internal scaffolding guidance related to org mapping discovery. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| for (const result of results) { | ||
| const resolved = await this.integrationResolver.resolve(platform, result.segment) | ||
| if (!resolved) { | ||
| resolveSkippedCount++ | ||
| continue | ||
| } | ||
|
|
||
| await this.emitter.createAndProcessActivityResult( | ||
| resolved.segmentId, | ||
| resolved.integrationId, | ||
| result.activity, | ||
| ) | ||
| transformedCount++ | ||
| } |
There was a problem hiding this comment.
Now that transformers may return multiple activities per row, this loop resolves the same segment repeatedly when multiple activities share it (common when a row yields multiple activity types). Consider de-duplicating integrationResolver.resolve(...) calls per row (e.g., cache by slug+sourceId) to avoid extra Redis/DB lookups and reduce latency.
| platform: PlatformType.MEETINGS, | ||
| timestamp, | ||
| score: MEETINGS_GRID[MeetingsActivityType.INVITED_MEETING].score, | ||
| sourceId: `${primaryKey}_invited`, |
There was a problem hiding this comment.
@joanagmaia, this one is different from specs, as meeting_id isn't unique (similar to committees). Used primaryKey as it seems to be unique
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mbani@contractor.linuxfoundation.org>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
Signed-off-by: Mouad BANI <mouad-mb@outlook.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 2 potential issues.
❌ Bugbot Autofix is OFF. To automatically fix reported issues with cloud agents, have a team admin enable autofix in the Cursor dashboard.
Reviewed by Cursor Bugbot for commit f52614a. Configure here.
| type: OrganizationIdentityType.PRIMARY_DOMAIN, | ||
| verified: true, | ||
| }, | ||
| ], |
There was a problem hiding this comment.
Org identity created with potentially null website value
Low Severity
In the isIndividualNoAccount branch of buildOrganizations, the null guard on website was removed from the committees transformer, and the meetings transformer was written with the same unguarded pattern. If website is null but domainAliases is non-null, an organization identity with value: null is created. The Cvent reference implementation correctly uses website ? [{...}] : [] to guard against this. While current SQL filters (WHERE website IS NOT NULL) make this unlikely, the defensive guard was intentionally present and its removal makes the code fragile.
Additional Locations (1)
Reviewed by Cursor Bugbot for commit f52614a. Configure here.
| platform: PlatformType.MEETINGS, | ||
| timestamp, | ||
| score: MEETINGS_GRID[type].score, | ||
| sourceId: `${meetingId}-${userId}`, |
There was a problem hiding this comment.
Duplicate sourceId for invited and attended activities
Medium Severity
When a row has both WAS_INVITED and INVITEE_ATTENDED as true, buildActivity produces two activities with the same sourceId (${meetingId}-${userId}). The IActivityData interface documents sourceId as a "Unique external identifier of the activity." If downstream upsert logic deduplicates by (sourceId, platform), one activity will overwrite the other, silently discarding meeting data. The activity type could be appended to sourceId to differentiate them.
Reviewed by Cursor Bugbot for commit f52614a. Configure here.


This pull request adds support for processing and tracking meeting attendance activities from the "meetings" platform. It introduces new activity types for meeting invitations and attendance, integrates the meetings data source into the Snowflake connectors pipeline, and updates relevant enums and configurations to recognize meetings as a valid platform and organization source.
Meetings platform support:
MEETINGSas a newPlatformType,OrganizationSource, andOrganizationAttributeSource, and updated the source priority list to include meetings. [1] [2] [3] [4]invited-meeting,attended-meeting) and their scoring grid, and registered them in the database. [1] [2]Snowflake connectors integration:
MeetingAttendanceTransformerand its source query, and registered the source in the Snowflake connectors integration index. [1] [2] [3] [4] [5]Transformer pipeline improvements:
transformRowandsafeTransformRownow handle arrays of activities, and the consumer processes all returned activities. [1] [2] [3] [4]Integrations exports:
Note
Medium Risk
Adds a new Snowflake connector source plus new platform/activity types, and changes the core transformer contract/consumer to support emitting multiple activities per input row, which can affect downstream processing volume and deduping behavior.
Overview
Adds a new
MEETINGSSnowflake connector source (meeting-attendance) with abuildSourceQueryandMeetingAttendanceTransformerthat can emit both invitation and attendance activities from a single row, including optional org enrichment from Salesforce accounts.Updates the snowflake connector pipeline to support multiple activities per row by widening
TransformerBase.transformRow/safeTransformRowto return arrays and iterating over results intransformerConsumer.Registers meetings across the stack: new
MeetingsActivityType+ scoring grid export, Flyway migration inserting the two new activity types, newDataSourceName, platform/source registration, and addsMEETINGStoPlatformType,OrganizationSource/OrganizationAttributeSource, and org attribute source priority. Also tightens the scaffold skill guidance around Parquet type coercion and org-table discovery.Reviewed by Cursor Bugbot for commit f52614a. Bugbot is set up for automated code reviews on this repo. Configure here.