+25









Morgan
GitHub
Erik
Morgan Vernay
Lauris Skraucis
Peer Richelsen
Udit Takkar
Dmytro Hryshyn
DmytroHryshyn
zomars
Udit Takkar
sean-brydon
Crowdin Bot
Pratik Kumar
Samyabrata Maji
Manpreet Singh
Benny Joo
Varun Prahlad Balani
Mike Zhou
Haran Rajkumar
Harshith Pabbati
Brendan Woodward
Ryukemeister
Keith Williams
Alex van Andel
Joe Au-Yeung
gitstart-calcom
GitStart-Cal.com
gitstart-calcom
Lauris
Amit Sharma
Hariom Balhara
gitstart-app[bot] <57568882+gitstart-app[bot]@users.noreply.github.com>
Anant Jain
supalarry
0a15483c46
* add connect to cal atom * add connect to cal to atoms package index * shadcn setup * update packages * button component from shadcn * dumb button component * replace button with dumb button component * update commenst and change url param * chore: setting up monorepo packages for platforms (#12572) * chore: init platform folders strucutre and api proxy * fixup! chore: init platform folders strucutre and api proxy * chore: init database oAuth platform client schema * fixup! chore: init database oAuth platform client schema * fix config path after move to folder /v1 * feat: scaffold v2 API (#12554) * init nest project * add kysely as a separate package * add ee folder with license * prettier: format v2 api same as mono repo * migrate over Eriks nestjs poc * schema generation script * ee license file * nest poc eslint file * remove prisma-kysely from v2 api * prepare for mergin platform: remove prisma-kysely because incorrect checksum * add prisma-kysely to packages/prisma * move to apps/api/v2 * rename v2 package * readme update * Update apps/api/v2/env.example * env typo * env typo --------- Co-authored-by: Erik <erik@erosemberg.com> Co-authored-by: Morgan Vernay <morgan@cal.com> * chore: init platform packages (#12603) * chore: init platform packages * fixup! chore: init platform packages * fixup! fixup! chore: init platform packages * fix: type in package.json * fixup! fixup! fixup! chore: init platform packages * fixup! fixup! fixup! fixup! chore: init platform packages * fixup! fixup! fixup! fixup! fixup! chore: init platform packages * fixup! fixup! fixup! fixup! fixup! fixup! chore: init platform packages --------- Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com> * chore: platform more permissions utils and tests (#12613) * chore: more permisions utils and tests * chore: tests * feat: validate `CalProvider` api keys (#12672) * fix: signup nit (#12585) * Disable submit on empty form * Fix submit --------- Co-authored-by: Peer Richelsen <peeroke@gmail.com> * New Crowdin translations by Github Action * fix: Signup options are not disabled (#12610) * fix: Signup options are not disabled * fixes/signup disabling suggested changes done * chore: signup and login improvements --------- Co-authored-by: Udit Takkar <udit222001@gmail.com> * fix: typo in @calcom/emails readme (#12615) * fix: handle reschedule request for dynamic meetings (#12275) * chore: [app-router-migration-1] migrate the pages in `settings/admin` to the app directory (#12561) Co-authored-by: Dmytro Hryshyn <dev.dmytroh@gmail.com> Co-authored-by: DmytroHryshyn <125881252+DmytroHryshyn@users.noreply.github.com> Co-authored-by: zomars <zomars@me.com> * chore: added cursor-pointer to img upload (#12624) * added cursor-pointer to img upload * nit * feat: add clear filters option in bookings page (#12629) * add clear filters option * fix vscode settings.json * use removeAllQueryParams() * fix yarn lock * remove toggleoption * feat: display long durations in hours on booking (#12631) Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> * New Crowdin translations by Github Action * fix: workaround for future app dir routes * feat: Allow only first slot to be booked (#12636) Co-authored-by: Morgan Vernay <morgan@cal.com> * New Crowdin translations by Github Action * feat: add matomo analytics app (#12646) * chore: Sentry Wrapper with Performance and Error Tracing (#12642) * add wrapper for sentry and update functions in 'getUserAvailability'. Update tracesSampleRate to 1.0 * Make Sentry Wrapper utilize parent transaction, if it exists. * Update wrapper for functions to inherit parameters from the child function * add comment of when to use the wrapper * check for sentry before wrapping, if not call unwrapped function * refactored wrapper to have async and sync separate functions that utilize helpers for common behaviour * update type of args to unknown * fixed types of returns from wrapped functions --------- Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> * validate api keys to set error and key states for api keys * organize error messages into one place * set error messages from errors file instead of hardcoding value * fix incorrect constant name --------- Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: Pratik Kumar <70286186+Pratik-Kumar-621@users.noreply.github.com> Co-authored-by: Udit Takkar <udit222001@gmail.com> Co-authored-by: Samyabrata Maji <116789799+samyabrata-maji@users.noreply.github.com> Co-authored-by: Manpreet Singh <manpoffc@gmail.com> Co-authored-by: Benny Joo <sldisek783@gmail.com> Co-authored-by: Dmytro Hryshyn <dev.dmytroh@gmail.com> Co-authored-by: DmytroHryshyn <125881252+DmytroHryshyn@users.noreply.github.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Varun Prahlad Balani <varunprahladbalani@gmail.com> Co-authored-by: Mike Zhou <mikezhoudev@gmail.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Haran Rajkumar <haranrajkumar97@gmail.com> Co-authored-by: Morgan Vernay <morgan@cal.com> Co-authored-by: Harshith Pabbati <pabbatiharshith@gmail.com> Co-authored-by: Brendan Woodward <73412688+bwoody13@users.noreply.github.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> * fix: storybook atom import * feat: oauth clients management (#12604) * feat: oAuth create and update dtos * feat: WIP oAuth repository * feat: oAuth controller and module * refactor: rename cal oAuth to simply oauth * fix: controller update client * add oAuth client module to endpoints module * refactor: OAuthClientRepository * refactor * status codes for controller * oauth create return * fix: oAuth client only for v2 API * remove repository as provider from its module * fix: oAuth module, have repository in providers * fix: make endpoints run * comment out oauth prisma schema code: coming next * refactor: remove api-key authguard (#12675) * chore: Prisma exception filters (#12679) * fix: get prisma schema from package @calcom/prisma (#12692) * fix: get prisma schema from package @calcom/prisma * fixup! fix: get prisma schema from package @calcom/prisma * fixup! fixup! fix: get prisma schema from package @calcom/prisma * fix: prettier config * fixup! fix: prettier config * chore: create authenticated user guard (#12677) * chore: wip next-auth-guard for apiv2 * refactor: use NextAuthGuard on all OAuthClientController routes * refactor: use passport to get next user * exclude password from prisma read service * Revert "exclude password from prisma read service" This reverts commit 24b1f8ed59f6d99f0ecc589c691efb0ac1f2ac3b. * fix: userRepo sanitize password * refactor: function order in UserRepository * implement user repository service * refactor: strict null checks for TS * refactor: fix strict null checks * delete res locals type * refactor: switch from zod to class-validator for oAuth client * refactor: switch from zod to class-validator for booking * refactor: rename dtos folder to input folder * fix: create migration for prisma schema oauth clients table * feature: post oAuth client * refactor: rename oAuth client_secret to secret * stricter ts config + oauth secret * remove migrations * fix: improve response type * improve error code types * fix: prettier by removing eslint as its not needed * refactor: eslint fix files * wip organization oauth_lcient * fix import types * fix team schema platformOAuthClient name * fix: import packages transpiled * feat: roles guard * refactor: use organisationId instead of userId * fix: jwt secret signing not having jwt_secret * fix: stop importing input DTOs as types * fix: jwt sign expecting plain object * add sentry, routes logger, generic response type * fix test config * fixup! fix test config * refactor: dont await async function return * feat: fallback value for getEnv * feat: add helmet for security * feat: organization guard * refactor: check if user set in RolesGuard * refactor: remove roles requirement for oauth read * chore: add exceptions filters * fix: api key strategy throws errors * chore: set e2e tests * chore: centralize api type in package * feat: user repository relations * feat: user repository relations * Revert "feat: user repository relations" This reverts commit 1802b256b5a6e5c9b6a62138c8cb1b6f75ed401b. * Revert "feat: user repository relations" This reverts commit 4a8f52583d95ff15b6254694c976d8ec9ce0e546. * test: mock next auth * fixup! test: mock next auth * test:oAuth authed user but no org * refactor: remove unused type * refactor: organisation guard based on Membership table * refactor: folder and file structure * fix: small changes exception filters * refactor: merge organization and roles guards into one guard * fix: remove old export * fix: org roles guard --------- Co-authored-by: supalarry <lauris.skraucis@gmail.com> * chore: OAuth clients tests and fixes (#12762) * chore: add tests and fixes * fixup! chore: add tests and fixes * fixup! fixup! chore: add tests and fixes * fixup! fixup! fixup! chore: add tests and fixes * fixup! fixup! fixup! fixup! chore: add tests and fixes * fixup! fixup! fixup! fixup! fixup! chore: add tests and fixes * fixup! fixup! fixup! fixup! fixup! fixup! chore: add tests and fixes * fix: remove unused imports * chore: move repos to feature folder (#12769) * chore: rename repositories * fix yarn.lock * feat: oauth client guard (#12814) * feat: oAuth client guard * refactor test * refactor: move oauth-client guard to oauth module * refactor: separate jest config from package.json * fix: resolving paths in jest tests * fix: tests * jest setup file * fix: jest test warnings about .js platform constants imports * refactor: test repository fixtures * remove allowjs * ignore js files in ts-jest * make oauth client module global * make oauth client module global * feat: platform oAuth clients frontend (#12867) * add oauth client to settings * fix imports * add react and axios * oauth client form and card components * hooks for oauth clients data * index page for oauth clients * oauth client list component * oauth client form page * shift atoms into platform * init platform folder * refactor handleSubmit functioin * platform * platform * platform parts * revert tsconfig constant platform * fix: useOauthClients * feat: create oauth client with api * fix: add prettier to platform type package * fixup! fix: add prettier to platform type package * chore: class-validator types in platform package * add types for delete oauth client iput * add onSuccess and onError methods * update oauth client card view with client id and secret * cleanup comments * split oauth persisit hook into create and delete hooks * fix: oauth client creation / deletion / listing * fixup! fix: oauth client creation / deletion / listing * fix: comment logo for now * fix: layout setting org keys * cleanup comments * minor style fixes, add logic for client permissions * show toast after deleting client * not passing clint logo at the moment --------- Co-authored-by: Morgan Vernay <morgan@cal.com> * chore(platform): OAuth Flow (#12798) * fixup! chore(platform): OAuth Flow (#12798) * feat: CRUD for oAuth users (#12853) * user controller with oauth guard * crud repository and controller operations * add user controller to user module * refactor: oauth guard * connect user with oauth client upon creation * fix: test * wip: e2e test * refactor: findUniqueOrThrow -> findUnique user * test: POST user request * feat: permissions guard * e2e tests * e2e * e2e refactor * e2e refactor * reflector decorator check refactor * refactor oauth guard * remov unused imports * log message * delete permissions decorator and guard * remove delete user endpoint * remove delete user endpoint * refactor: route structure * remove get oauth client decorator * delete unecessary e2e config changes * remove set header in post test * fix: oauth guard test on empty db * revert: add previously removed constant to fulfill merge platform * fix: import to satisfy platform branch merge * use real implementation of access token guard * generate access & refresh tokens and fix e2e * fix: oauth client e2e test * refactor: variable naming * refactor * rename test file * remove oauth client from request * refactor: v2 API (#12913) * Use Boolean only instead of git add src/modules/auth/guard/organization-roles/organization-roles.guard.ts * move tests next to files they test * replace .. in import paths with absolute path * camelCase instead of snake_case for access and refresh token variables * user sanitize function Typescript friendly * restructure oAuth clients folder: example for other folders * restructure bookings module * organize modules in auth, endpoints, repositories, services * organize auth module * organize repositories * organize inputs * rename OAuthClientGuard to OAuthClientCredentialsGuard * add error messages * add error messages * clientId as param in oauth-flow & schema mapping * camelCase instead of snake_case for clientId and clientSecret * access token guard as passport strategy * folder structure as features * get rid of index files * feat: endpoint for deleting oAuth users & oAuth users returned data (#12912) * feat: delete oAuth users * check if access token matches userId in parameter * driveby: return only user id and email in oauth users endpoints * refactor: access token errors (#12932) * change error messages * error message if access token does not exist in our database * token expired 498 * access token expired message as constant * store 498 status code as const * fix: access token error less information given * chore: invalid access token const --------- Co-authored-by: Morgan Vernay <morgan@cal.com> * feat: external gcal (#12954) * wip connect gcal * feat: add external google calendar * fixup! feat: add external google calendar * fix: google calendar oauth check invalid * google cal check tests * use zod * fix: await validate access token service * chore: e2e tests for oAuth flow (#13005) * fix: accessing length of undefined * refactor: GetUser throw error if no user provided * fix: cascade delete PlatformAuthorizationToken if owner or client deleted * test: POST /authorize * refactor oauth-flow controller * refactor oauth-flow controller * new function to get authorization token by client user ids * refactor token service * fix: re-created access and refresh tokens having not unique secret * oauth flow tests * oauth flow tests * feat: abstracted jwt service (#13016) * remove unused JwtModule from the auth module * feat: create abstracted jwt service * refactor: tokens module and service use new jwt service * refactor: oauth-client module and repository use new jwt service * implement Morgans requests * Basic atoms in barebone example platform apps (#13006) * example app * example app * dev move * fix: more entry points * fixup! fix: more entry points * refactor: v2 API (#12913) * Use Boolean only instead of git add src/modules/auth/guard/organization-roles/organization-roles.guard.ts * move tests next to files they test * replace .. in import paths with absolute path * camelCase instead of snake_case for access and refresh token variables * user sanitize function Typescript friendly * restructure oAuth clients folder: example for other folders * restructure bookings module * organize modules in auth, endpoints, repositories, services * organize auth module * organize repositories * organize inputs * rename OAuthClientGuard to OAuthClientCredentialsGuard * add error messages * add error messages * clientId as param in oauth-flow & schema mapping * camelCase instead of snake_case for clientId and clientSecret * access token guard as passport strategy * folder structure as features * get rid of index files * feat: endpoint for deleting oAuth users & oAuth users returned data (#12912) * feat: delete oAuth users * check if access token matches userId in parameter * driveby: return only user id and email in oauth users endpoints * Connect CalProvider and GCal * Connect CalProvider and GCal * return response interceptor to handle failed requests * handle failed requests using axios intercepter * cal provider refresh tokens, external gcal * external gcal * cal provider refresh and retries * remove console.log * refactor * ignore built atoms css * remove change to token repo * refactor * refactor * downdgrade vite of unrelated packages * move gcal endpoints to platform * gcal service * refactor: use atoms provider --------- Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com> Co-authored-by: Ryukemeister <sahalrajiv-extc@atharvacoe.ac.in> * feat: user schedule management (#13053) * platform-constants package: list of accepted schedule timezones * feat: schedules endpoint to create schedule with default availability * refactor: rename function * refactor: store userId for availabilities * feat: createSchedule endpoint * feat: get schedules/default * feat: getSchedule by id * feat: get all schedules * feat: delete schedule * feat: update schedule * check user owns schedule * empty test * define returned data on controller level not repository * define returned data on controller level not repository * Revert "define returned data on controller level not repository" This reverts commit 4c292a0f0762f58bdcad0707ad8eef7408390800. * use luxton * put availabilities out of ee * use guard on controller level * refactor * e2e test schedule creation * remove log * test * default schedule get test * update schedule test * delete schedule test * fix update test * different email for schedules e2e * driveby: fix yarn test * schedule inputs availabilities as array * re-use BaseStrategy class * feat: me endpoint v2 api (#13274) * feat: me endpoint v2 api * simplify * chore: NestJS throttling (#13011) * fix: v2 throttling setup (#13402) * fix: v2 throttling * fix: setup redis locally * move sentry files to api v1 * chore: calcom platform libraries (#13444) * fixup! chore: calcom platform libraries (#13444) * fix: fix managed users * feat: user timezone management in `CalProvider` (#13361) * hooks to fetch and update user timezone * add react query package * add logic to check for change in user timezone and update it * hook to handle timezone changes * shift timezone handling logic into separate custom hook * rename variables * rename hook to get a user * call useTimezone hook inside of cal provider * minor refactors * add variables for api endpoints * use URL constructor for creating endpoints * key prop not needed * use URL constructor for creating endpoints * chore: package json scripts * fix(atoms): fix import path of useUpdateUserTimezone * fix(atoms): build constants and fix ENDPOINTS const * feat: v2 api event type endpoints (#13449) * build platform-libraries * make getEventTypeById compatible with default PrismaClient * feat: fetch event type endpoint * handle event type not found * e2e test for GET * test * determine is user org admin for getEventTypeId correctly * prisma type like before * add negative test * POST event-type and return event-type for api and atom * POST event-type and return event-type for api and atom * feat: create default user event types when creating managed user * feat: v2 api me PUT endpoint (#13486) * add timeZone to me endpoint * feat: me endpoint PUT * reset package.json * standardize creation and updating of user * user creation: capitalize timezones and week start * default event type constants in const file * refactor: defaultTimezone Europe/London in response schema * refactor: validators * refactor: default schedule in schedules endpoints * refactor: patch instead of put * fix: getEventTypeById organizationId (#13554) * chore: transpile more libraries functions * feat: overlay calendar busy dates events (#13581) * feat: overlay calendar busy times events * fixup! feat: overlay calendar busy times events * fixup! fixup! feat: overlay calendar busy times events * fixup! fixup! fixup! feat: overlay calendar busy times events * refactor: schedules for atom (#13585) * schedules get.handler transformers as util functions * export schedule transformers from platform-libraries package * schedules for atom * refactor: schedules response service format response * remove unused injected dependency * fix: prevent duplicate calendar account linking (#13310) * fix: prevent signing up multiple times from same account * revert: lark calendar changes * credential clean up if duplicate * fix code duplication and check before credential creation * feat: useRouterQuery allow unset queryParam * feat: showToast on account duplication attempt * Small tweak to copy * Updated other calendars not to use checkDuplicateCalendar * Add account already linked to apps/installed/calendar --------- Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> * Revert event-type profile based querying (#13588) * test: Bookings: Add more automated tests for organization (#13576) * Avoid selecting unused props * Add automated tests * Add existing user invite and booking --------- Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> * fix: organization user shouldn't be asked for payment for a premium username (#13535) Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> * chore: refactor handle new reccuring booking (#13597) * chore: refactor handle new reccuring booking * fixup! chore: refactor handle new reccuring booking * fixup! fixup! chore: refactor handle new reccuring booking * test: Create unit tests for the questions (teste2e-multiSelectQuestion) (#11569) * Remove unnecessary changes * add changes * Requested changes * Requested changes * FIx failing tests * FIx failing tests * Update regularBookings.ts * FIx failing tests * Refactor * add unit tests for all questions --------- Co-authored-by: gitstart-calcom <gitstart-calcom@users.noreply.github.com> Co-authored-by: GitStart-Cal.com <121884634+gitstart-calcom@users.noreply.github.com> Co-authored-by: gitstart-calcom <gitstart@users.noreply.github.com> Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> * fix: update valid_for_secs (#13604) * fix: Fixes teams UI load issue (#13593) * fixes teams uiload issue * revert: yarn.lock --------- Co-authored-by: Udit Takkar <udit222001@gmail.com> * chore: upgrades boxyhq jackson (#13477) * chore: upgrades boxyhq jackson * Update jackson.ts reduces bundle size * Update yarn.lock * Update apps/web/next.config.js * Upgrades again --------- Co-authored-by: Keith Williams <keithwillcode@gmail.com> * upgrades copycat * feat: PLA-47 Reserve Slots Handler (#13607) * PLA-44 feat: Platform getPublicEvent (#13596) * chore: getPublicEvent * chore: fix * feat: booker atom bookings platform endpoints (#13613) * feat: handle new booking * wip * feat: handle recurring and instant booking * fixup! feat: handle recurring and instant booking --------- Co-authored-by: Peer Richelsen <peeroke@gmail.com> * fix: v2 not running (#13636) * fix: import from platform-libraries instead of lib * fix: typescript error * fix: provide EventTypesRepository to SlotsService * fix: small change * Merge branch 'main' into platform * fix: make v2 run after user model changes (#13653) * feat: event type atom user connected and destination calendars endpoint (#13559) * extract connected calendars logic in re-usable platform-libraries function * extract connected calendars logic in re-usable platform-libraries function * extract connected calendars logic in re-usable platform-libraries function * calendars endpoints * enable calendars endpoint * calendars type form platform-libraries instead of lib * finish merging platform branch * fix dbWrite * fix: issue after merge platform * fix: new abstracted function export * change ee/overlay-calendars to ee/calendars endpoint * refactor: merge overlay service with calendars service * ts fix * body -> query * chore: Platform get schedule (#13696) * chore: get available slots * chore: infer event type isTeam * chore: nit * chore: Delete selected slot (#13692) Co-authored-by: Morgan Vernay <morgan@cal.com> * feat: v2 endpoint for availability atom timezones (#13687) * refactor: move cityTimezones handler to lib * test: incorrect timezone when creating oauth user * refactor: standardize time zone validation * feat: schedules/time-zones endpoint returning possible time zones * refactor: @IsValidTimezone load allowed timezones dynamically * chore: split timezones to its own trpc router --------- Co-authored-by: Morgan Vernay <morgan@cal.com> * fix after merge main * feat: platform useGetPublicEvent (#13752) * feat: platform useGetPublicEvent * chore: move public event type to libraries * chore: use const for query key * fixup CalendarBusyTimesInput optional params * feat: platform use get available slots (#13756) * feat: platform use get available slots * fixup! feat: platform use get available slots * feat: platform use get connected calendars (#13757) * chore: platform enable cors (#13774) * chore: enable cors * fixup! chore: enable cors * feat: platform use get calendars busy times (#13759) * fixup! feat: platform use get calendars busy times (#13759) * feat: platform use slots hooks (#13785) * feat: platform use slots hooks * fixup! feat: platform use slots hooks * fixup! fixup! feat: platform use slots hooks * fixup! fixup! fixup! feat: platform use slots hooks * fixup! fixup! fixup! fixup! feat: platform use slots hooks * fixup! feat: platform use slots hooks (#13785) * feat: platform use create boookings hooks (#13797) * feat: `Availability Settings` atom (#13762) * styling and updating the examples app * add custom hooks for availability settings atom * update default exports * minor updates * update cal provider to use react query * availability settings atom * dialog from shadcn * navbar for examples app * add select skeleton loader in calcom ui packages * refactors * define rtl for cal provider * fox trpc call to avoid merge conflicts * fix issues caused by merges * revert changes for rtl * hook to fetch every city timezones * implement useGetCityTimezones into timezone component * minor fix * update hooks * add props and intergrate into avaialibility component * add missing await * remove logs * add comments * invalidate queries after settled * toaster from shadcn * add toaster into cal provider * implement toast on event handlers * add classnames prop to accept custom styles * passing custom styles * update packages * remove comments * fix: styling * fix: useUpdateSchedule * fixup! fix: useUpdateSchedule * wip * feat: availability setting atom * fixup! feat: availability setting atom * fixup! fixup! feat: availability setting atom * fixup! fixup! fixup! feat: availability setting atom * fixup! fixup! fixup! fixup! feat: availability setting atom --------- Co-authored-by: Morgan Vernay <morgan@cal.com> * fix: atoms import * chore: lock * fix: types * fixup! fix: types * refactor: v2 user timezones (#13944) * fix: OAuth client form improvements (#13837) * rename app to apps * fix type errors, validate redirect url and other fixes * enable user to add multiple redirect uris * add id to input to make labels clickable * translations for oauth form * improve styles, add translations and add select all button for permissions * add permissions for profile read and write * fixes * nit * use `useFieldArray` for dynamic fields --------- Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> * refactor: check organizationId primarily on user profile (#13969) * refactor: attach movedToProfile to user * refactor: check organizationId primarily on user profile * fix: resolve TS errors to build v2 for prod (#13858) * feat: atoms typescript build (#13864) * fix: atoms typescript build * refactor: dayjs * refactor: meticulous * refactor: use vite for type generation * tsconfig * feat: given user timezone update update default schedule timezone (#13981) * refactor: standardize schedules api response * fix: schedules e2e tests * refactor: use IsTimeZone class-validator instead of custom built one * feat: validate managed user timezone * feat: update default schedule when me schedule updated * refactor: standardize v2 api returned data (#13984) * feat: V2 api swagger (#13804) * feat: v2 API swagger docs * fix: query param not showing up in docs * latest swagger.json * refactor: remove scaffolded sample endpoint * separate internal endpoints * oauth-clients and oauth flow docs only in dev * oauth-clients and oauth flow docs only in dev * create oauth client response doc * responses for oauth-clients * document development only endpoints * chore: consume auth token on exchange (#13993) * feat: docker build for v2 (#13918) * fix: resolve TS errors to build v2 for prod * WIP: api v2 docker * arg env dockerfile * wip * Revert "wip" This reverts commit 232adf5b969ef004ae907f3e85b12c2715d9b6bc. * wip * wip * fix docker * fix docker * fix docker * docker * docker * expose port 80 * feat: oauth client permissions guard (#14020) * feat: Permissions guard * feat: Permissions guard * tests * feat: use permissions guard for event types * extra permissions test * fix tests * bokings, gcal, me and schedules permissions * chore: use availability settings atom and fix useTimezone platform hook (#13934) * replace availabiilty settings with atom component * add more props for custom styles * replace intl with dayjs * review feedback fixes * fix: v2 api typescript errors (#14059) * fix: start:prod script * fix: v2 me module dependencies (#14073) * feat: check v2 request origin (#14074) * feat: check v2 request origin * drive by: remove console log in test --------- Co-authored-by: Lauris <lauris@Lauriss-Laptop.local> * fix date overrides typing issues (#14091) Co-authored-by: Morgan <33722304+ThyMinimalDev@users.noreply.github.com> * fix: v2 e2e tests (#14088) * fix: v2 e2e tests * fix: yarn e2e tests run 1 after another * fix gcal test --------- Co-authored-by: Lauris <lauris@Lauriss-Laptop.local> * fix: availability atom and access token origin strategy * fix: availability atom get error from unknown * feat: booker atom platform wrapper (#14036) * feat: booker atom, fix hooks * wip * feat: booker atom platform wrapper * fix conflicts * fix: build v2 internal dependencies upon v2 build * fix typing of useDeleteOAuth * fix: isplatform timezone select improt booker event meta * fixup! Merge branch 'platform' into feat-booker-atom-platform * refactor * add video call event types * disable email and set managed user names --------- Co-authored-by: supalarry <lauris.skraucis@gmail.com> * update yarn.lock * Update .prettierignore * update post install * fix: post install * fix yarn lock * fix: post install * fix: types * feat: enable user control over timezone changes and helpers for query params (#14049) * helpers to get and set value of a query paramater * add event handlers and props to figure out the timezone preference of a user * make onTimeZoneChange handler optional * fixup * fix merge conflicts * fixup * revert changes * fixup * fixup --------- Co-authored-by: Alex van Andel <me@alexvanandel.com> * fix: usetimezone import * fix: prisma client import * fix: prisma client import * fix: prisma client import * remove post install using vite * ts fix attempt: pin prisma to same version * Revert "ts fix attempt: pin prisma to same version" This reverts commit 2c309f52e3a881e2dbda4185f45e77967bef6925. * resolve v2 prisma to calcom prisma * sync v2 and typescript deps * sync atoms package * lock file updat * fix: platform web components move out of pages folder * ui: allow experimental decorators to fix ts ci error * app-store: allow experimental decorators to fix ts ci error * web: allow experimental decorators to fix ts ci error * fix: github actions v2 api secrets * add license * mock useIsPlatform for tests * fix timezone select tests * mock useLocale * fix tests * fix tests * fix tests * fix github actions * chore: temporarily disable redis (#14142) * fix: only one migration file for platform * fix api v1 files location * fix: disable apiv2 test in ci --------- Co-authored-by: Ryukemeister <sahalrajiv-extc@atharvacoe.ac.in> Co-authored-by: Lauris Skraucis <lauris.skraucis@gmail.com> Co-authored-by: Erik <erik@erosemberg.com> Co-authored-by: sean-brydon <55134778+sean-brydon@users.noreply.github.com> Co-authored-by: Peer Richelsen <peeroke@gmail.com> Co-authored-by: Crowdin Bot <support+bot@crowdin.com> Co-authored-by: Pratik Kumar <70286186+Pratik-Kumar-621@users.noreply.github.com> Co-authored-by: Udit Takkar <udit222001@gmail.com> Co-authored-by: Samyabrata Maji <116789799+samyabrata-maji@users.noreply.github.com> Co-authored-by: Manpreet Singh <manpoffc@gmail.com> Co-authored-by: Benny Joo <sldisek783@gmail.com> Co-authored-by: Dmytro Hryshyn <dev.dmytroh@gmail.com> Co-authored-by: DmytroHryshyn <125881252+DmytroHryshyn@users.noreply.github.com> Co-authored-by: zomars <zomars@me.com> Co-authored-by: Varun Prahlad Balani <varunprahladbalani@gmail.com> Co-authored-by: Mike Zhou <mikezhoudev@gmail.com> Co-authored-by: Udit Takkar <53316345+Udit-takkar@users.noreply.github.com> Co-authored-by: Haran Rajkumar <haranrajkumar97@gmail.com> Co-authored-by: Harshith Pabbati <pabbatiharshith@gmail.com> Co-authored-by: Brendan Woodward <73412688+bwoody13@users.noreply.github.com> Co-authored-by: Amit Sharma <74371312+Amit91848@users.noreply.github.com> Co-authored-by: Keith Williams <keithwillcode@gmail.com> Co-authored-by: Alex van Andel <me@alexvanandel.com> Co-authored-by: Hariom Balhara <hariombalhara@gmail.com> Co-authored-by: Joe Au-Yeung <65426560+joeauyeung@users.noreply.github.com> Co-authored-by: gitstart-app[bot] <57568882+gitstart-app[bot]@users.noreply.github.com> Co-authored-by: gitstart-calcom <gitstart-calcom@users.noreply.github.com> Co-authored-by: GitStart-Cal.com <121884634+gitstart-calcom@users.noreply.github.com> Co-authored-by: gitstart-calcom <gitstart@users.noreply.github.com> Co-authored-by: Anant Jain <75206987+anantJjain@users.noreply.github.com> Co-authored-by: Lauris <lauris@Lauriss-Laptop.local> Co-authored-by: supalarry <laurisskraucis@gmail.com>
1268 lines
41 KiB
Plaintext
1268 lines
41 KiB
Plaintext
// This is your Prisma schema file,
|
|
// learn more about it in the docs: https://pris.ly/d/prisma-schema
|
|
|
|
datasource db {
|
|
provider = "postgresql"
|
|
url = env("DATABASE_URL")
|
|
directUrl = env("DATABASE_DIRECT_URL")
|
|
}
|
|
|
|
generator client {
|
|
provider = "prisma-client-js"
|
|
previewFeatures = ["views"]
|
|
}
|
|
|
|
generator zod {
|
|
provider = "zod-prisma"
|
|
output = "./zod"
|
|
imports = "./zod-utils"
|
|
relationModel = "default"
|
|
}
|
|
|
|
generator kysely {
|
|
provider = "prisma-kysely"
|
|
output = "../kysely"
|
|
fileName = "types.ts"
|
|
}
|
|
|
|
generator enums {
|
|
provider = "ts-node --transpile-only ./enum-generator"
|
|
}
|
|
|
|
enum SchedulingType {
|
|
ROUND_ROBIN @map("roundRobin")
|
|
COLLECTIVE @map("collective")
|
|
MANAGED @map("managed")
|
|
}
|
|
|
|
enum PeriodType {
|
|
UNLIMITED @map("unlimited")
|
|
ROLLING @map("rolling")
|
|
RANGE @map("range")
|
|
}
|
|
|
|
model Host {
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int
|
|
eventType EventType @relation(fields: [eventTypeId], references: [id], onDelete: Cascade)
|
|
eventTypeId Int
|
|
isFixed Boolean @default(false)
|
|
priority Int?
|
|
|
|
@@id([userId, eventTypeId])
|
|
@@index([userId])
|
|
@@index([eventTypeId])
|
|
}
|
|
|
|
model EventType {
|
|
id Int @id @default(autoincrement())
|
|
/// @zod.min(1)
|
|
title String
|
|
/// @zod.custom(imports.eventTypeSlug)
|
|
slug String
|
|
description String?
|
|
position Int @default(0)
|
|
/// @zod.custom(imports.eventTypeLocations)
|
|
locations Json?
|
|
/// @zod.min(1)
|
|
length Int
|
|
offsetStart Int @default(0)
|
|
hidden Boolean @default(false)
|
|
hosts Host[]
|
|
users User[] @relation("user_eventtype")
|
|
owner User? @relation("owner", fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int?
|
|
|
|
profileId Int?
|
|
profile Profile? @relation(fields: [profileId], references: [id], onDelete: Cascade)
|
|
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
teamId Int?
|
|
hashedLink HashedLink?
|
|
bookings Booking[]
|
|
availability Availability[]
|
|
webhooks Webhook[]
|
|
destinationCalendar DestinationCalendar?
|
|
eventName String?
|
|
customInputs EventTypeCustomInput[]
|
|
parentId Int?
|
|
parent EventType? @relation("managed_eventtype", fields: [parentId], references: [id], onDelete: Cascade)
|
|
children EventType[] @relation("managed_eventtype")
|
|
/// @zod.custom(imports.eventTypeBookingFields)
|
|
bookingFields Json?
|
|
timeZone String?
|
|
periodType PeriodType @default(UNLIMITED)
|
|
/// @zod.custom(imports.coerceToDate)
|
|
periodStartDate DateTime?
|
|
/// @zod.custom(imports.coerceToDate)
|
|
periodEndDate DateTime?
|
|
periodDays Int?
|
|
periodCountCalendarDays Boolean?
|
|
lockTimeZoneToggleOnBookingPage Boolean @default(false)
|
|
requiresConfirmation Boolean @default(false)
|
|
requiresBookerEmailVerification Boolean @default(false)
|
|
/// @zod.custom(imports.recurringEventType)
|
|
recurringEvent Json?
|
|
disableGuests Boolean @default(false)
|
|
hideCalendarNotes Boolean @default(false)
|
|
/// @zod.min(0)
|
|
minimumBookingNotice Int @default(120)
|
|
beforeEventBuffer Int @default(0)
|
|
afterEventBuffer Int @default(0)
|
|
seatsPerTimeSlot Int?
|
|
onlyShowFirstAvailableSlot Boolean @default(false)
|
|
seatsShowAttendees Boolean? @default(false)
|
|
seatsShowAvailabilityCount Boolean? @default(true)
|
|
schedulingType SchedulingType?
|
|
schedule Schedule? @relation(fields: [scheduleId], references: [id])
|
|
scheduleId Int?
|
|
// price is deprecated. It has now moved to metadata.apps.stripe.price. Plan to drop this column.
|
|
price Int @default(0)
|
|
// currency is deprecated. It has now moved to metadata.apps.stripe.currency. Plan to drop this column.
|
|
currency String @default("usd")
|
|
slotInterval Int?
|
|
/// @zod.custom(imports.EventTypeMetaDataSchema)
|
|
metadata Json?
|
|
/// @zod.custom(imports.successRedirectUrl)
|
|
successRedirectUrl String?
|
|
workflows WorkflowsOnEventTypes[]
|
|
/// @zod.custom(imports.intervalLimitsType)
|
|
bookingLimits Json?
|
|
/// @zod.custom(imports.intervalLimitsType)
|
|
durationLimits Json?
|
|
isInstantEvent Boolean @default(false)
|
|
assignAllTeamMembers Boolean @default(false)
|
|
useEventTypeDestinationCalendarEmail Boolean @default(false)
|
|
|
|
secondaryEmailId Int?
|
|
secondaryEmail SecondaryEmail? @relation(fields: [secondaryEmailId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([userId, slug])
|
|
@@unique([teamId, slug])
|
|
@@unique([userId, parentId])
|
|
@@index([userId])
|
|
@@index([teamId])
|
|
@@index([scheduleId])
|
|
@@index([secondaryEmailId])
|
|
}
|
|
|
|
model Credential {
|
|
id Int @id @default(autoincrement())
|
|
// @@type is deprecated
|
|
type String
|
|
key Json
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int?
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
teamId Int?
|
|
app App? @relation(fields: [appId], references: [slug], onDelete: Cascade)
|
|
// How to make it a required column?
|
|
appId String?
|
|
|
|
// paid apps
|
|
subscriptionId String?
|
|
paymentStatus String?
|
|
billingCycleStart Int?
|
|
|
|
destinationCalendars DestinationCalendar[]
|
|
selectedCalendars SelectedCalendar[]
|
|
invalid Boolean? @default(false)
|
|
CalendarCache CalendarCache[]
|
|
|
|
@@index([userId])
|
|
@@index([appId])
|
|
@@index([subscriptionId])
|
|
}
|
|
|
|
enum IdentityProvider {
|
|
CAL
|
|
GOOGLE
|
|
SAML
|
|
}
|
|
|
|
model DestinationCalendar {
|
|
id Int @id @default(autoincrement())
|
|
integration String
|
|
externalId String
|
|
/// @zod.email()
|
|
primaryEmail String?
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int? @unique
|
|
booking Booking[]
|
|
eventType EventType? @relation(fields: [eventTypeId], references: [id], onDelete: Cascade)
|
|
eventTypeId Int? @unique
|
|
credentialId Int?
|
|
credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([userId])
|
|
@@index([eventTypeId])
|
|
@@index([credentialId])
|
|
}
|
|
|
|
enum UserPermissionRole {
|
|
USER
|
|
ADMIN
|
|
}
|
|
|
|
// It holds the password of a User, separate from the User model to avoid leaking the password hash
|
|
model UserPassword {
|
|
hash String
|
|
userId Int @unique
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
// It holds Personal Profiles of a User plus it has email, password and other core things
|
|
model User {
|
|
id Int @id @default(autoincrement())
|
|
username String?
|
|
name String?
|
|
/// @zod.email()
|
|
email String
|
|
emailVerified DateTime?
|
|
password UserPassword?
|
|
bio String?
|
|
avatar String?
|
|
avatarUrl String?
|
|
timeZone String @default("Europe/London")
|
|
weekStart String @default("Sunday")
|
|
// DEPRECATED - TO BE REMOVED
|
|
startTime Int @default(0)
|
|
endTime Int @default(1440)
|
|
// </DEPRECATED>
|
|
bufferTime Int @default(0)
|
|
hideBranding Boolean @default(false)
|
|
// TODO: should be renamed since it only affects the booking page
|
|
theme String?
|
|
appTheme String?
|
|
createdDate DateTime @default(now()) @map(name: "created")
|
|
trialEndsAt DateTime?
|
|
eventTypes EventType[] @relation("user_eventtype")
|
|
credentials Credential[]
|
|
teams Membership[]
|
|
bookings Booking[]
|
|
schedules Schedule[]
|
|
defaultScheduleId Int?
|
|
selectedCalendars SelectedCalendar[]
|
|
completedOnboarding Boolean @default(false)
|
|
locale String?
|
|
timeFormat Int? @default(12)
|
|
twoFactorSecret String?
|
|
twoFactorEnabled Boolean @default(false)
|
|
backupCodes String?
|
|
identityProvider IdentityProvider @default(CAL)
|
|
identityProviderId String?
|
|
availability Availability[]
|
|
invitedTo Int?
|
|
webhooks Webhook[]
|
|
brandColor String?
|
|
darkBrandColor String?
|
|
// the location where the events will end up
|
|
destinationCalendar DestinationCalendar?
|
|
away Boolean @default(false)
|
|
// participate in dynamic group booking or not
|
|
allowDynamicBooking Boolean? @default(true)
|
|
|
|
// participate in SEO indexing or not
|
|
allowSEOIndexing Boolean? @default(true)
|
|
|
|
// receive monthly digest email for teams or not
|
|
receiveMonthlyDigestEmail Boolean? @default(true)
|
|
|
|
/// @zod.custom(imports.userMetadata)
|
|
metadata Json?
|
|
verified Boolean? @default(false)
|
|
role UserPermissionRole @default(USER)
|
|
disableImpersonation Boolean @default(false)
|
|
impersonatedUsers Impersonations[] @relation("impersonated_user")
|
|
impersonatedBy Impersonations[] @relation("impersonated_by_user")
|
|
apiKeys ApiKey[]
|
|
accounts Account[]
|
|
sessions Session[]
|
|
Feedback Feedback[]
|
|
ownedEventTypes EventType[] @relation("owner")
|
|
workflows Workflow[]
|
|
routingForms App_RoutingForms_Form[] @relation("routing-form")
|
|
verifiedNumbers VerifiedNumber[]
|
|
hosts Host[]
|
|
organizationId Int?
|
|
organization Team? @relation("scope", fields: [organizationId], references: [id], onDelete: SetNull)
|
|
accessCodes AccessCode[]
|
|
bookingRedirects OutOfOfficeEntry[]
|
|
bookingRedirectsTo OutOfOfficeEntry[] @relation(name: "toUser")
|
|
|
|
// Used to lock the user account
|
|
locked Boolean @default(false)
|
|
platformOAuthClients PlatformOAuthClient[]
|
|
AccessToken AccessToken[]
|
|
RefreshToken RefreshToken[]
|
|
PlatformAuthorizationToken PlatformAuthorizationToken[]
|
|
profiles Profile[]
|
|
movedToProfileId Int?
|
|
movedToProfile Profile? @relation("moved_to_profile", fields: [movedToProfileId], references: [id], onDelete: SetNull)
|
|
secondaryEmails SecondaryEmail[]
|
|
|
|
@@unique([email])
|
|
@@unique([email, username])
|
|
@@unique([username, organizationId])
|
|
@@unique([movedToProfileId])
|
|
@@index([username])
|
|
@@index([emailVerified])
|
|
@@index([identityProvider])
|
|
@@index([identityProviderId])
|
|
@@map(name: "users")
|
|
}
|
|
|
|
// It holds Organization Profiles as well as User Profiles for users that have been added to an organization
|
|
model Profile {
|
|
id Int @id @default(autoincrement())
|
|
// uid allows us to set an identifier chosen by us which is helpful in migration when we create the Profile from User directly.
|
|
uid String
|
|
userId Int
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
organizationId Int
|
|
organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
username String
|
|
eventTypes EventType[]
|
|
movedFromUser User? @relation("moved_to_profile")
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@unique([userId, organizationId])
|
|
@@index([uid])
|
|
@@index([userId])
|
|
@@index([organizationId])
|
|
}
|
|
|
|
model Team {
|
|
id Int @id @default(autoincrement())
|
|
/// @zod.min(1)
|
|
name String
|
|
/// @zod.min(1)
|
|
slug String?
|
|
logo String?
|
|
logoUrl String?
|
|
calVideoLogo String?
|
|
appLogo String?
|
|
appIconLogo String?
|
|
bio String?
|
|
hideBranding Boolean @default(false)
|
|
isPrivate Boolean @default(false)
|
|
hideBookATeamMember Boolean @default(false)
|
|
members Membership[]
|
|
eventTypes EventType[]
|
|
workflows Workflow[]
|
|
createdAt DateTime @default(now())
|
|
/// @zod.custom(imports.teamMetadataSchema)
|
|
metadata Json?
|
|
theme String?
|
|
brandColor String?
|
|
darkBrandColor String?
|
|
verifiedNumbers VerifiedNumber[]
|
|
bannerUrl String?
|
|
parentId Int?
|
|
parent Team? @relation("organization", fields: [parentId], references: [id], onDelete: Cascade)
|
|
children Team[] @relation("organization")
|
|
orgUsers User[] @relation("scope")
|
|
inviteTokens VerificationToken[]
|
|
webhooks Webhook[]
|
|
timeFormat Int?
|
|
timeZone String @default("Europe/London")
|
|
weekStart String @default("Sunday")
|
|
routingForms App_RoutingForms_Form[]
|
|
apiKeys ApiKey[]
|
|
credentials Credential[]
|
|
accessCodes AccessCode[]
|
|
isOrganization Boolean @default(false)
|
|
organizationSettings OrganizationSettings?
|
|
instantMeetingTokens InstantMeetingToken[]
|
|
orgProfiles Profile[]
|
|
pendingPayment Boolean @default(false)
|
|
dsyncTeamGroupMapping DSyncTeamGroupMapping[]
|
|
platformOAuthClient PlatformOAuthClient[]
|
|
|
|
@@unique([slug, parentId])
|
|
@@index([parentId])
|
|
}
|
|
|
|
model OrganizationSettings {
|
|
id Int @id @default(autoincrement())
|
|
organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
organizationId Int @unique
|
|
isOrganizationConfigured Boolean @default(false)
|
|
isOrganizationVerified Boolean @default(false)
|
|
orgAutoAcceptEmail String
|
|
lockEventTypeCreationForUsers Boolean @default(false)
|
|
dSyncData DSyncData?
|
|
}
|
|
|
|
enum MembershipRole {
|
|
MEMBER
|
|
ADMIN
|
|
OWNER
|
|
}
|
|
|
|
model Membership {
|
|
id Int @id @default(autoincrement())
|
|
teamId Int
|
|
userId Int
|
|
accepted Boolean @default(false)
|
|
role MembershipRole
|
|
team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
disableImpersonation Boolean @default(false)
|
|
|
|
@@unique([userId, teamId])
|
|
@@index([teamId])
|
|
@@index([userId])
|
|
}
|
|
|
|
model VerificationToken {
|
|
id Int @id @default(autoincrement())
|
|
identifier String
|
|
token String @unique
|
|
expires DateTime
|
|
expiresInDays Int?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
teamId Int?
|
|
team Team? @relation(fields: [teamId], references: [id])
|
|
secondaryEmailId Int?
|
|
secondaryEmail SecondaryEmail? @relation(fields: [secondaryEmailId], references: [id])
|
|
|
|
@@unique([identifier, token])
|
|
@@index([token])
|
|
@@index([teamId])
|
|
@@index([secondaryEmailId])
|
|
}
|
|
|
|
model InstantMeetingToken {
|
|
id Int @id @default(autoincrement())
|
|
token String @unique
|
|
expires DateTime
|
|
teamId Int
|
|
team Team @relation(fields: [teamId], references: [id])
|
|
bookingId Int? @unique
|
|
booking Booking? @relation(fields: [bookingId], references: [id], onDelete: Cascade)
|
|
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([token])
|
|
}
|
|
|
|
model BookingReference {
|
|
id Int @id @default(autoincrement())
|
|
/// @zod.min(1)
|
|
type String
|
|
/// @zod.min(1)
|
|
uid String
|
|
meetingId String?
|
|
thirdPartyRecurringEventId String?
|
|
meetingPassword String?
|
|
meetingUrl String?
|
|
booking Booking? @relation(fields: [bookingId], references: [id], onDelete: Cascade)
|
|
bookingId Int?
|
|
externalCalendarId String?
|
|
deleted Boolean?
|
|
credentialId Int?
|
|
|
|
@@index([bookingId])
|
|
@@index([credentialId])
|
|
@@index([type])
|
|
@@index([uid])
|
|
}
|
|
|
|
model Attendee {
|
|
id Int @id @default(autoincrement())
|
|
email String
|
|
name String
|
|
timeZone String
|
|
locale String? @default("en")
|
|
booking Booking? @relation(fields: [bookingId], references: [id], onDelete: Cascade)
|
|
bookingId Int?
|
|
bookingSeat BookingSeat?
|
|
|
|
@@index([email])
|
|
@@index([bookingId])
|
|
}
|
|
|
|
enum BookingStatus {
|
|
CANCELLED @map("cancelled")
|
|
ACCEPTED @map("accepted")
|
|
REJECTED @map("rejected")
|
|
PENDING @map("pending")
|
|
AWAITING_HOST @map("awaiting_host")
|
|
}
|
|
|
|
model Booking {
|
|
id Int @id @default(autoincrement())
|
|
uid String @unique
|
|
// (optional) UID based on slot start/end time & email against duplicates
|
|
idempotencyKey String? @unique
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int?
|
|
// User's email at the time of booking
|
|
/// @zod.email()
|
|
userPrimaryEmail String?
|
|
references BookingReference[]
|
|
eventType EventType? @relation(fields: [eventTypeId], references: [id])
|
|
eventTypeId Int?
|
|
title String
|
|
description String?
|
|
customInputs Json?
|
|
/// @zod.custom(imports.bookingResponses)
|
|
responses Json?
|
|
startTime DateTime
|
|
endTime DateTime
|
|
attendees Attendee[]
|
|
location String?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime?
|
|
status BookingStatus @default(ACCEPTED)
|
|
paid Boolean @default(false)
|
|
payment Payment[]
|
|
destinationCalendar DestinationCalendar? @relation(fields: [destinationCalendarId], references: [id])
|
|
destinationCalendarId Int?
|
|
cancellationReason String?
|
|
rejectionReason String?
|
|
dynamicEventSlugRef String?
|
|
dynamicGroupSlugRef String?
|
|
rescheduled Boolean?
|
|
fromReschedule String?
|
|
recurringEventId String?
|
|
smsReminderNumber String?
|
|
workflowReminders WorkflowReminder[]
|
|
scheduledJobs String[]
|
|
seatsReferences BookingSeat[]
|
|
/// @zod.custom(imports.bookingMetadataSchema)
|
|
metadata Json?
|
|
isRecorded Boolean @default(false)
|
|
iCalUID String? @default("")
|
|
iCalSequence Int @default(0)
|
|
instantMeetingToken InstantMeetingToken?
|
|
|
|
@@index([eventTypeId])
|
|
@@index([userId])
|
|
@@index([destinationCalendarId])
|
|
@@index([recurringEventId])
|
|
@@index([uid])
|
|
@@index([status])
|
|
@@index([startTime, endTime, status])
|
|
}
|
|
|
|
model Schedule {
|
|
id Int @id @default(autoincrement())
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int
|
|
eventType EventType[]
|
|
name String
|
|
timeZone String?
|
|
availability Availability[]
|
|
|
|
@@index([userId])
|
|
}
|
|
|
|
model Availability {
|
|
id Int @id @default(autoincrement())
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int?
|
|
eventType EventType? @relation(fields: [eventTypeId], references: [id])
|
|
eventTypeId Int?
|
|
days Int[]
|
|
startTime DateTime @db.Time
|
|
endTime DateTime @db.Time
|
|
date DateTime? @db.Date
|
|
Schedule Schedule? @relation(fields: [scheduleId], references: [id])
|
|
scheduleId Int?
|
|
|
|
@@index([userId])
|
|
@@index([eventTypeId])
|
|
@@index([scheduleId])
|
|
}
|
|
|
|
model SelectedCalendar {
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int
|
|
integration String
|
|
externalId String
|
|
credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade)
|
|
credentialId Int?
|
|
|
|
@@id([userId, integration, externalId])
|
|
@@index([userId])
|
|
@@index([integration])
|
|
@@index([externalId])
|
|
}
|
|
|
|
enum EventTypeCustomInputType {
|
|
TEXT @map("text")
|
|
TEXTLONG @map("textLong")
|
|
NUMBER @map("number")
|
|
BOOL @map("bool")
|
|
RADIO @map("radio")
|
|
PHONE @map("phone")
|
|
}
|
|
|
|
model EventTypeCustomInput {
|
|
id Int @id @default(autoincrement())
|
|
eventTypeId Int
|
|
eventType EventType @relation(fields: [eventTypeId], references: [id], onDelete: Cascade)
|
|
label String
|
|
type EventTypeCustomInputType
|
|
/// @zod.custom(imports.customInputOptionSchema)
|
|
options Json?
|
|
required Boolean
|
|
placeholder String @default("")
|
|
|
|
@@index([eventTypeId])
|
|
}
|
|
|
|
model ResetPasswordRequest {
|
|
id String @id @default(cuid())
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
email String
|
|
expires DateTime
|
|
}
|
|
|
|
enum ReminderType {
|
|
PENDING_BOOKING_CONFIRMATION
|
|
}
|
|
|
|
model ReminderMail {
|
|
id Int @id @default(autoincrement())
|
|
referenceId Int
|
|
reminderType ReminderType
|
|
elapsedMinutes Int
|
|
createdAt DateTime @default(now())
|
|
|
|
@@index([referenceId])
|
|
@@index([reminderType])
|
|
}
|
|
|
|
model Payment {
|
|
id Int @id @default(autoincrement())
|
|
uid String @unique
|
|
app App? @relation(fields: [appId], references: [slug], onDelete: Cascade)
|
|
appId String?
|
|
bookingId Int
|
|
booking Booking? @relation(fields: [bookingId], references: [id], onDelete: Cascade)
|
|
amount Int
|
|
fee Int
|
|
currency String
|
|
success Boolean
|
|
refunded Boolean
|
|
data Json
|
|
externalId String @unique
|
|
paymentOption PaymentOption? @default(ON_BOOKING)
|
|
|
|
@@index([bookingId])
|
|
@@index([externalId])
|
|
}
|
|
|
|
enum PaymentOption {
|
|
ON_BOOKING
|
|
HOLD
|
|
}
|
|
|
|
enum WebhookTriggerEvents {
|
|
BOOKING_CREATED
|
|
BOOKING_PAYMENT_INITIATED
|
|
BOOKING_PAID
|
|
BOOKING_RESCHEDULED
|
|
BOOKING_REQUESTED
|
|
BOOKING_CANCELLED
|
|
BOOKING_REJECTED
|
|
FORM_SUBMITTED
|
|
MEETING_ENDED
|
|
MEETING_STARTED
|
|
RECORDING_READY
|
|
INSTANT_MEETING
|
|
}
|
|
|
|
model Webhook {
|
|
id String @id @unique
|
|
userId Int?
|
|
teamId Int?
|
|
eventTypeId Int?
|
|
/// @zod.url()
|
|
subscriberUrl String
|
|
payloadTemplate String?
|
|
createdAt DateTime @default(now())
|
|
active Boolean @default(true)
|
|
eventTriggers WebhookTriggerEvents[]
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
eventType EventType? @relation(fields: [eventTypeId], references: [id], onDelete: Cascade)
|
|
app App? @relation(fields: [appId], references: [slug], onDelete: Cascade)
|
|
appId String?
|
|
secret String?
|
|
platform Boolean @default(false)
|
|
|
|
@@unique([userId, subscriberUrl], name: "courseIdentifier")
|
|
}
|
|
|
|
model Impersonations {
|
|
id Int @id @default(autoincrement())
|
|
createdAt DateTime @default(now())
|
|
impersonatedUser User @relation("impersonated_user", fields: [impersonatedUserId], references: [id], onDelete: Cascade)
|
|
impersonatedBy User @relation("impersonated_by_user", fields: [impersonatedById], references: [id], onDelete: Cascade)
|
|
impersonatedUserId Int
|
|
impersonatedById Int
|
|
}
|
|
|
|
model ApiKey {
|
|
id String @id @unique @default(cuid())
|
|
userId Int
|
|
teamId Int?
|
|
note String?
|
|
createdAt DateTime @default(now())
|
|
expiresAt DateTime?
|
|
lastUsedAt DateTime?
|
|
hashedKey String @unique()
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
app App? @relation(fields: [appId], references: [slug], onDelete: Cascade)
|
|
appId String?
|
|
|
|
@@index([userId])
|
|
}
|
|
|
|
model HashedLink {
|
|
id Int @id @default(autoincrement())
|
|
link String @unique()
|
|
eventType EventType @relation(fields: [eventTypeId], references: [id], onDelete: Cascade)
|
|
eventTypeId Int @unique
|
|
}
|
|
|
|
model Account {
|
|
id String @id @default(cuid())
|
|
userId Int
|
|
type String
|
|
provider String
|
|
providerAccountId String
|
|
refresh_token String? @db.Text
|
|
access_token String? @db.Text
|
|
expires_at Int?
|
|
token_type String?
|
|
scope String?
|
|
id_token String? @db.Text
|
|
session_state String?
|
|
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@unique([provider, providerAccountId])
|
|
@@index([userId])
|
|
@@index([type])
|
|
}
|
|
|
|
model Session {
|
|
id String @id @default(cuid())
|
|
sessionToken String @unique
|
|
userId Int
|
|
expires DateTime
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
|
|
@@index([userId])
|
|
}
|
|
|
|
enum AppCategories {
|
|
calendar
|
|
messaging
|
|
other
|
|
payment
|
|
video // deprecated, please use 'conferencing' instead
|
|
web3 // deprecated, we should no longer have any web3 apps
|
|
automation
|
|
analytics
|
|
// Wherever video is in use, conferencing should also be used for legacy apps can have it.
|
|
conferencing
|
|
crm
|
|
}
|
|
|
|
model App {
|
|
// The slug for the app store public page inside `/apps/[slug]`
|
|
slug String @id @unique
|
|
// The directory name for `/packages/app-store/[dirName]`
|
|
dirName String @unique
|
|
// Needed API Keys
|
|
keys Json?
|
|
// One or multiple categories to which this app belongs
|
|
categories AppCategories[]
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
credentials Credential[]
|
|
payments Payment[]
|
|
Webhook Webhook[]
|
|
ApiKey ApiKey[]
|
|
enabled Boolean @default(false)
|
|
|
|
@@index([enabled])
|
|
}
|
|
|
|
model App_RoutingForms_Form {
|
|
id String @id @default(cuid())
|
|
description String?
|
|
position Int @default(0)
|
|
routes Json?
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
name String
|
|
fields Json?
|
|
user User @relation("routing-form", fields: [userId], references: [id], onDelete: Cascade)
|
|
// This is the user who created the form and also the user who has read-write access to the form
|
|
// If teamId is set, the members of the team would also have access to form readOnly or read-write depending on their permission level as team member.
|
|
userId Int
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
teamId Int?
|
|
responses App_RoutingForms_FormResponse[]
|
|
disabled Boolean @default(false)
|
|
/// @zod.custom(imports.RoutingFormSettings)
|
|
settings Json?
|
|
|
|
@@index([userId])
|
|
@@index([disabled])
|
|
}
|
|
|
|
model App_RoutingForms_FormResponse {
|
|
id Int @id @default(autoincrement())
|
|
formFillerId String @default(cuid())
|
|
form App_RoutingForms_Form @relation(fields: [formId], references: [id], onDelete: Cascade)
|
|
formId String
|
|
response Json
|
|
createdAt DateTime @default(now())
|
|
|
|
@@unique([formFillerId, formId])
|
|
@@index([formFillerId])
|
|
@@index([formId])
|
|
}
|
|
|
|
model Feedback {
|
|
id Int @id @default(autoincrement())
|
|
date DateTime @default(now())
|
|
userId Int
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
rating String
|
|
comment String?
|
|
|
|
@@index([userId])
|
|
@@index([rating])
|
|
}
|
|
|
|
enum WorkflowTriggerEvents {
|
|
BEFORE_EVENT
|
|
EVENT_CANCELLED
|
|
NEW_EVENT
|
|
AFTER_EVENT
|
|
RESCHEDULE_EVENT
|
|
}
|
|
|
|
enum WorkflowActions {
|
|
EMAIL_HOST
|
|
EMAIL_ATTENDEE
|
|
SMS_ATTENDEE
|
|
SMS_NUMBER
|
|
EMAIL_ADDRESS
|
|
WHATSAPP_ATTENDEE
|
|
WHATSAPP_NUMBER
|
|
}
|
|
|
|
model WorkflowStep {
|
|
id Int @id @default(autoincrement())
|
|
stepNumber Int
|
|
action WorkflowActions
|
|
workflowId Int
|
|
workflow Workflow @relation(fields: [workflowId], references: [id], onDelete: Cascade)
|
|
sendTo String?
|
|
reminderBody String?
|
|
emailSubject String?
|
|
template WorkflowTemplates @default(REMINDER)
|
|
workflowReminders WorkflowReminder[]
|
|
numberRequired Boolean?
|
|
sender String?
|
|
numberVerificationPending Boolean @default(true)
|
|
includeCalendarEvent Boolean @default(false)
|
|
|
|
@@index([workflowId])
|
|
}
|
|
|
|
model Workflow {
|
|
id Int @id @default(autoincrement())
|
|
position Int @default(0)
|
|
name String
|
|
userId Int?
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
teamId Int?
|
|
activeOn WorkflowsOnEventTypes[]
|
|
trigger WorkflowTriggerEvents
|
|
time Int?
|
|
timeUnit TimeUnit?
|
|
steps WorkflowStep[]
|
|
|
|
@@index([userId])
|
|
@@index([teamId])
|
|
}
|
|
|
|
model WorkflowsOnEventTypes {
|
|
id Int @id @default(autoincrement())
|
|
workflow Workflow @relation(fields: [workflowId], references: [id], onDelete: Cascade)
|
|
workflowId Int
|
|
eventType EventType @relation(fields: [eventTypeId], references: [id], onDelete: Cascade)
|
|
eventTypeId Int
|
|
|
|
@@unique([workflowId, eventTypeId])
|
|
@@index([workflowId])
|
|
@@index([eventTypeId])
|
|
}
|
|
|
|
model Deployment {
|
|
/// This is a single row table, so we use a fixed id
|
|
id Int @id @default(1)
|
|
logo String?
|
|
/// @zod.custom(imports.DeploymentTheme)
|
|
theme Json?
|
|
licenseKey String?
|
|
agreedLicenseAt DateTime?
|
|
}
|
|
|
|
enum TimeUnit {
|
|
DAY @map("day")
|
|
HOUR @map("hour")
|
|
MINUTE @map("minute")
|
|
}
|
|
|
|
model WorkflowReminder {
|
|
id Int @id @default(autoincrement())
|
|
bookingUid String?
|
|
booking Booking? @relation(fields: [bookingUid], references: [uid])
|
|
method WorkflowMethods
|
|
scheduledDate DateTime
|
|
referenceId String? @unique
|
|
scheduled Boolean
|
|
workflowStepId Int?
|
|
workflowStep WorkflowStep? @relation(fields: [workflowStepId], references: [id])
|
|
cancelled Boolean?
|
|
seatReferenceId String?
|
|
isMandatoryReminder Boolean? @default(false)
|
|
|
|
@@index([bookingUid])
|
|
@@index([workflowStepId])
|
|
@@index([seatReferenceId])
|
|
@@index([method, scheduled, scheduledDate])
|
|
@@index([cancelled, scheduledDate])
|
|
}
|
|
|
|
model WebhookScheduledTriggers {
|
|
id Int @id @default(autoincrement())
|
|
jobName String
|
|
subscriberUrl String
|
|
payload String
|
|
startAfter DateTime
|
|
retryCount Int @default(0)
|
|
createdAt DateTime? @default(now())
|
|
}
|
|
|
|
enum WorkflowTemplates {
|
|
REMINDER
|
|
CUSTOM
|
|
CANCELLED
|
|
RESCHEDULED
|
|
COMPLETED
|
|
}
|
|
|
|
enum WorkflowMethods {
|
|
EMAIL
|
|
SMS
|
|
WHATSAPP
|
|
}
|
|
|
|
model BookingSeat {
|
|
id Int @id @default(autoincrement())
|
|
referenceUid String @unique
|
|
bookingId Int
|
|
booking Booking @relation(fields: [bookingId], references: [id], onDelete: Cascade)
|
|
attendeeId Int @unique
|
|
attendee Attendee @relation(fields: [attendeeId], references: [id], onDelete: Cascade)
|
|
/// @zod.custom(imports.bookingSeatDataSchema)
|
|
data Json?
|
|
|
|
@@index([bookingId])
|
|
@@index([attendeeId])
|
|
}
|
|
|
|
model VerifiedNumber {
|
|
id Int @id @default(autoincrement())
|
|
userId Int?
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
teamId Int?
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
phoneNumber String
|
|
|
|
@@index([userId])
|
|
@@index([teamId])
|
|
}
|
|
|
|
model Feature {
|
|
// The feature slug, ex: 'v2-workflows'
|
|
slug String @id @unique
|
|
// If the feature is currently enabled
|
|
enabled Boolean @default(false)
|
|
// A short description of the feature
|
|
description String?
|
|
// The type of feature flag
|
|
type FeatureType? @default(RELEASE)
|
|
// If the flag is considered stale
|
|
stale Boolean? @default(false)
|
|
lastUsedAt DateTime?
|
|
createdAt DateTime? @default(now())
|
|
updatedAt DateTime? @default(now()) @updatedAt
|
|
updatedBy Int?
|
|
|
|
@@index([enabled])
|
|
@@index([stale])
|
|
}
|
|
|
|
enum FeatureType {
|
|
RELEASE
|
|
EXPERIMENT
|
|
OPERATIONAL
|
|
KILL_SWITCH
|
|
PERMISSION
|
|
}
|
|
|
|
model SelectedSlots {
|
|
id Int @id @default(autoincrement())
|
|
eventTypeId Int
|
|
userId Int
|
|
slotUtcStartDate DateTime
|
|
slotUtcEndDate DateTime
|
|
uid String
|
|
releaseAt DateTime
|
|
isSeat Boolean @default(false)
|
|
|
|
@@unique(fields: [userId, slotUtcStartDate, slotUtcEndDate, uid], name: "selectedSlotUnique")
|
|
}
|
|
|
|
model OAuthClient {
|
|
clientId String @id @unique
|
|
redirectUri String
|
|
clientSecret String
|
|
name String
|
|
logo String?
|
|
accessCodes AccessCode[]
|
|
}
|
|
|
|
model AccessCode {
|
|
id Int @id @default(autoincrement())
|
|
code String
|
|
clientId String?
|
|
client OAuthClient? @relation(fields: [clientId], references: [clientId], onDelete: Cascade)
|
|
expiresAt DateTime
|
|
scopes AccessScope[]
|
|
userId Int?
|
|
user User? @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
teamId Int?
|
|
team Team? @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
}
|
|
|
|
enum AccessScope {
|
|
READ_BOOKING
|
|
READ_PROFILE
|
|
}
|
|
|
|
view BookingTimeStatus {
|
|
id Int @unique
|
|
uid String?
|
|
eventTypeId Int?
|
|
title String?
|
|
description String?
|
|
startTime DateTime?
|
|
endTime DateTime?
|
|
createdAt DateTime?
|
|
location String?
|
|
paid Boolean?
|
|
status BookingStatus?
|
|
rescheduled Boolean?
|
|
userId Int?
|
|
teamId Int?
|
|
eventLength Int?
|
|
timeStatus String?
|
|
eventParentId Int?
|
|
userEmail String?
|
|
username String?
|
|
}
|
|
|
|
model CalendarCache {
|
|
// The key would be the unique URL that is requested by the user
|
|
key String
|
|
value Json
|
|
expiresAt DateTime
|
|
credentialId Int
|
|
credential Credential? @relation(fields: [credentialId], references: [id], onDelete: Cascade)
|
|
|
|
@@id([credentialId, key])
|
|
@@unique([credentialId, key])
|
|
}
|
|
|
|
enum RedirectType {
|
|
UserEventType @map("user-event-type")
|
|
TeamEventType @map("team-event-type")
|
|
User @map("user")
|
|
Team @map("team")
|
|
}
|
|
|
|
model TempOrgRedirect {
|
|
id Int @id @default(autoincrement())
|
|
// Better would be to have fromOrgId and toOrgId as well and then we should have just to instead toUrl
|
|
from String
|
|
// 0 would mean it is non org
|
|
fromOrgId Int
|
|
type RedirectType
|
|
// It doesn't have any query params
|
|
toUrl String
|
|
enabled Boolean @default(true)
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@unique([from, type, fromOrgId])
|
|
}
|
|
|
|
model Avatar {
|
|
// e.g. NULL(0), organization ID or team logo
|
|
teamId Int @default(0)
|
|
// Avatar, NULL(0) if team logo
|
|
userId Int @default(0)
|
|
// base64 string
|
|
data String
|
|
// different every time to pop the cache.
|
|
objectKey String @unique
|
|
|
|
isBanner Boolean @default(false)
|
|
|
|
@@unique([teamId, userId, isBanner])
|
|
@@map(name: "avatars")
|
|
}
|
|
|
|
model OutOfOfficeEntry {
|
|
id Int @id @default(autoincrement())
|
|
uuid String @unique
|
|
start DateTime
|
|
end DateTime
|
|
userId Int
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
toUserId Int?
|
|
toUser User? @relation(name: "toUser", fields: [toUserId], references: [id], onDelete: Cascade)
|
|
|
|
createdAt DateTime @default(now())
|
|
updatedAt DateTime @updatedAt
|
|
|
|
@@index([uuid])
|
|
@@index([userId])
|
|
@@index([toUserId])
|
|
@@index([start, end])
|
|
}
|
|
|
|
// Platform
|
|
model PlatformOAuthClient {
|
|
id String @id @default(cuid())
|
|
name String
|
|
secret String // auth secret?
|
|
permissions Int
|
|
users User[]
|
|
logo String?
|
|
redirectUris String[] @map("redirect_uris")
|
|
organizationId Int @map("organization_id")
|
|
organization Team @relation(fields: [organizationId], references: [id], onDelete: Cascade)
|
|
|
|
accessTokens AccessToken[]
|
|
refreshToken RefreshToken[]
|
|
authorizationTokens PlatformAuthorizationToken[]
|
|
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
|
|
@@map(name: "platform_oauth_clients")
|
|
}
|
|
|
|
model PlatformAuthorizationToken {
|
|
id String @id @default(cuid())
|
|
|
|
owner User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
client PlatformOAuthClient @relation(fields: [platformOAuthClientId], references: [id], onDelete: Cascade)
|
|
|
|
platformOAuthClientId String @map("platform_oauth_client_id")
|
|
userId Int @map("user_id")
|
|
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
|
|
@@unique([userId, platformOAuthClientId])
|
|
@@map("platform_authorization_token")
|
|
}
|
|
|
|
model AccessToken {
|
|
id Int @id @default(autoincrement())
|
|
|
|
secret String @unique
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
expiresAt DateTime @map("expires_at")
|
|
|
|
owner User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
client PlatformOAuthClient @relation(fields: [platformOAuthClientId], references: [id], onDelete: Cascade)
|
|
|
|
platformOAuthClientId String @map("platform_oauth_client_id")
|
|
userId Int @map("user_id")
|
|
|
|
@@map("platform_access_tokens")
|
|
}
|
|
|
|
model RefreshToken {
|
|
id Int @id @default(autoincrement())
|
|
|
|
secret String @unique
|
|
createdAt DateTime @default(now()) @map("created_at")
|
|
expiresAt DateTime @map("expires_at")
|
|
|
|
owner User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
client PlatformOAuthClient @relation(fields: [platformOAuthClientId], references: [id], onDelete: Cascade)
|
|
|
|
platformOAuthClientId String @map("platform_oauth_client_id")
|
|
userId Int @map("user_id")
|
|
|
|
@@map("platform_refresh_token")
|
|
}
|
|
|
|
model DSyncData {
|
|
id Int @id @default(autoincrement())
|
|
directoryId String @unique
|
|
tenant String
|
|
organizationId Int? @unique
|
|
org OrganizationSettings? @relation(fields: [organizationId], references: [organizationId], onDelete: Cascade)
|
|
teamGroupMapping DSyncTeamGroupMapping[]
|
|
}
|
|
|
|
model DSyncTeamGroupMapping {
|
|
id Int @id @default(autoincrement())
|
|
organizationId Int
|
|
teamId Int
|
|
team Team @relation(fields: [teamId], references: [id], onDelete: Cascade)
|
|
directoryId String
|
|
directory DSyncData @relation(fields: [directoryId], references: [directoryId], onDelete: Cascade)
|
|
groupName String
|
|
|
|
@@unique([teamId, groupName])
|
|
}
|
|
|
|
model SecondaryEmail {
|
|
id Int @id @default(autoincrement())
|
|
user User @relation(fields: [userId], references: [id], onDelete: Cascade)
|
|
userId Int
|
|
email String
|
|
emailVerified DateTime?
|
|
verificationTokens VerificationToken[]
|
|
eventTypes EventType[]
|
|
|
|
@@unique([email])
|
|
@@unique([userId, email])
|
|
@@index([userId])
|
|
}
|