Skip to content

Comments

feat: add dry run events for SDK (dryRunBookingSuccessfulV2 and dryRunRescheduleBookingSuccessfulV2)#23072

Merged
hariombalhara merged 6 commits intomainfrom
devin/1755147156-dry-run-events
Aug 15, 2025
Merged

feat: add dry run events for SDK (dryRunBookingSuccessfulV2 and dryRunRescheduleBookingSuccessfulV2)#23072
hariombalhara merged 6 commits intomainfrom
devin/1755147156-dry-run-events

Conversation

@hariombalhara
Copy link
Member

@hariombalhara hariombalhara commented Aug 14, 2025

refactor: make dry run events more DRY by reusing types and payload logic

Summary

This refactoring eliminates code duplication between regular and dry run SDK events by introducing shared base types and payload generation functions. The changes affect the SDK event system that fires when bookings are created or rescheduled.

Key changes:

  • Created BaseBookingEventPayload type to capture common event structure
  • Used intersection types to compose final event types (BaseBookingEventPayload & { uid: string | undefined })
  • Created getBaseBookingEventPayload function for shared payload generation logic
  • Exported dry run payload functions and updated tests to import them instead of redefining
  • Fixed missing videoCallUrl field in rescheduleBookingSuccessfulV2 type (was present in dry run version but missing from regular version)

The refactoring maintains identical runtime behavior while reducing ~60 lines of duplicated code and improving maintainability.

Review & Testing Checklist for Human

  • Test actual SDK event firing in browser - Verify dryRunBookingSuccessfulV2 and dryRunRescheduleBookingSuccessfulV2 events fire correctly during dry run booking flows
  • Verify payload structure consistency - Compare event payloads before/after refactoring to ensure identical structure (especially the newly added videoCallUrl in reschedule events)
  • Test TypeScript intellisense - Verify intersection types provide proper autocomplete and type checking in IDEs
  • End-to-end booking flow test - Test both regular and dry run booking flows to ensure no regressions in event firing

Diagram

%%{ init : { "theme" : "default" }}%%
graph TB
    subgraph Legend
        L1["Major Edit"]:::major-edit
        L2["Minor Edit"]:::minor-edit  
        L3["Context/No Edit"]:::context
    end
    
    SDK["sdk-action-manager.ts<br/>Event type definitions"]:::major-edit
    Hooks["useBookings.ts<br/>Payload generation"]:::major-edit
    Tests["useBookings.test.ts<br/>Unit tests"]:::minor-edit
    
    Base["BaseBookingEventPayload<br/>Shared type"]:::major-edit
    
    Events1["bookingSuccessfulV2<br/>rescheduleBookingSuccessfulV2"]:::context
    Events2["dryRunBookingSuccessfulV2<br/>dryRunRescheduleBookingSuccessfulV2"]:::context
    
    SDK --> Base
    Base --> Events1
    Base --> Events2
    
    Hooks --> SDK
    Tests --> Hooks
    
    classDef major-edit fill:#90EE90
    classDef minor-edit fill:#87CEEB  
    classDef context fill:#FFFFFF
Loading

Notes

  • The refactoring revealed that rescheduleBookingSuccessfulV2 was missing the videoCallUrl field that was present in the dry run version - this has been fixed
  • All existing tests pass and TypeScript compilation succeeds
  • The changes maintain backward compatibility while improving code maintainability
  • Requested by @hariombalhara in session: https://app.devin.ai/sessions/2386c254d42d4b5391aa7e1f781c451e

…nRescheduleBookingSuccessfulV2)

- Add new event types dryRunBookingSuccessfulV2 and dryRunRescheduleBookingSuccessfulV2 to EventDataMap
- Create payload functions that exclude uid field for dry run events
- Fire dry run events when isDryRun is true in both regular and recurring booking flows
- Add unit tests to verify dry run event payloads are correct and exclude uid field
- Ensures dry run mode no longer skips event firing but uses appropriate dry run variants

Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com>
@devin-ai-integration
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

@coderabbitai
Copy link
Contributor

coderabbitai bot commented Aug 14, 2025

Walkthrough

Introduces a BaseBookingEventPayload type and refactors bookingSuccessfulV2 and rescheduleBookingSuccessfulV2 to extend it (adding uid where applicable). Adds two new public event payloads: dryRunBookingSuccessfulV2 and dryRunRescheduleBookingSuccessfulV2 (both BaseBookingEventPayload). In useBookings, adds internal builders getBaseBookingEventPayload and getBookingSuccessfulEventPayload plus exported aliases getDryRunBookingSuccessfulEventPayload and getDryRunRescheduleBookingSuccessfulEventPayload. Dry-run branches now build and emit dry-run events (including allBookings for recurring) and navigate to /booking/dry-run-successful; non-dry-run behavior is unchanged.

Tip

🔌 Remote MCP (Model Context Protocol) integration is now available!

Pro plan users can now connect to remote MCP servers from the Integrations page. Connect with popular remote MCPs such as Notion and Linear to add more context to your reviews and chats.

✨ Finishing Touches
  • 📝 Generate Docstrings
🧪 Generate unit tests
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch devin/1755147156-dry-run-events

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.
    • 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.
  • 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 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/Issue comments)

Type @coderabbitai help to get the list of available commands.

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

Status, Documentation and Community

  • Visit our Status Page to check the current availability of CodeRabbit.
  • 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 Aug 14, 2025
…ogic

- Create BaseBookingEventPayload type to eliminate duplication between regular and dry run events
- Use intersection types to compose final event types in sdk-action-manager.ts
- Create getBaseBookingEventPayload function for common payload generation logic
- Export dry run payload functions and import them in tests instead of redefining
- Fix missing videoCallUrl field in rescheduleBookingSuccessfulV2 type

Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com>
@vercel
Copy link

vercel bot commented Aug 14, 2025

The latest updates on your projects. Learn more about Vercel for GitHub.

2 Skipped Deployments
Project Deployment Preview Comments Updated (UTC)
cal ⬜️ Ignored Aug 15, 2025 5:02am
cal-eu ⬜️ Ignored Aug 15, 2025 5:02am

@github-actions
Copy link
Contributor

github-actions bot commented Aug 14, 2025

E2E results are ready!

@hariombalhara hariombalhara marked this pull request as ready for review August 14, 2025 12:34
@hariombalhara hariombalhara requested a review from a team as a code owner August 14, 2025 12:34
@graphite-app graphite-app bot requested a review from a team August 14, 2025 12:34
@dosubot dosubot bot added the bookings area: bookings, availability, timezones, double booking label Aug 14, 2025
@graphite-app
Copy link

graphite-app bot commented Aug 14, 2025

Graphite Automations

"Add consumer team as reviewer" took an action on this PR • (08/14/25)

1 reviewer was added to this PR based on Keith Williams's automation.

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🧹 Nitpick comments (4)
packages/embeds/embed-core/src/sdk-action-manager.ts (1)

12-25: Clarify payload contract (time format and field semantics).

Great consolidation. To make this contract self-documenting for SDK consumers, please document the expected time format and semantics for key fields.

Suggested inline JSDoc:

 type BaseBookingEventPayload = {
-  title: string | undefined;
-  startTime: string | undefined;
-  endTime: string | undefined;
+  /** Title as shown to the attendee (eventType name, considering overrides) */
+  title: string | undefined;
+  /** ISO 8601 string. Prefer UTC (toISOString). */
+  startTime: string | undefined;
+  /** ISO 8601 string. Prefer UTC (toISOString). */
+  endTime: string | undefined;
   eventTypeId: number | null | undefined;
-  status: string | undefined;
+  /** Booking status (e.g. "PENDING" | "ACCEPTED" | "CANCELLED"). String union upstream. */
+  status: string | undefined;
   paymentRequired: boolean;
   isRecurring: boolean;
   /**
    * This is only used for recurring bookings
    */
   allBookings?: { startTime: string; endTime: string }[];
-  videoCallUrl?: string;
+  /** Absolute URL for the meeting link (Zoom/Google Meet/etc), if applicable */
+  videoCallUrl?: string;
 };
packages/features/bookings/Booker/components/hooks/useBookings.ts (3)

59-79: Confirm startTime/endTime are emitted as ISO strings.

The builder assumes string inputs. Please confirm upstream booking.startTime/endTime are ISO 8601 strings in all success paths (including dry-run and recurring). If any path returns Date, convert to toISOString before emitting to satisfy the embed-core contract.

If needed, here’s a minimal, non-Day.js conversion pattern:

 const getBaseBookingEventPayload = (booking: {
-  startTime: string;
-  endTime: string;
+  startTime: string;
+  endTime: string;
   ...
 }) => {
   return {
-    startTime: booking.startTime,
-    endTime: booking.endTime,
+    startTime: booking.startTime,
+    endTime: booking.endTime,
     ...
   };
 };

If you discover Date types in some paths, we can widen the parameter type and normalize to ISO once at the boundary.


217-222: Remove unused validDuration computation in dry-run path.

validDuration is computed but never used in the dry-run branch, which can confuse future readers.

Apply this diff to remove it:

-        const validDuration = event.data?.isDynamic
-          ? duration || event.data?.length
-          : duration && event.data?.metadata?.multipleDuration?.includes(duration)
-          ? duration
-          : event.data?.length;

387-411: DRY the allBookings mapping in dry-run recurring branch.

Minor duplication: allBookings is computed twice and shadows booking in the map callback. Precompute once and reuse.

Apply this diff:

-        if (isRescheduling) {
-          sdkActionManager?.fire("dryRunRescheduleBookingSuccessfulV2", {
-            ...getDryRunRescheduleBookingSuccessfulEventPayload({
-              ...booking,
-              isRecurring: true,
-            }),
-            allBookings: bookings.map((booking) => ({
-              startTime: booking.startTime,
-              endTime: booking.endTime,
-            })),
-          });
-        } else {
-          sdkActionManager?.fire("dryRunBookingSuccessfulV2", {
-            ...getDryRunBookingSuccessfulEventPayload({
-              ...booking,
-              isRecurring: true,
-            }),
-            allBookings: bookings.map((booking) => ({
-              startTime: booking.startTime,
-              endTime: booking.endTime,
-            })),
-          });
-        }
+        const allBookings = bookings.map((b) => ({
+          startTime: b.startTime,
+          endTime: b.endTime,
+        }));
+        if (isRescheduling) {
+          sdkActionManager?.fire("dryRunRescheduleBookingSuccessfulV2", {
+            ...getDryRunRescheduleBookingSuccessfulEventPayload({
+              ...booking,
+              isRecurring: true,
+            }),
+            allBookings,
+          });
+        } else {
+          sdkActionManager?.fire("dryRunBookingSuccessfulV2", {
+            ...getDryRunBookingSuccessfulEventPayload({
+              ...booking,
+              isRecurring: true,
+            }),
+            allBookings,
+          });
+        }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these settings in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between c268925 and 82fa47e.

