-
-
Notifications
You must be signed in to change notification settings - Fork 19
Add Delete functions for Background Sync #3132
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
Conversation
WalkthroughThe code for Google Calendar event synchronization now includes logic to remove obsolete events from the database. After upserting events, the code fetches all existing events, identifies and deletes those no longer present in Google Calendar, logs relevant actions, and updates the last upsert timestamp only after all steps succeed. Changes
Sequence Diagram(s)sequenceDiagram
participant GoogleCalendar
participant SyncScript
participant Database
SyncScript->>GoogleCalendar: Fetch events for ws_id
GoogleCalendar-->>SyncScript: Return events
SyncScript->>Database: Upsert events
Database-->>SyncScript: Upsert result
SyncScript->>Database: Fetch all events for ws_id (google_event_id not null)
Database-->>SyncScript: Return existing events
SyncScript->>SyncScript: Identify obsolete events
SyncScript->>Database: Delete obsolete events
Database-->>SyncScript: Deletion result
SyncScript->>Database: Update last upsert timestamp
Database-->>SyncScript: Timestamp updated
Possibly related PRs
Suggested reviewers
Poem
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
packages/trigger/google-calendar-sync.tsOops! Something went wrong! :( ESLint: 9.29.0 Error [ERR_MODULE_NOT_FOUND]: Cannot find package '@typescript-eslint/parser' imported from /eslint.config.mjs ✨ Finishing Touches
🧪 Generate Unit Tests
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. 🪧 TipsChatThere are 3 ways to chat with CodeRabbit:
SupportNeed help? Create a ticket on our support page for assistance with any issues or questions. Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments. CodeRabbit Commands (Invoked using PR comments)
Other keywords and placeholders
CodeRabbit Configuration File (
|
How to use the Graphite Merge QueueAdd either label to this PR to merge it via the merge queue:
You must have a Graphite account in order to use the merge queue. Sign up using this link. An organization admin has enabled the Graphite Merge Queue in this repository. Please do not merge from GitHub as this will restart CI on PRs being processed by the merge queue. |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Summary of Changes
Hello @DennieDan, I'm Gemini Code Assist1! I'm currently reviewing this pull request and will post my feedback shortly. In the meantime, here's a summary to help you and other reviewers quickly get up to speed!
This pull request introduces a critical data synchronization feature: the ability to automatically delete calendar events from our workspace_calendar_events
table when they are removed from the linked Google Calendar. This ensures data consistency and accuracy between the two systems, preventing stale or phantom events from persisting in Tuturuuu.
Highlights
- Google Calendar Sync Deletion: I've implemented new logic within the
syncGoogleCalendarEvents
function to identify and deleteworkspace_calendar_events
in our database that no longer exist in the corresponding Google Calendar. This ensures that events removed from Google Calendar are automatically reflected in Tuturuuu. - Type Import: I've added an import for
WorkspaceCalendarEvent
from@tuturuuu/types/db
to provide type safety for the newly introduced deletion logic. - Error Handling Improvement: I've refined the error handling in the sync process by adding
return;
statements after logging errors for both upsert and delete operations, preventing further execution in case of critical failures.
Using Gemini Code Assist
The full guide for Gemini Code Assist can be found on our documentation page, here are some quick tips.
Invoking Gemini
You can request assistance from Gemini at any point in your pull request via creating an issue comment (i.e. comment on the pull request page) using either /gemini <command>
or @gemini-code-assist <command>
. Below is a summary of the supported commands.
Feature | Command | Description |
---|---|---|
Code Review | /gemini review |
Performs a code review for the current pull request in its current state. |
Pull Request Summary | /gemini summary |
Provides a summary of the current pull request in its current state. |
Comment | @gemini-code-assist | Responds in comments when explicitly tagged, both in issue comments and review comments. |
Help | /gemini help |
Displays a list of available commands. |
Customization
To customize Gemini Code Assist for GitHub experience, repository maintainers can create a configuration file and/or provide a custom code review style guide (such as PEP-8 for Python) by creating and adding files to a .gemini/
folder in the base of the repository. Detailed instructions can be found here.
Limitations & Feedback
Gemini Code Assist is currently in preview and may make mistakes. Please leave feedback on any instances where its feedback is incorrect or counter productive. You can react with 👍 and 👎 on @gemini-code-assist comments to provide feedback.
You can also get AI-powered code generation, chat, as well as code reviews directly in the IDE at no cost with the Gemini Code Assist IDE Extension.
Footnotes
-
Review the Privacy Notices, Generative AI Prohibited Use Policy, Terms of Service, and learn how to configure Gemini Code Assist in GitHub here. Gemini can make mistakes, so double check it and use code with caution. ↩
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Code Review
This pull request successfully adds the functionality to delete calendar events in the application when they are deleted in Google Calendar during the background sync process. The logic for identifying events to delete appears correct. Review comments have been provided regarding potential efficiency improvements in the deletion logic and considerations for error handling around updating the sync timestamp.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 3
🔭 Outside diff range comments (1)
packages/trigger/google-calendar-sync.ts (1)
105-108
: Security risk: Remove logging of sensitive authentication tokens.Logging access tokens and refresh tokens poses a security risk as these credentials could be exposed in logs.
Remove the sensitive token logging:
- console.log('ws_id', ws_id); - console.log('access_token', access_token); - console.log('refresh_token', refresh_token); - console.log('formattedEvents', formattedEvents); + console.log('ws_id', ws_id); + console.log('formattedEvents', formattedEvents);
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
packages/trigger/google-calendar-sync.ts
(2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms (2)
- GitHub Check: Analyze (javascript-typescript)
- GitHub Check: Deploy-Preview
🔇 Additional comments (2)
packages/trigger/google-calendar-sync.ts (2)
2-2
: LGTM: Required import for deletion logic.The import of
WorkspaceCalendarEvent
type is necessary for the new deletion functionality.
168-169
: Good improvement: Timestamp update moved to end of sync process.Moving the timestamp update to after both upsert and deletion operations ensures the sync state is only updated when the entire process succeeds.
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #3132 +/- ##
==========================================
- Coverage 0.80% 0.80% -0.01%
==========================================
Files 2544 2544
Lines 325374 325416 +42
Branches 3046 3046
==========================================
Hits 2623 2623
- Misses 320580 320622 +42
Partials 2171 2171 ☔ View full report in Codecov by Sentry. 🚀 New features to boost your workflow:
|
Wait, I will review the suggestion from the bot |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Actionable comments posted: 1
♻️ Duplicate comments (1)
packages/trigger/google-calendar-sync.ts (1)
140-149
: Performance optimization still needed for event deletion logic.The current O(M*N) approach hasn't been optimized as suggested in previous reviews. This could impact performance with larger numbers of events.
Consider implementing the suggested optimization using a Set for efficient lookups:
- const eventsToDelete: WorkspaceCalendarEvent[] = []; - for (const event of dbEventsAfterUpsert) { - if ( - !formattedEvents.some( - (e) => e.google_event_id === event.google_event_id - ) - ) { - eventsToDelete.push(event); - } - } + const eventsToDelete: WorkspaceCalendarEvent[] = []; + // Create a Set of Google event IDs for efficient lookup + const formattedEventIds = new Set(formattedEvents.map(e => e.google_event_id)); + + for (const event of dbEventsAfterUpsert) { + // Check if the database event's google_event_id is NOT in the set of fetched Google event IDs + if (event.google_event_id && !formattedEventIds.has(event.google_event_id)) { + eventsToDelete.push(event); + } + }
📜 Review details
Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro
📒 Files selected for processing (1)
packages/trigger/google-calendar-sync.ts
(2 hunks)
🧰 Additional context used
🧬 Code Graph Analysis (1)
packages/trigger/google-calendar-sync.ts (2)
packages/types/src/db.ts (1)
WorkspaceCalendarEvent
(24-24)packages/utils/src/calendar-sync-coordination.ts (1)
updateLastUpsert
(117-142)
🪛 GitHub Check: codecov/patch
packages/trigger/google-calendar-sync.ts
[warning] 118-118: packages/trigger/google-calendar-sync.ts#L118
Added line #L118 was not covered by tests
[warning] 120-124: packages/trigger/google-calendar-sync.ts#L120-L124
Added lines #L120 - L124 were not covered by tests
[warning] 127-133: packages/trigger/google-calendar-sync.ts#L127-L133
Added lines #L127 - L133 were not covered by tests
[warning] 135-138: packages/trigger/google-calendar-sync.ts#L135-L138
Added lines #L135 - L138 were not covered by tests
[warning] 140-149: packages/trigger/google-calendar-sync.ts#L140-L149
Added lines #L140 - L149 were not covered by tests
[warning] 151-157: packages/trigger/google-calendar-sync.ts#L151-L157
Added lines #L151 - L157 were not covered by tests
[warning] 159-162: packages/trigger/google-calendar-sync.ts#L159-L162
Added lines #L159 - L162 were not covered by tests
[warning] 164-168: packages/trigger/google-calendar-sync.ts#L164-L168
Added lines #L164 - L168 were not covered by tests
[warning] 171-171: packages/trigger/google-calendar-sync.ts#L171
Added line #L171 was not covered by tests
⏰ Context from checks skipped due to timeout of 90000ms (8)
- GitHub Check: Analyze (javascript-typescript)
- GitHub Check: Deploy-Preview
- GitHub Check: Deploy-Preview
- GitHub Check: Deploy-Preview
- GitHub Check: Deploy-Preview
- GitHub Check: Deploy-Preview
- GitHub Check: Deploy-Preview
- GitHub Check: Verify generated types
🔇 Additional comments (9)
packages/trigger/google-calendar-sync.ts (9)
2-2
: LGTM: Proper type import for deletion functionality.The import is correctly added and necessary for the
WorkspaceCalendarEvent
type used in the deletion logic.
118-118
: LGTM: Proper error handling with continue.This correctly addresses the past review feedback to continue processing other workspaces when one encounters an upsert error.
120-124
: LGTM: Good logging for monitoring upserted events.The logging provides valuable visibility into the sync process by showing which events are being upserted for each workspace.
126-133
: LGTM: Proper time range filtering addresses critical bug.This correctly addresses the critical issue from past reviews by filtering database events to the same time range as the Google Calendar fetch, preventing unintended deletions of events outside the sync range.
135-138
: LGTM: Consistent error handling pattern.This follows the established pattern of using
continue
to allow processing of other workspaces when database errors occur.
151-157
: LGTM: Proper batch delete operation.The delete operation correctly uses the
in
clause for efficient batch deletion of multiple events.
159-162
: LGTM: Consistent error handling for delete operations.This maintains the established pattern of continuing to process other workspaces when delete errors occur.
164-168
: LGTM: Comprehensive logging for deleted events.This logging provides valuable visibility into the deletion process, complementing the upsert logging for complete sync monitoring.
171-171
: LGTM: Proper timing for last upsert timestamp update.This correctly addresses the past review concern by updating the timestamp only after both upsert and delete operations complete successfully, ensuring proper sync coordination.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
LGTM! Thanks @DennieDan.
Delete in Tuturuuu if in Google Calendar is deleted
Summary by CodeRabbit