* fix: Use WEBAPP_URL_FOR_OAUTH to be able to use http://localhost:3000
for local testing
* In case of JSON.parse crash that could happen if zoom reponsed with xml
* Fix cases where auto_recording and default_password_for_scheduled_meetings could be nullish
* perf: optimize slot conflict checking from O(n²) to O(n log n)
- Replace nested mapping with pre-sorted busy slots for faster lookups
- Use early termination when busy slots are sorted by start time
- Maintain exact same interface and behavior as original checkForConflicts
- All existing tests pass, preserving edge case handling
- Reduces complexity from O(available slots × busy slots) to O(n log n)
Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>
* refactor: move O(n log n) optimization to checkForConflicts function
- Replace inline optimization with optimized checkForConflicts function
- Maintain same performance while improving code architecture
- Avoid duplication of conflict checking logic
- Keep all existing interfaces and behavior unchanged
Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>
* test: add comprehensive unit tests for checkForConflicts function
- Add 20 additional test cases covering edge cases and boundary conditions
- Test multiple busy periods scenarios and complex overlaps
- Comprehensive currentSeats handling scenarios
- Timezone and cross-day boundary testing
- Performance testing with large datasets
- Fix invalid date generation in test data that was causing NaN conflicts
- Achieve near 100% coverage of all conflict scenarios documented in function comments
- Verify behavioral equivalence between original O(n²) and optimized O(n log n) implementations
Co-Authored-By: keith@cal.com <keithwillcode@gmail.com>
* Simple, safe performance tweak
* Explicitly define the input of busy to be either Date or Dayjs, not string
* EventBusyDate must ALWAYS be a type that supports valueOf
* Revert "EventBusyDate must ALWAYS be a type that supports valueOf"
This reverts commit 35b572266219d64c22db3c3e24b0cb6ca7a901a6.
* Revert "Explicitly define the input of busy to be either Date or Dayjs, not string"
This reverts commit 902f29708e4b7990a4e5e2865cab2f18ab3e44f0.
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: Alex van Andel <me@alexvanandel.com>
* only check first slot
* skip test for second slot availability check
* fixing tests in handleNewRecurringBooking.test.ts
* skip test
---------
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
* Add `rerouting` to `AssignmentReasonRecorder`
* Pass session email as `rescheduledBy`
* Write reassign reason
* Edit message
* Use `routingFormRoute` when rerouting
* Pass isRerouting & reroutedByEmail to `routingFormRoute` method
* Type fix
* Fix test
* Fix test
* Fix test
* Type fix
* Refactor to use UserRepository
* Show rerouted by email
* Replace isReroutingCase
* Fix rescheduledBy for new tab reschduling
---------
Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: Hariom <hariombalhara@gmail.com>
* feat: add field type change warning dialog to routing forms
- Add FieldTypeChangeWarningDialog component to prevent field type changes
- Show informative dialog explaining data integrity concerns when users try to change field types
- Provide alternative suggestion to create new field instead of changing existing one
- Add i18n translations for dialog messages
- Integrate dialog into routing form edit page field type selector
- Bypass Teams plan restriction for testing routing forms functionality
- Fix ESLint error by properly handling scrollIntoView in embed mode with disable comment
Prevents data integrity issues by blocking field type changes (e.g. multiselect → text)
that could make existing form responses incompatible and cause data loss.
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* fix: make field type dialog more selective to allow legitimate changes during form creation
- Only show warning dialog when there's actual data integrity risk
- Allow field type changes for new fields or fields without meaningful labels
- Fixes E2E test timeout by not blocking legitimate field type changes
- Maintains data protection for existing fields with real data
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* fix: complete field type dialog implementation with translations and component
- Add FieldTypeChangeWarningDialog component with proper i18n support
- Add all required translation strings for dialog messages
- Ensure dialog only shows for actual data integrity risks
- Allow legitimate field type changes during form creation
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* simplify field type dialog: one button, button replaces SelectField, remove forms page changes
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* use Button component
* feat: restore SelectField with conditional dialog for field type changes
- Restore original SelectField dropdown to allow users to see available field types
- Add conditional logic to show dialog only when different type is selected AND form has responses
- Prevent field type changes by not calling onChange when dialog is shown
- Pass hasFormResponses prop from FormEdit to Field component
- Maintain data integrity while providing clear user guidance
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* controlled value
* convert dialog to tooltip
* Update common.json
* remove unused texts
* allow type changing for new field
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: eunjae@cal.com <hey@eunjae.dev>
* feat: allow setting DAILY VIDEO region via env
* add comments
* Cleaner approach to Daily video region type assertion
---------
Co-authored-by: Alex van Andel <me@alexvanandel.com>
* Restart form if admin is not org admin
* Show pricing is admin and hosted
* Only show billing specific fields when enabled
* Create user onboarding only if valid valid license when self hosting
* Reset store when org creation is completed
* Create schema for trpc input when creating an org
* Add `organization.createSelfHosted` trpc endpoint
* `createOrganizationFromOnboarding` do not require stripe data
* Create organization without billing if self-hosted admin
* Update organizationOnboarding record as completed
* Handle updating subscription for self hosters
* Refactor `isBillingEnabled` to store
* Type fix
* Fix admin org creation for hosted
* Hide UI from admin
* Add tests
* fix: Fix LicenseKeySingleton mocking in organization tests
- Add proper vi.mock() module-level mocking for LicenseKeySingleton
- Replace incorrect casting syntax with vi.mocked() approach
- Add LicenseKeySingleton mock to hosted tests in intentToCreateOrg.handler.test.ts
- Fix IS_SELF_HOSTED mocking for hosted vs self-hosted test scenarios
- All organization creation tests now pass locally
Co-Authored-By: joe@cal.com <joe@cal.com>
* Fix tests
* Fix tests
* Test fixes
* Type fix
* Type fix
* Type fix
* Update packages/features/ee/organizations/lib/server/createOrganizationFromOnboarding.test.ts
Fix typo
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
* fix: Add IS_SELF_HOSTED mocking for E2E organization creation tests
Co-Authored-By: joe@cal.com <joe@cal.com>
* Fix E2E test
* Address feedback
* Type fix
* Fix e2e tests
* Remove unused code
* Small fixes
* fix unit tests
* review fixes
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: joe@cal.com <joe@cal.com>
Co-authored-by: Benny Joo <sldisek783@gmail.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
Co-authored-by: Hariom <hariombalhara@gmail.com>
* refactor(embed-core): update theme class names for consistency
Standardize theme class names to use 'cal-element-embed-dark' and 'cal-element-embed-light' to improve maintainability and clarity.
* refactor(embed-core): replace theme class strings with constants
* fix theme not changing
---------
Co-authored-by: Tushar Bhatt <95581504+TusharBhatt1@users.noreply.github.com>
Co-authored-by: Hariom <hariombalhara@gmail.com>
* fix creating user balance
* fix org check if teamId is given
* adjust hasAvailableCredits function
* improve comments
* fix creditBalance.create
* adjust test
---------
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
* feat: add integration test for RoutingFormResponseField triggers
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* refactor: remove changing field types test case
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: eunjae@cal.com <hey@eunjae.dev>
* [CAL-5926] Add 'onTimeslotsLoaded' prop to 'Booker' atom
* Added 'onTimeslotsLoaded' to BookerPlatformWrapperAtomProps
* fixed type error and added onTimeslotsLoaded prop to doc
---------
Co-authored-by: Somay Chauhan <somaychauhan98@gmail.com>
* add smsSegments to creditExpenseLog
* add download button
* download only data from selected month
* improvements
* improve design
* use repository function
* add tests for credit repository
* fix type error
* fix unit test
* fix type error
* fix unit test
* code clean up
* fix skeleton loader
* remove empty mt
* code clean up
* move csv headers out of function
---------
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
Co-authored-by: Benny Joo <sldisek783@gmail.com>
* feat: add attendee data to CSV export with seated event support
- Add up to 3 attendees to CSV export in 'name (email)' format
- Use booking.seatsReferences for seated events, booking.attendees for regular events
- Maintain backward compatibility with existing bookerEmail/bookerName fields
- Add attendee1, attendee2, attendee3 columns to CSV output
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* fix: restore missing comment as requested in PR review
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* Update packages/features/insights/server/events.ts
* feat: remove duplicate booker columns from CSV export
- Remove bookerEmail and bookerName columns as they duplicate attendee data
- Remove noShowGuest field which was based on booker data
- Remove unused booker field from bookingMap
- Keep only attendee1, attendee2, attendee3 columns with name (email) format
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* feat: restore noShowGuest field to CSV export
- Add noShowGuest field mapping from first attendee's noShow property
- Maintain existing attendee1, attendee2, attendee3 columns
- Default to false when no attendees exist
- Works with both seated events and regular events
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* rename column
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: eunjae@cal.com <hey@eunjae.dev>
* Add unit tests to routing flow
* fix: resolve TypeScript errors in routing forms test files
- Fix mock form structure to match TargetRoutingFormForResponse type
- Add missing properties like selectText, deleted, updatedById to form fields
- Correct route action types to use valid RouteActionType enum values
- Fix response objects to include required label property
- Update mock return values for findTeamMembersMatchingAttributeLogic
- Use proper type assertions for complex route objects
Co-Authored-By: hariom@cal.com <hariom@cal.com>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: hariom@cal.com <hariom@cal.com>
* Add queued booking response table
* Create `RoutingFormResponseRepository`
* Pass `queueFormResponse` param
* Queue up form response if param is passed
* Forward queued form response parma to booker
* Pass `queuedFormResponse` from booker to `handleNewBooking`
* Write queued routing form response
* Type fixes
* Clean up
* Allow dry run to work which wont have any QueuedFormResponse or FormResponse
* Support passing the time when the modal was actually shown to the user and consider that time as the time of form submission
* fix ts error
* Queue -> Response through separate endpoint that would be triggered by
embed
* Make queueResponseId a non-guessable uid
* Change queueFormResponse query param
* fix ts error
* Support useQueuedResponse to record new response data
* revert handleNewBooking
* Remove dead code formResponse
* Refactor use repository
* Unify migration files
* refactor: moved api endpoint to app dir
Signed-off-by: Omar López <zomars@me.com>
* Update formResponse.ts
* Refactor use-queued-response for test
* Add tests
* Fix ts error and unit test. recordFormResponse cant return nullish response
* fix schema
* feat: Support full reuse of preloaded iframe (#21803)
* feat: support updating cal video settings in API v2 (#21784)
* feat: support updating cal video settings in API v2
* chore: update descriptio
* feat: support create event type
* test: add test for updating event type
* test: add test for create event type
* chore: undo openapi
* chore: bump libraries
* Revert "chore: bump libraries"
This reverts commit bdf36d09b021fc531497a7b7ea66ab9c52b7d136.
* chore: bump libraries
---------
Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
Co-authored-by: supalarry <laurisskraucis@gmail.com>
* fix tests and ts
* Fix tests
* wip-useQueuedResponseEndpoint
* Add one more test
* Change queueFormResponse query param
* wip
* Support useQueuedResponse to record new response data
* Use the update useQueuedResponse endpoint
* self-review addressed
* Use queuedResponse if available in slots/utils
* Add documentation
* Remove use-queued-response from critical-path
---------
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
Co-authored-by: supalarry <laurisskraucis@gmail.com>
* Update schema.prisma
* refactor: renamed to avoid react hooks confusion
Signed-off-by: Omar López <zomars@me.com>
---------
Signed-off-by: Omar López <zomars@me.com>
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
Co-authored-by: Omar López <zomars@me.com>
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
Co-authored-by: supalarry <laurisskraucis@gmail.com>
Co-authored-by: Peer Richelsen <peeroke@gmail.com>
* feat: optimize Prisma queries by replacing findFirst with findUnique where applicable
- Replace findFirst/findFirstOrThrow with findUnique/findUniqueOrThrow for queries using unique constraints
- Maintain existing functionality and error handling behavior
- Focus on queries using primary keys and unique index fields from schema
- Revert problematic changes that caused test failures to maintain stability
Co-Authored-By: benny@cal.com <benny@cal.com>
* revert: exclude API files from Prisma query optimizations per user request
- Reverted all 55 API-related files to their original state
- Kept all non-API Prisma query optimizations intact
- API files include apps/api/v1, apps/api/v2, apps/web/app/api, and packages/app-store/*/api
- Non-API optimizations remain for packages/lib, packages/features, apps/web (non-api), etc.
Co-Authored-By: benny@cal.com <benny@cal.com>
* feat: optimize membership query in attributeUtils to use findUnique with userId_teamId constraint
Co-Authored-By: benny@cal.com <benny@cal.com>
* revert: exclude test files from Prisma query optimizations per user request
Co-Authored-By: benny@cal.com <benny@cal.com>
* revert: revert attributeUtils.ts to use findFirst for test compatibility
Co-Authored-By: benny@cal.com <benny@cal.com>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: benny@cal.com <benny@cal.com>
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
* fix: getBookings for team admins within orgs
* fixup! fix: getBookings for team admins within orgs
* chore: update getUserIdsAndEmailsWhereUserIsAdminOrOwner and remove unused orgId
---------
Co-authored-by: Anik Dhabal Babu <81948346+anikdhabal@users.noreply.github.com>
* feat - Restrict same email to create more than 'n' active bookings at a time
* updated checkbookerbookinglimit function
* type fix
* minor change
* import fix
* minor fixes
* back to null on disable
* back
* type check
* managed edge cases
* chore: name changes
* name changes
* fix
* minor change
* changed name
* use default value for maxactivebookingsperbooker, and some minor changes
* disabling bookerbooking limit for recurring event
* disabling bookerbooking limit for recurring event
* type fix
* ui fix and backend eventtype update check
* Add `maxActiveBookingPerBookerOfferReschedule` to schema
* Create `MaxActiveBookingsPerBookerController` and offer reschedule option
* Add offer reschedule to event type form data
* Pass data through to HttpError
* When checking max bookings, return last booking info if applicable
* removed unused code
* minor changes
* update validation
* chore
* Do not check booking limits if rescheduling
* Add data for reschedule
* Add reschedule specific error code
* On maximum booking error, write to booker store reschedule params
* Add translations for error codes
* Write to error message previous booking time
* minor fix
* Write to error message previous booking time
* Type fixes
* Clean up comment
* Refactor eventType update errors
* Typo fix
* Type fix
* Type fix
* Type fix
* Fix test
* Fix test
* Add migration
* Addressed feedback and missed merges
---------
Co-authored-by: romit <romitgabani@icloud.com>
* feat - Restrict same email to create more than 'n' active bookings at a time
* updated checkbookerbookinglimit function
* type fix
* minor change
* import fix
* minor fixes
* back to null on disable
* back
* type check
* managed edge cases
* chore: name changes
* name changes
* fix
* minor change
* changed name
* use default value for maxactivebookingsperbooker, and some minor changes
* disabling bookerbooking limit for recurring event
* disabling bookerbooking limit for recurring event
* type fix
* ui fix and backend eventtype update check
* removed unused code
* minor changes
* update validation
* chore
* Do not check booking limits if rescheduling
* minor fix
* Refactor eventType update errors
* Typo fix
---------
Co-authored-by: Joe Au-Yeung <j.auyeung419@gmail.com>
* feat: add api v2 endpoints for cal video
* feat: add endpoint for fetching transcripts
* chore: fetch only references
* feat: add cal video and transcript
* chore: undp open api
* chore: move it to service
* chore: bump libraries
---------
Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
Co-authored-by: supalarry <laurisskraucis@gmail.com>
* feat: support updating cal video settings in API v2
* chore: update descriptio
* feat: support create event type
* test: add test for updating event type
* test: add test for create event type
* chore: undo openapi
* chore: bump libraries
* Revert "chore: bump libraries"
This reverts commit bdf36d09b021fc531497a7b7ea66ab9c52b7d136.
* chore: bump libraries
---------
Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
Co-authored-by: supalarry <laurisskraucis@gmail.com>
* feat: add API endpoint to fetch Google Calendar meeting details and metrics
* refactor: rename eventId to eventUid and update calendar event details endpoint
* feat: implement Google Calendar service account delegation for event details
* refactor: simplify Google Calendar event response
* refactor: simplify calendar event details endpoint
* feat: add calendar event details endpoint with schema and controller implementation
* chore: reset platform libraries package version to 0.0.0
* refactor: migrate calendar event details to unified calendars module
* Update gcal.service.ts
* refactor: update calendar event schema with title and locations fields replacing summary and conferenceData
* feat: update calendar event source to use enum type for better validation
* update api description
* refactor: make Google Calendar service methods private
* refactor: remove location field from unified calendar event output
* fix: update Google Calendar event location type property to match unified schema
* feat: add CalendarEventStatus enum and map Google Calendar statuses to standardized values
* docs: add property descriptions to calendar event schema and remove organizer field
* fix: change calendar event locations type from null to empty array in unified calendar API
* feat: make calendar source field required
* refactor: replace organizer field with hosts array in Google calendar event mapping
* feat: enhance calendar event location API documentation with detailed property descriptions
* feat: add calendar event details endpoint documentation
* fix: typo
* docs: update calendar event details API description to remove reschedule history reference
* refactor: rename uri to url in calendar event location interfaces and mappings
* refactor: improve calendar event response status handling and code organization
* Update get-unified-calendar-event.ts
* update docs
* chore: update @calcom/platform-libraries to version 0.0.215
* feat: split atoms endpoints and add public event type endpoint
* Update ConnectedDestinationCalendars import path across platform/atoms components
* refactor: update BookingResponse import path from platform-libraries to features/bookings
* Move AvailableSlotsType to util.ts and update imports to use GetAvailableSlotsResponse
* Refactor import path for RecurringBookingCreateBody type from libraries to types
* Fix import path for getBookingForReschedule type from platform-libraries to features
* Refactor PublicEventType export location and update import references
* Remove @calcom/platform-libraries dependency from atoms package.json
* chore(deps): update yarn.lock dependencies
* Remove console.log statements and fix indentation in event type hooks
* Migrate event type transformers from platform/libraries to api/v2 directory
* Remove console.log
* Update BookerPlatformWrapper.tsx
* Add script to populate empty team slugs with slugified team names
* Remove vitest imports
* reset platform libraries version
* Remove unused orgId comment from useAtomGetPublicEvent hook params
* Update useApiV2AvailableSlots.ts
* refactor: remove unused exports from lib package index file
* Undo: @SomayChauhan
Add script to populate empty team slugs with slugified team names
* Update booking.tsx
* chore: upgrade @calcom/platform-libraries from 0.0.202 to 0.0.205
* chore: bump @calcom/platform-libraries from 0.0.205 to 0.0.206
* chore: configure babel and jest for node module transpilation in api v2
* fix: type errors
* Revert "chore: configure babel and jest for node module transpilation in api v2"
This reverts commit b2cf172a84fe8953f9497bf6e43874f476fbc04b.
* Update calendars.service.ts
* chore: bump @calcom/platform-libraries from 0.0.208 to 0.0.209
* fix: add proper type definition for calendar busy times to resolve ts-expect-error
* refactor: deprecate v2 old availability endpoints (#21075)
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
* chore: publish platform librareis
* feat: add delegation credential fields to calendar service mock
* chore: update @calcom/platform-libraries from 0.0.211 to 0.0.213
* fix: skip failing calendar integration test
* chore: bump @calcom/platform-libraries from 0.0.213 to 0.0.214
* fix: api/v2 build error
* fix: e2e tests
---------
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
Co-authored-by: supalarry <laurisskraucis@gmail.com>
Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
- Add utility function for cascading hideBranding logic
- Update all getServerSideProps files to check organization hideBranding as fallback
- Ensure team queries include parent hideBranding data
- Fix hideBranding not working for organization members and teams
Fixes the issue where organization-level branding settings were not
being applied to user and team event pages when the direct entity
didn't have hideBranding enabled.
Co-authored-by: Hariom Balhara <hariombalhara@gmail.com>
* Create `VerificationTokenRepository`
* Update the verification token expiry when resending the invite
* Handle error
* Fix import
* Get past unique constraint
* Update packages/trpc/server/routers/viewer/teams/resendInvitation.handler.ts
Co-authored-by: Alex van Andel <me@alexvanandel.com>
* Update packages/lib/server/repository/verificationToken.ts
Update set expiry time
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
* Type fix
* Update how we're fetching the token
---------
Co-authored-by: Alex van Andel <me@alexvanandel.com>
Co-authored-by: cubic-dev-ai[bot] <191113872+cubic-dev-ai[bot]@users.noreply.github.com>
* Adds onFormStateChange callback on EventTypeSettings atom
* updated docs for event-type
* added watch all form values
---------
Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com>
* feat: return team event type hosts username
* docs: team event types hosts username in return
* fix: ignore cancelled and rejected bookings from slot reservation
* fix: dont allow slot to overlap existing active booking
* refactor: remove log
* Add notes to `EventManager.create`
* Create `CalendarServiceEvent`
* Generate calendar description and remove attendees if event is private in `CalendarManager`
* Process event for reschedule method
* Refactor calendar services
* Clean up comment
* Type fixes
* Type fix
* Type fix
* add virta check for anonymizing host
* move to env var
* move env var to constants
* fix: filter empty string
* fix test
* fix test
---------
Co-authored-by: Udit Takkar <udit222001@gmail.com>
* fix(email): hide organizer info on rescheduled events
* hide organizer email on bookings-single-view
* replace organizer email with name
* sanitize previous booking only
* clean up code
* fix dumb error
* move away from merging twice
* move to use loggedIn Router directly
* fix router outputs types
* fix mocks in create button with teasm tests
---------
Co-authored-by: Alex van Andel <me@alexvanandel.com>
* Fix: 'Hide from profile' toggle background not sized correctly on mobile
* fix: changed padding back to original
---------
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
* add route filter to inject script
* update middleware for pathname as Referer might not work all time
* move d to (booking-page-wrapper) instead of route filter and change in middleware
* add e2e tests
* feat: store cal video recording on s3
* feat: create new route to fetch download link
* tests: add unit test
* fix: unit test
* fix: type error
* chore: add env var
* fix: open in new tab
* fix: type err
* chore: update test
* fix: import
* chore: use cal video recording token secret
---------
Co-authored-by: Syed Ali Shahbaz <52925846+alishaz-polymath@users.noreply.github.com>
* fix: Cannot read properties of undefined (reading 'id')
* docs: managed users dont have cal.com page
* docs: reassign works only for round robin bookings
* refactor: put OAuthClientWebhooksController behind ApiAuthGuard
* fix: tests
* fix: typo
* charge free users for SMS to CA an US
* allow custom template for free users
* fix backend + some UI fixes
* make text editable
* rename back to needsTeamsUpgrade
* add twilio webhook handler tests
---------
Co-authored-by: CarinaWolli <wollencarina@gmail.com>
* fix google-meet being used instead of Default Cal Video preference if
set
* Review addressed
---------
Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com>
* refactor(e2e): use filter helper methods instead of raw selectors
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
* refactor(e2e): rename selectFilter to addFilter and update all usages
Co-Authored-By: eunjae@cal.com <hey@eunjae.dev>
---------
Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com>
Co-authored-by: eunjae@cal.com <hey@eunjae.dev>
@@ -233,7 +267,14 @@ export class BookingsController_2024_08_13 {
@ApiOperation({
summary:"Cancel a booking",
description:`:bookingUid can be :bookingUid of an usual booking, individual recurrence or recurring booking to cancel all recurrences.
For seated bookings to cancel one individual booking provide :bookingUid and :seatUid in the request body. For recurring seated bookings it is not possible to cancel all of them with 1 call
\nCancelling seated bookings:
It is possible to cancel specific seat within a booking as an attendee or all of the seats as the host.
\n1. As an attendee - provide :bookingUid in the request URL \`/bookings/:bookingUid/cancel\` and seatUid in the request body \`{"seatUid": "123-123-123"}\` . This will remove this particular attendance from the booking.
\n2. As the host - host can cancel booking for all attendees aka for every seat. Provide :bookingUid in the request URL \`/bookings/:bookingUid/cancel\` and cancellationReason in the request body \`{"cancellationReason": "Will travel"}\` and \`Authorization: Bearer token\` request header where token is event type owner (host) credential. This will cancel the booking for all attendees.
\nCancelling recurring seated bookings:
For recurring seated bookings it is not possible to cancel all of them with 1 call
like with non-seated recurring bookings by providing recurring bookind uid - you have to cancel each recurrence booking by its bookingUid + seatUid.`,
})
@ApiBody({
@@ -290,7 +331,8 @@ export class BookingsController_2024_08_13 {
@ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER)
@ApiOperation({
summary:"Reassign a booking to auto-selected host",
description:"The provided authorization header refers to the owner of the booking.",
description:
"Currently only supports reassigning host for round robin bookings. The provided authorization header refers to the owner of the booking.",
})
asyncreassignBooking(
@Param("bookingUid")bookingUid: string,
@@ -311,7 +353,8 @@ export class BookingsController_2024_08_13 {
@ApiHeader(API_KEY_OR_ACCESS_TOKEN_HEADER)
@ApiOperation({
summary:"Reassign a booking to a specific host",
description:"The provided authorization header refers to the owner of the booking.",
description:
"Currently only supports reassigning host for round robin bookings. The provided authorization header refers to the owner of the booking.",
`Booking with uid=${createdSeatedBooking.uid} is a seated booking which means you have to provide seatUid in the request body to specify which seat specifically you want to reschedule. First, fetch the booking using https://cal.com/docs/api-reference/v2/bookings/get-a-booking and then within the attendees array you will find the seatUid of the booking you want to reschedule. Second, provide the seatUid in the request body to specify which seat specifically you want to reschedule using the reschedule endpoint https://cal.com/docs/api-reference/v2/bookings/reschedule-a-booking#option-2`
`Can't reschedule booking with uid=${rescheduledBooking.uid} because it has been cancelled and rescheduled already to booking with uid=${newBooking.uid}. You probably want to reschedule ${newBooking.uid} instead by passing it within the request URL.`
`Event type with id=${eventType.id} is the parent managed event type that can't be booked. You have to provide the child event type id aka id of event type that has been assigned to one of the users.`
);
}
body.eventTypeId=eventType.id;
if("instant"inbody&&body.instant){
@@ -397,6 +404,7 @@ export class BookingsService_2024_08_13 {
`Can't reschedule booking with uid=${bookingUid} because it has been cancelled and rescheduled already to booking with uid=${rescheduledTo?.uid}. You probably want to reschedule ${rescheduledTo?.uid} instead by passing it within the request URL.`
@@ -587,6 +586,11 @@ export class InputBookingsService_2024_08_13 {
if(!eventType){
thrownewNotFoundException(`Event type with id=${booking.eventTypeId} not found`);
}
if(eventType.seatsPerTimeSlot){
thrownewBadRequestException(
`Booking with uid=${bookingUid} is a seated booking which means you have to provide seatUid in the request body to specify which seat specifically you want to reschedule. First, fetch the booking using https://cal.com/docs/api-reference/v2/bookings/get-a-booking and then within the attendees array you will find the seatUid of the booking you want to reschedule. Second, provide the seatUid in the request body to specify which seat specifically you want to reschedule using the reschedule endpoint https://cal.com/docs/api-reference/v2/bookings/reschedule-a-booking#option-2`
message:"You are not authorized to access this resource",
},
[TRPC_ERROR_CODE.FORBIDDEN]:{
statusCode: 403,
message:"You don't have necessary permissions to access this resource",
},
[TRPC_ERROR_CODE.NOT_FOUND]:{
statusCode: 404,
message:"The requested resource was not found",
},
[TRPC_ERROR_CODE.INTERNAL_SERVER_ERROR]:{
statusCode: 500,
message:"An unexpected error occurred on the server. Please try again later",
},
[TRPC_ERROR_CODE.BAD_REQUEST]:{
statusCode: 400,
message:"Bad request: Please check your request data and try again",
},
[TRPC_ERROR_CODE.CONFLICT]:{
statusCode: 409,
message:"Could not process the request due to a resource conflict with the current state",
},
[TRPC_ERROR_CODE.TOO_MANY_REQUESTS]:{
statusCode: 429,
message:"You have exceeded the allowed number of requests",
},
[TRPC_ERROR_CODE.PAYLOAD_TOO_LARGE]:{
statusCode: 413,
message:"The request payload is too large",
},
[TRPC_ERROR_CODE.CLIENT_CLOSED_REQUEST]:{
statusCode: 499,
message:"The client closed the connection before the server could finish processing the request",
},
[TRPC_ERROR_CODE.METHOD_NOT_SUPPORTED]:{
statusCode: 405,
message:"The requested method is not supported for this resource",
},
[TRPC_ERROR_CODE.NOT_IMPLEMENTED]:{
statusCode: 501,
message:"The requested method is not implemented on the server",
},
[TRPC_ERROR_CODE.PRECONDITION_FAILED]:{
statusCode: 412,
message:"The server does not meet one of the preconditions that the requester put on the request",
},
[TRPC_ERROR_CODE.TIMEOUT]:{
statusCode: 408,
message:"The request took too long to complete. Please try again later",
},
[TRPC_ERROR_CODE.UNPROCESSABLE_CONTENT]:{
statusCode: 422,
message:
"The server was unable to process the request because the request payload is semantically incorrect or because the request is syntactically incorrect",
},
[TRPC_ERROR_CODE.PARSE_ERROR]:{
statusCode: 400,
message:"The request could not be parsed due to invalid syntax.",
errorMessage="You are not authorized to access this resource";
break;
case"FORBIDDEN":
statusCode=403;
errorMessage="You don't have necessary permissions to access this resource";
break;
case"NOT_FOUND":
statusCode=404;
errorMessage="The requested resource was not found";
break;
case"INTERNAL_SERVER_ERROR":
statusCode=500;
errorMessage="An unexpected error occurred on the server. Please try again later";
break;
case"BAD_REQUEST":
statusCode=400;
errorMessage="Bad request: Please check your request data and try again";
break;
case"CONFLICT":
statusCode=409;
errorMessage="Could not process the request due to a resource conflict with the current state";
break;
case"TOO_MANY_REQUESTS":
statusCode=429;
errorMessage="You have exceeded the allowed number of requests";
break;
case"PAYLOAD_TOO_LARGE":
statusCode=413;
errorMessage="The request payload is too large";
break;
case"CLIENT_CLOSED_REQUEST":
statusCode=499;
errorMessage=
"The client closed the connection before the server could finish processing the request";
break;
case"METHOD_NOT_SUPPORTED":
statusCode=405;
errorMessage="The requested method is not supported for this resource";
case"NOT_IMPLEMENTED":
statusCode=501;
errorMessage="The requested method is not implemented on the server";
break;
case"PRECONDITION_FAILED":
statusCode=412;
errorMessage=
"The server does not meet one of the preconditions that the requester put on the request";
break;
case"TIMEOUT":
statusCode=408;
errorMessage="The request took too long to complete. Please try again later";
break;
case"UNPROCESSABLE_CONTENT":
statusCode=422;
errorMessage=
"The server was unable to process the request because the request payload is semantically incorrect or because the request is syntactically incorrect";
break;
case"PARSE_ERROR":
statusCode=400;
errorMessage="The request could not be parsed due to invalid syntax.";
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.