-
Notifications
You must be signed in to change notification settings - Fork 12
feat: add calendar cache status and actions (#22532) #11
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
base: calendar-cache-foundation
Are you sure you want to change the base?
Conversation
* feat: add calendar cache status dropdown - Add updatedAt field to CalendarCache schema with migration - Create tRPC cacheStatus endpoint for fetching cache timestamps - Add action dropdown to CalendarSwitch for Google Calendar entries - Display formatted last updated timestamp in dropdown - Add placeholder for cache deletion functionality - Include translation strings for dropdown content The dropdown only appears for Google Calendar integrations that have active cache entries and provides cache management options for future extensibility. Co-Authored-By: [email protected] <[email protected]> * fix: resolve Prisma type incompatibilities in repository files - Remove problematic satisfies clause in selectedCalendar.ts - Add missing cacheStatus parameter to ConnectedCalendarList component - Fixes type errors that were preventing CI from passing Co-Authored-By: [email protected] <[email protected]> * refactor: integrate cache status into connectedCalendars handler - Remove separate cacheStatus tRPC endpoint as requested - Return cache status as separate field in connectedCalendars response - Update UI components to use cache data from connectedCalendars - Fix Prisma type incompatibilities in repository files Co-Authored-By: [email protected] <[email protected]> * fix: resolve Prisma type incompatibilities and fix data flow for cache status - Fix Prisma.SortOrder usage in membership.ts orderBy clauses - Remove problematic satisfies clause in selectedCalendar.ts - Fix TeamSelect type reference in team.ts - Update SelectedCalendarsSettingsWebWrapper to properly pass cacheStatus data flow Co-Authored-By: [email protected] <[email protected]> * Discard changes to packages/lib/server/repository/membership.ts * Discard changes to packages/lib/server/repository/team.ts * fix: improve calendar cache dropdown with proper formatting and subscription logic - Fix timestamp HTML entity encoding with interpolation escapeValue: false - Only show dropdown for subscribed Google calendars (googleChannelId exists) - Hide delete option when no cache data exists - Include updatedAt and googleChannelId fields upstream in user repository - Update data flow to pass subscription status through components Co-Authored-By: [email protected] <[email protected]> * feat: update SelectedCalendar.updatedAt when Google webhooks trigger cache refresh - Add updateManyByCredentialId method to SelectedCalendarRepository - Update fetchAvailabilityAndSetCache to refresh SelectedCalendar timestamps - Ensure webhook flow updates both CalendarCache and SelectedCalendar records - Maintain proper timestamp tracking for calendar cache operations Co-Authored-By: [email protected] <[email protected]> * Add script to automate Tunnelmole webhook setup Introduces test-gcal-webhooks.sh to start Tunnelmole, extract the public URL, and update GOOGLE_WEBHOOK_URL in the .env file. Handles process management, rate limits, and ensures environment configuration for Google Calendar webhooks. * Update dev:cron script to use npx tsx Replaces 'ts-node' with 'npx tsx' in the dev:cron script for running cron-tester.ts, likely to improve compatibility or leverage tsx features. * Update cache status string and improve CalendarSwitch UI Renamed 'last_updated' to 'cache_last_updated' in locale file for clarity and updated CalendarSwitch to use the new string. Also added dark mode text color support for cache status display. * refactor: move cache management to credential-level dropdown with Remove App - Create CredentialActionsDropdown component consolidating cache and app removal actions - Add deleteCache tRPC mutation for credential-level cache deletion - Update connectedCalendars handler to include cacheUpdatedAt at credential level - Move dropdown from individual CalendarSwitch to credential level in SelectedCalendarsSettingsWebWrapper - Remove cache-related props from CalendarSwitch component - Add translation strings for cache management actions - Consolidate all credential-level actions (cache management + Remove App) in one dropdown Co-Authored-By: [email protected] <[email protected]> * fix: remove duplicate translation keys in common.json - Remove duplicate cache-related keys at lines 51-56 - Keep properly positioned keys later in file - Addresses GitHub comment from zomars about duplicate keys Co-Authored-By: [email protected] <[email protected]> * fix: rename translation key to cache_last_updated - Address GitHub comment from zomars - Rename 'last_updated' to 'cache_last_updated' for specificity - Update usage in CredentialActionsDropdown component Co-Authored-By: [email protected] <[email protected]> * fix: remove duplicate last_updated translation key Co-Authored-By: [email protected] <[email protected]> * fix: add confirmation dialog for cache deletion and use repository pattern - Add confirmation dialog for destructive cache deletion action - Replace direct Prisma calls with CalendarCacheRepository pattern - Add getCacheStatusByCredentialIds method to repository interface - Fix import paths for UI components - Address GitHub review comments from zomars Co-Authored-By: [email protected] <[email protected]> * Update CredentialActionsDropdown.tsx * Update common.json * Update common.json * fix: remove nested div wrapper to resolve HTML structure error - Remove wrapping div around DisconnectIntegration component - Fixes nested <p> tag validation error preventing Remove App functionality - Maintains existing confirmation dialog patterns Co-Authored-By: [email protected] <[email protected]> * Fix API handler response termination logic Removed unnecessary return values after setting status in the integrations API handler. This clarifies response handling and prevents returning the response object when not needed. Resolves "API handler should not return a value, received object". * fix: 400 is correct error code for computing slot for past booking (#22574) * fix * add test * chore: release v5.5.1 * Refactor credential disconnect to use confirmation dialog Replaces the DisconnectIntegration component with an inline confirmation dialog for removing app credentials. Adds disconnect mutation logic and updates UI to improve user experience and consistency. * Set default value for CalendarCache.updatedAt Added a default value of NOW() for the updatedAt column in the CalendarCache table to ensure existing and future rows have a valid timestamp. Updated the Prisma schema to reflect this change and provide compatibility for legacy data and raw inserts. --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Benny Joo <[email protected]> Co-authored-by: emrysal <[email protected]>
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.
Greptile Summary
This PR introduces comprehensive calendar cache status visibility and management functionality to the Cal.com application. The changes implement a system that tracks when calendar cache data was last updated and provides users with UI controls to view cache status and delete cached data.
The core implementation centers around adding an updatedAt timestamp field to the CalendarCache model through a database migration, along with corresponding repository methods to query cache status by credential ID. The calendar cache repository gains a new getCacheStatusByCredentialIds method that uses Prisma's groupBy to efficiently retrieve the latest update timestamps for multiple credentials in a single query.
On the frontend, the existing DisconnectIntegration component is replaced with a more comprehensive CredentialActionsDropdown that provides a unified interface for managing calendar integrations. This new component displays cache status timestamps and offers actions to delete cached data, specifically targeting Google Calendar integrations initially.
The connectedCalendars tRPC handler is enhanced to enrich response data with cache status information by fetching timestamps from the repository and mapping them to each connected calendar. A new deleteCache tRPC handler provides the backend functionality for users to manually clear cached calendar data with proper authorization checks.
Additional changes include extending type definitions to expose updatedAt and googleChannelId fields needed for cache status display and webhook management, updating the user repository to select these fields during session retrieval, and adding development tooling like a Google Calendar webhook testing script.
The implementation follows a pattern where cache status is tied to credentials rather than individual calendars, allowing efficient bulk operations and consistent user experience across multiple calendars from the same integration.
Confidence score: 1/5
- This PR contains critical issues including broken method calls and potential database field references that will cause runtime errors.
- The score is low due to a non-existent method call (
updateManyByCredentialIdin CalendarService.ts) and a likely incorrect database field reference (updatedAtvsupdateAtin calendar-cache.repository.ts). - Files needing immediate attention:
packages/app-store/googlecalendar/lib/CalendarService.ts,packages/features/calendar-cache/calendar-cache.repository.ts, andscripts/test-gcal-webhooks.sh
15 files reviewed, 4 comments
| if (!credential) { | ||
| throw new Error("Credential not found or access denied"); | ||
| } |
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.
style: Consider using a more specific error type or TRPC error with proper error codes for better client-side error handling
| credentialId: { in: credentialIds }, | ||
| }, | ||
| _max: { | ||
| updatedAt: true, |
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.
logic: The updatedAt field is referenced but may not exist in the CalendarCache table. The Prisma schema shows the table has createdAt but no updatedAt field. This will cause a runtime error.
| } | ||
|
|
||
| // Update SelectedCalendar.updatedAt for all calendars under this credential | ||
| await SelectedCalendarRepository.updateManyByCredentialId(this.credential.id, {}); |
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.
logic: Method updateManyByCredentialId does not exist in SelectedCalendarRepository. This will throw a runtime error.
| fi | ||
|
|
||
| if grep -q '^GOOGLE_WEBHOOK_URL=' "$ENV_FILE"; then | ||
| sed -i '' -E "s|^GOOGLE_WEBHOOK_URL=.*|GOOGLE_WEBHOOK_URL=$TUNNEL_URL|" "$ENV_FILE" |
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.
logic: macOS-specific sed syntax with empty string after -i flag will fail on Linux systems
| sed -i '' -E "s|^GOOGLE_WEBHOOK_URL=.*|GOOGLE_WEBHOOK_URL=$TUNNEL_URL|" "$ENV_FILE" | |
| sed -i -E "s|^GOOGLE_WEBHOOK_URL=.*|GOOGLE_WEBHOOK_URL=$TUNNEL_URL|" "$ENV_FILE" |
|
This PR is being marked as stale due to inactivity. |
Test 1