📒 Files selected for processing (2)
  • packages/embeds/embed-core/src/sdk-action-manager.ts (3 hunks)
  • packages/features/bookings/Booker/components/hooks/useBookings.ts (4 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.ts

📄 CodeRabbit Inference Engine (.cursor/rules/review.mdc)

**/*.ts: For Prisma queries, only select data you need; never use include, always use select
Ensure the credential.key field is never returned from tRPC endpoints or APIs

Files:

  • packages/embeds/embed-core/src/sdk-action-manager.ts
  • packages/features/bookings/Booker/components/hooks/useBookings.ts
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (.cursor/rules/review.mdc)

Flag excessive Day.js use in performance-critical code; prefer native Date or Day.js .utc() in hot paths like loops

Files:

  • packages/embeds/embed-core/src/sdk-action-manager.ts
  • packages/features/bookings/Booker/components/hooks/useBookings.ts
🔇 Additional comments (6)
packages/embeds/embed-core/src/sdk-action-manager.ts (2)

42-45: LGTM: v2 payload now reuses the base type + uid.

This removes duplication cleanly and keeps the surface area tight. No concerns here.


62-66: LGTM: reschedule v2 aligned with base + uid and new dry-run variants added.

Dry-run event names and payloads are consistent with the non-dry-run counterparts. Inclusion of videoCallUrl via the base type addresses the prior omission.

packages/features/bookings/Booker/components/hooks/useBookings.ts (4)

81-97: LGTM: simple composition keeps base and uid concerns nicely separated.

This keeps the uid out of the base and makes reusability straightforward.


98-98: LGTM: alias maintains parity with booking flow.

Keeping reschedule equal to booking for the payload builder improves maintainability.


100-102: LGTM: public dry-run payload wrappers are minimal and consistent.

Clear surface for consumers; avoids redefining payload shapes in tests and other callers.


223-239: LGTM: dry-run single booking events and isRecurring=false are correctly emitted.

Event names match embed-core, and payloads route through the new builders. Looks good.

Copy link
Contributor

@Udit-takkar Udit-takkar left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

code LGTM

Copy link
Contributor

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 0

🔭 Outside diff range comments (1)
packages/features/bookings/Booker/components/hooks/useBookings.ts (1)

60-80: Normalize startTime/endTime to strings (safely handle Date inputs) in base payload builder

Downstream SDK event contracts typically expect string timestamps. Here, booking.startTime/endTime can arrive as Date (common in existing code paths), and are passed through as-is. Normalize to ISO strings (or preserve strings) to avoid mixed types being fired across events.

Apply this diff:

-const getBaseBookingEventPayload = (booking: {
-  title?: string;
-  startTime: string;
-  endTime: string;
-  eventTypeId?: number | null;
-  status?: BookingStatus;
-  paymentRequired: boolean;
-  isRecurring: boolean;
-  videoCallUrl?: string;
-}) => {
-  return {
-    title: booking.title,
-    startTime: booking.startTime,
-    endTime: booking.endTime,
-    eventTypeId: booking.eventTypeId,
-    status: booking.status,
-    paymentRequired: booking.paymentRequired,
-    isRecurring: booking.isRecurring,
-    videoCallUrl: booking.videoCallUrl,
-  };
-};
+const getBaseBookingEventPayload = (booking: {
+  title?: string;
+  startTime: string | Date;
+  endTime: string | Date;
+  eventTypeId?: number | null;
+  status?: BookingStatus;
+  paymentRequired: boolean;
+  isRecurring: boolean;
+  videoCallUrl?: string;
+}) => {
+  const toISOStr = (v: string | Date | undefined) =>
+    typeof v === "string" ? v : v?.toISOString?.() ?? (v ? String(v) : undefined);
+
+  return {
+    title: booking.title,
+    startTime: toISOStr(booking.startTime),
+    endTime: toISOStr(booking.endTime),
+    eventTypeId: booking.eventTypeId,
+    status: booking.status,
+    paymentRequired: booking.paymentRequired,
+    isRecurring: booking.isRecurring,
+    videoCallUrl: booking.videoCallUrl,
+  };
+};
🧹 Nitpick comments (3)
packages/features/bookings/Booker/components/hooks/useBookings.ts (3)

82-98: DRY the argument type and align with base builder (accept Date|string)

Reuse the param type of getBaseBookingEventPayload to keep both builders in sync and avoid repeating field lists. This also carries the widened date/string types from the base builder.

Apply this diff:

-const getBookingSuccessfulEventPayload = (booking: {
-  title?: string;
-  startTime: string;
-  endTime: string;
-  eventTypeId?: number | null;
-  status?: BookingStatus;
-  paymentRequired: boolean;
-  uid?: string;
-  isRecurring: boolean;
-  videoCallUrl?: string;
-}) => {
+const getBookingSuccessfulEventPayload = (
+  booking: Parameters<typeof getBaseBookingEventPayload>[0] & { uid?: string }
+) => {
   return {
     uid: booking.uid,
     ...getBaseBookingEventPayload(booking),
   };
 };

218-241: Remove unused validDuration computation in dry-run branch

validDuration is computed but not used in this branch, adding noise and minor overhead. Safe to remove.

Apply this diff:

-        const validDuration = event.data?.isDynamic
-          ? duration || event.data?.length
-          : duration && event.data?.metadata?.multipleDuration?.includes(duration)
-          ? duration
-          : event.data?.length;
-
         if (isRescheduling) {
           sdkActionManager?.fire(
             "dryRunRescheduleBookingSuccessfulV2",
             getDryRunRescheduleBookingSuccessfulEventPayload({
               ...booking,
               isRecurring: false,
             })
           );
         } else {
           sdkActionManager?.fire(
             "dryRunBookingSuccessfulV2",
             getDryRunBookingSuccessfulEventPayload({
               ...booking,
               isRecurring: false,
             })
           );
         }

389-412: Avoid recomputing allBookings and normalize timestamps for recurring dry-run events

Compute allBookings once, normalize to strings (as above), and reuse in both branches. Also avoids shadowing the outer booking variable in the .map callback.

Apply this diff:

       if (booking.isDryRun) {
-        if (isRescheduling) {
-          sdkActionManager?.fire("dryRunRescheduleBookingSuccessfulV2", {
-            ...getDryRunRescheduleBookingSuccessfulEventPayload({
-              ...booking,
-              isRecurring: true,
-            }),
-            allBookings: bookings.map((booking) => ({
-              startTime: booking.startTime,
-              endTime: booking.endTime,
-            })),
-          });
-        } else {
-          sdkActionManager?.fire("dryRunBookingSuccessfulV2", {
-            ...getDryRunBookingSuccessfulEventPayload({
-              ...booking,
-              isRecurring: true,
-            }),
-            allBookings: bookings.map((booking) => ({
-              startTime: booking.startTime,
-              endTime: booking.endTime,
-            })),
-          });
-        }
+        const toISOStr = (v: any) =>
+          typeof v === "string" ? v : v?.toISOString?.() ?? (v ? String(v) : undefined);
+        const allBookings = bookings.map((b) => ({
+          startTime: toISOStr(b.startTime),
+          endTime: toISOStr(b.endTime),
+        }));
+
+        if (isRescheduling) {
+          sdkActionManager?.fire("dryRunRescheduleBookingSuccessfulV2", {
+            ...getDryRunRescheduleBookingSuccessfulEventPayload({
+              ...booking,
+              isRecurring: true,
+            }),
+            allBookings,
+          });
+        } else {
+          sdkActionManager?.fire("dryRunBookingSuccessfulV2", {
+            ...getDryRunBookingSuccessfulEventPayload({
+              ...booking,
+              isRecurring: true,
+            }),
+            allBookings,
+          });
+        }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

💡 Knowledge Base configuration:

  • MCP integration is disabled by default for public repositories
  • Jira integration is disabled by default for public repositories
  • Linear integration is disabled by default for public repositories

You can enable these settings in your CodeRabbit configuration.

📥 Commits

Reviewing files that changed from the base of the PR and between 82fa47e and a5468c2.

📒 Files selected for processing (1)
  • packages/features/bookings/Booker/components/hooks/useBookings.ts (4 hunks)
🧰 Additional context used
📓 Path-based instructions (2)
**/*.ts

📄 CodeRabbit Inference Engine (.cursor/rules/review.mdc)

**/*.ts: For Prisma queries, only select data you need; never use include, always use select
Ensure the credential.key field is never returned from tRPC endpoints or APIs

Files:

  • packages/features/bookings/Booker/components/hooks/useBookings.ts
**/*.{ts,tsx}

📄 CodeRabbit Inference Engine (.cursor/rules/review.mdc)

Flag excessive Day.js use in performance-critical code; prefer native Date or Day.js .utc() in hot paths like loops

Files:

  • packages/features/bookings/Booker/components/hooks/useBookings.ts
🧬 Code Graph Analysis (1)
packages/features/bookings/Booker/components/hooks/useBookings.ts (1)
packages/trpc/server/routers/publicViewer/procedures/event.ts (1)
  • event (8-12)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (1)
  • GitHub Check: Install dependencies / Yarn install & cache
🔇 Additional comments (1)
packages/features/bookings/Booker/components/hooks/useBookings.ts (1)

101-103: Public dry-run payload helper exports look good

Aliases make the surface area explicit while sharing the same builder. Good for DX and future refactors.

@hariombalhara hariombalhara enabled auto-merge (squash) August 15, 2025 05:02
@hariombalhara hariombalhara merged commit 0af62da into main Aug 15, 2025
36 of 37 checks passed
@hariombalhara hariombalhara deleted the devin/1755147156-dry-run-events branch August 15, 2025 05:21
zomars pushed a commit that referenced this pull request Aug 15, 2025
…nRescheduleBookingSuccessfulV2) (#23072)

* feat: add dry run events for SDK (dryRunBookingSuccessfulV2 and dryRunRescheduleBookingSuccessfulV2)

- Add new event types dryRunBookingSuccessfulV2 and dryRunRescheduleBookingSuccessfulV2 to EventDataMap
- Create payload functions that exclude uid field for dry run events
- Fire dry run events when isDryRun is true in both regular and recurring booking flows
- Add unit tests to verify dry run event payloads are correct and exclude uid field
- Ensures dry run mode no longer skips event firing but uses appropriate dry run variants

Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com>

* refactor: make dry run events more DRY by reusing types and payload logic

- Create BaseBookingEventPayload type to eliminate duplication between regular and dry run events
- Use intersection types to compose final event types in sdk-action-manager.ts
- Create getBaseBookingEventPayload function for common payload generation logic
- Export dry run payload functions and import them in tests instead of redefining
- Fix missing videoCallUrl field in rescheduleBookingSuccessfulV2 type

Co-Authored-By: hariom@cal.com <hariombalhara@gmail.com>

* Remove test file

---------

Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

bookings area: bookings, availability, timezones, double booking core area: core, team members only enterprise area: enterprise, audit log, organisation, SAML, SSO ready-for-e2e

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants