* fix: exclude third-party video apps from areCalendarEventsEnabled setting When areCalendarEventsEnabled is false, video meeting creation for third-party video apps (like Daily.co) was being skipped, causing the meetingUrl field in webhook payloads to contain the location identifier (integrations:daily) instead of the actual video meeting URL. This fix adds a skipCalendarEvent option to EventManager.create() that: - Skips calendar event creation when true - Skips CRM event creation when true (CRM events are tied to calendar events) - Still creates video meetings for third-party video apps The calling code in handleConfirmation.ts and RegularBookingService.ts now uses this option when areCalendarEventsEnabled is false, ensuring video meetings are still created while respecting the platform customer's preference to manage their own calendar events. Co-Authored-By: morgan@cal.com <morgan@cal.com> * test: update E2E tests to verify skipCalendarEvent option is passed when areCalendarEventsEnabled is false Co-Authored-By: morgan@cal.com <morgan@cal.com> * refactor: address PR review feedback - remove comments and update E2E tests to spy on createAllCalendarEvents Co-Authored-By: morgan@cal.com <morgan@cal.com> * test: add spy for createAllCRMEvents in e2e tests when areCalendarEventsEnabled is false Co-Authored-By: lauris@cal.com <lauris.skraucis@gmail.com> * test: add missing spy for createAllCRMEvents in beforeEach hook Co-Authored-By: morgan@cal.com <morgan@cal.com> * fix: use videoCallUrl from metadata for webhook payload location Co-Authored-By: lauris@cal.com <lauris.skraucis@gmail.com> * fix: simplify webhook location to use metadata?.videoCallUrl || evt.location Co-Authored-By: lauris@cal.com <lauris.skraucis@gmail.com> * docs: add description about video call link limitations when calendar events disabled Co-Authored-By: lauris@cal.com <lauris.skraucis@gmail.com> * i18n: add translation key for calendar events disabled video limitation Co-Authored-By: lauris@cal.com <lauris.skraucis@gmail.com> * fix: update translation text to accurately reflect video app behavior Co-Authored-By: lauris@cal.com <lauris.skraucis@gmail.com> * Update common.json --------- Co-authored-by: Devin AI <158243242+devin-ai-integration[bot]@users.noreply.github.com> Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com>
A progressive Node.js framework for building efficient and scalable server-side applications.
Description
Cal.com is using the Nest framework TypeScript starter repository.
Installation
$ yarn install
Prisma setup
$ yarn prisma generate
Env setup
Copy .env.example to .env and fill values.
Add license Key to Deployment table in DB
id, logo, theme, licenseKey, agreedLicenseAt:- 1, null, null, '00000000-0000-0000-0000-000000000000', '2023-05-15 21:39:47.611'
Replace with your actual license key.
your CALCOM_LICENSE_KEY env var need to contain the same value
.env CALCOM_LICENSE_KEY=00000000-0000-0000-0000-000000000000
Running the app
Development
$ yarn run start
OR if you don't want to use docker, you can run following command.
$ yarn dev:no-docker
Additionally you can run following command(in different terminal) to ensure that any change in any of the dependencies is rebuilt and detected. It watches platform-libraries, platform-constants, platform-enums, platform-utils, platform-types.
$ yarn run dev:build:watch
If you are making changes in packages/platform/libraries, you should run the following command too that would connect your local packages/platform/libraries to the api/v2
$ yarn local
watch mode
$ yarn run start:dev
production mode
$ yarn run start:prod
## Test
```bash
# unit tests
$ yarn run test
# e2e tests
$ yarn run test:e2e
# e2e tests in watch mode
$ yarn test:e2e:watch
# run specific e2e test file in watch mode
$ yarn test:e2e:watch --testPathPattern=filePath
# test coverage
$ yarn run test:cov
Conventions
Guards
- In case a guard would return "false" for "canActivate" instead throw ForbiddenException with an error message containing guard name and the error.
- In case a guard would return "false" for "canActivate" DO NOT cache the result in redis, because we don't want that someone is forbidden, updates whatever was the problem, and then has to wait for cache to expire. We only cache in redis guard results where "canAccess" is "true".
- If you use ApiAuthGuard but want that only specific auth method is allowed, for example, api key, then you also need to add
@ApiAuthGuardOnlyAllow(["API_KEY"])under the@UseGuards(ApiAuthGuard). Shortly, useApiAuthGuardOnlyAllowto specify which auth methods are allowed byApiAuthGuard. IfApiAuthGuardOnlyAllowis not used or nothing is passed to it or empty array it means that all auth methods are allowed.
Support
Nest is an MIT-licensed open source project. It can grow thanks to the sponsors and support by the amazing backers. If you'd like to join them, please read more here.
Stay in touch
- Author - Kamil Myśliwiec
- Website - https://nestjs.com
- Twitter - @nestframework
License
Nest is MIT licensed.