Skip to content

feat: implement automatic event type reassignment when user attributes change #22706

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Draft
wants to merge 2 commits into
base: main
Choose a base branch
from

Conversation

joeauyeung
Copy link
Contributor

feat: implement automatic event type reassignment when user attributes change

Summary

This PR implements automatic event type host reassignment when user attributes are updated. Previously, when attributes were assigned to users, event types using attribute-based filtering (assignRRMembersUsingSegment) would not automatically update their host assignments to reflect the new attribute values.

Key Changes:

  • Core Logic: Created eventTypeAttributeReassignment.ts with centralized logic for finding and updating event types based on attribute changes
  • Automatic Triggers: Added hooks to both individual (assignUserToAttribute.handler.ts) and bulk (assignValueToUser.ts) attribute assignment flows
  • Manual Control: Added new tRPC endpoint reassignEventTypes for manual bulk reassignment
  • Type Safety: Used zod validation for safe JsonValue to AttributesQueryValue conversion
  • Preservation: Maintains existing host settings (priority, weight, scheduleId) when reassigning

Review & Testing Checklist for Human

  • End-to-end functionality testing: Create event types with attribute-based assignment, update user attributes, and verify hosts are automatically reassigned
  • Edge case validation: Test with invalid attribute queries, missing team members, and users with no matching attributes
  • Performance impact assessment: Test with multiple event types and frequent attribute updates to ensure acceptable performance
  • Database safety verification: Verify that the host deletion/recreation transaction is safe under concurrent access
  • Existing functionality preservation: Ensure attribute assignment still works correctly when event type reassignment fails

Recommended Test Plan:

  1. Set up an organization with teams and users
  2. Create event types with assignRRMembersUsingSegment: true and attribute filter queries
  3. Assign/modify user attributes and verify event type hosts update automatically
  4. Test both individual attribute updates and bulk operations
  5. Verify manual reassignment via the new tRPC endpoint works correctly

Diagram

%%{ init : { "theme" : "default" }}%%
graph TD
    AssignUser["assignUserToAttribute.handler.ts<br/>(Individual Updates)"]:::minor-edit
    AssignBulk["assignValueToUser.ts<br/>(Bulk Updates)"]:::minor-edit
    Core["eventTypeAttributeReassignment.ts<br/>(Core Logic)"]:::major-edit
    Manual["reassignEventTypes.handler.ts<br/>(Manual Trigger)"]:::major-edit
    Router["_router.ts<br/>(tRPC Endpoint)"]:::minor-edit
    
    FindLogic["findTeamMembersMatchingAttributeLogic<br/>(Existing Logic)"]:::context
    EventTypes["EventType Database<br/>(Host Assignments)"]:::context
    
    AssignUser -->|"calls reassignEventTypesBasedOnAttributes"| Core
    AssignBulk -->|"calls reassignEventTypesBasedOnAttributes"| Core
    Manual -->|"calls reassignEventTypesBasedOnAttributes"| Core
    Router -->|"exposes endpoint"| Manual
    
    Core -->|"uses for matching logic"| FindLogic
    Core -->|"updates host assignments"| EventTypes
    
    subgraph Legend
        L1[Major Edit]:::major-edit
        L2[Minor Edit]:::minor-edit  
        L3[Context/No Edit]:::context
    end
    
    classDef major-edit fill:#90EE90
    classDef minor-edit fill:#87CEEB
    classDef context fill:#FFFFFF
Loading

Notes

  • Error Handling: Reassignment failures are logged but don't block attribute assignment operations
  • Type Safety: Uses zod validation to safely convert Prisma JsonValue to AttributesQueryValue without forbidden type casting
  • Database Operations: Uses transactions to ensure atomicity when updating host assignments
  • Performance Consideration: Reassignment runs after every attribute change - monitor for performance impact in production

Link to Devin run: https://app.devin.ai/sessions/48b698274b8b4407baf83267091974d3
Requested by: @joeauyeung

devin-ai-integration bot and others added 2 commits July 23, 2025 19:00
…s change

- Add eventTypeAttributeReassignment.ts with centralized logic for updating event type hosts based on attribute changes
- Hook into assignUserToAttribute.handler.ts to trigger reassignment after individual attribute updates
- Hook into assignValueToUser.ts to trigger reassignment after bulk attribute updates
- Add reassignEventTypes.handler.ts for manual bulk reassignment via tRPC
- Use zod validation for type-safe JsonValue to AttributesQueryValue conversion
- Preserve existing host settings (priority, weight, scheduleId) when reassigning
- Add comprehensive error handling and logging

Co-Authored-By: joe@cal.com <j.auyeung419@gmail.com>
Co-Authored-By: joe@cal.com <j.auyeung419@gmail.com>
Copy link
Contributor

🤖 Devin AI Engineer

I'll be helping with this pull request! Here's what you should know:

✅ I will automatically:

  • Address comments on this PR that start with 'DevinAI'.
  • Look at CI failures and help fix them

Note: I can only respond to comments from users who have write access to this repository.

⚙️ Control Options:

  • Disable automatic comment and CI monitoring

Copy link
Contributor

coderabbitai bot commented Jul 23, 2025

Important

Review skipped

Draft detected.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

✨ Finishing Touches
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch devin/fix-attribute-event-type-sync-1753295334

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Explain this complex logic.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai explain this code block.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and explain its main purpose.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.

Support

Need help? Create a ticket on our support page for assistance with any issues or questions.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai generate sequence diagram to generate a sequence diagram of the changes in this PR.
  • @coderabbitai generate unit tests to generate unit tests for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@keithwillcode keithwillcode added core area: core, team members only enterprise area: enterprise, audit log, organisation, SAML, SSO labels Jul 23, 2025
Copy link
Contributor

github-actions bot commented Aug 7, 2025

This PR is being marked as stale due to inactivity.

@github-actions github-actions bot added the Stale label Aug 7, 2025
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
core area: core, team members only enterprise area: enterprise, audit log, organisation, SAML, SSO Stale
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants