From 88de2872d86057bfa47d5cb2e04e52b11d685d24 Mon Sep 17 00:00:00 2001 From: Jesse Cooke <18191+jc00ke@users.noreply.github.com> Date: Tue, 29 Oct 2024 00:46:54 -0700 Subject: [PATCH 01/12] Don't require host for postgres (twentyhq#8157) (#8159) Not sure if this will pass the tests; I don't have TS experience so I'll see what CI does with it. Fixes #8157 --- .../src/engine/core-modules/environment/environment-variables.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts b/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts index 77d54025f..51a225fae 100644 --- a/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts +++ b/packages/twenty-server/src/engine/core-modules/environment/environment-variables.ts @@ -116,6 +116,7 @@ export class EnvironmentVariables { protocols: ['postgres'], require_tld: false, allow_underscores: true, + require_host: false, }) PG_DATABASE_URL: string; From a725245c2fd93a2770d9ad5e5a5a164b4ba0b2ab Mon Sep 17 00:00:00 2001 From: Reese is on Codeberg Date: Tue, 29 Oct 2024 02:56:16 -0500 Subject: [PATCH 02/12] Add padding to navigation header (#8050) This PR adds padding to the header to align the logo with other icons on the sidebar. ## Before ![image](https://github.com/user-attachments/assets/6501bbbf-bf06-4d9f-bff7-2d36c1b63a37) ## After ![image](https://github.com/user-attachments/assets/24610cf8-eab2-49bd-b611-e68a66228fd6) --------- Co-authored-by: martmull --- .../navigation-drawer/components/NavigationDrawerHeader.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerHeader.tsx b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerHeader.tsx index e9d761c57..5805576d5 100644 --- a/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerHeader.tsx +++ b/packages/twenty-front/src/modules/ui/navigation/navigation-drawer/components/NavigationDrawerHeader.tsx @@ -20,6 +20,7 @@ const StyledContainer = styled.div` `; const StyledSingleWorkspaceContainer = styled(StyledContainer)` gap: ${({ theme }) => theme.spacing(2)}; + padding: ${({ theme }) => theme.spacing(1)}; `; const StyledLogo = styled.div<{ logo: string }>` From 94f2e1067b1555ae1127f34628324e73fbf043fd Mon Sep 17 00:00:00 2001 From: martmull Date: Tue, 29 Oct 2024 09:54:16 +0100 Subject: [PATCH 03/12] Revert "fix: dropdowns should have a max-height & padding from screen" (#8165) Reverts twentyhq/twenty#8055 --- .../layout/dropdown/components/Dropdown.tsx | 22 ++++--------------- .../dropdown/components/DropdownMenu.tsx | 2 -- 2 files changed, 4 insertions(+), 20 deletions(-) diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx index 0f4c0e698..c6d5205e3 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx @@ -4,10 +4,9 @@ import { FloatingPortal, offset, Placement, - size, useFloating, } from '@floating-ui/react'; -import { MouseEvent, useEffect, useRef, useState } from 'react'; +import { MouseEvent, useEffect, useRef } from 'react'; import { Keys } from 'react-hotkeys-hook'; import { Key } from 'ts-key-enum'; @@ -22,7 +21,6 @@ import { isDefined } from '~/utils/isDefined'; import { useDropdown } from '../hooks/useDropdown'; import { useInternalHotkeyScopeManagement } from '../hooks/useInternalHotkeyScopeManagement'; -import { flushSync } from 'react-dom'; import { DropdownMenu } from './DropdownMenu'; import { DropdownOnToggleEffect } from './DropdownOnToggleEffect'; @@ -65,9 +63,6 @@ export const Dropdown = ({ onOpen, }: DropdownProps) => { const containerRef = useRef(null); - const [maxHeight, setMaxHeight] = useState( - undefined, - ); const { isDropdownOpen, @@ -89,16 +84,7 @@ export const Dropdown = ({ const { refs, floatingStyles, placement } = useFloating({ placement: dropdownPlacement, - middleware: [ - flip(), - size({ - padding: 12 + 20, // 12px for padding bottom, 20px for dropdown bottom margin target - apply: ({ availableHeight }) => { - flushSync(() => setMaxHeight(availableHeight)); - }, - }), - ...offsetMiddlewares, - ], + middleware: [flip(), ...offsetMiddlewares], whileElementsMounted: autoUpdate, strategy: dropdownStrategy, }); @@ -169,7 +155,7 @@ export const Dropdown = ({ width={dropdownMenuWidth ?? dropdownWidth} data-select-disable ref={refs.setFloating} - style={{ ...floatingStyles, maxHeight }} + style={floatingStyles} > {dropdownComponents} @@ -181,7 +167,7 @@ export const Dropdown = ({ width={dropdownMenuWidth ?? dropdownWidth} data-select-disable ref={refs.setFloating} - style={{ ...floatingStyles, maxHeight }} + style={floatingStyles} > {dropdownComponents} diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx index d7b09e7fc..5ac402f98 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx @@ -25,8 +25,6 @@ const StyledDropdownMenu = styled.div<{ flex-direction: column; z-index: 30; - overflow-y: scroll; - overflow-x: hidden; width: ${({ width = 160 }) => typeof width === 'number' ? `${width}px` : width}; `; From 7901dbc02f14c7d4478961a081ffbfda0420fc8b Mon Sep 17 00:00:00 2001 From: Harshit Singh <73997189+harshit078@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:33:28 +0530 Subject: [PATCH 04/12] fix: Country Dropdown not closing with AddressInput (#8147) ## Description - This PR fixes #8080 - The Country Selector dropdown closes with Address Input `clickOutside` function ## Changes https://github.com/user-attachments/assets/1ab85175-9ce9-40d2-ac52-14bfe87e254f --------- Co-authored-by: Devessier --- .../ui/layout/dropdown/components/Dropdown.tsx | 7 +++++++ .../modules/ui/layout/dropdown/hooks/useDropdown.ts | 13 ++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx index c6d5205e3..c4d62a560 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx @@ -70,6 +70,7 @@ export const Dropdown = ({ closeDropdown, dropdownWidth, setDropdownPlacement, + resetDropdown, } = useDropdown(dropdownId); const offsetMiddlewares = []; @@ -130,6 +131,12 @@ export const Dropdown = ({ [closeDropdown], ); + useEffect(() => { + return () => { + resetDropdown(); + }; + }, [resetDropdown]); + return (
diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts b/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts index 24225beab..1386773d7 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/hooks/useDropdown.ts @@ -1,4 +1,4 @@ -import { useRecoilState } from 'recoil'; +import { useRecoilCallback, useRecoilState } from 'recoil'; import { useDropdownStates } from '@/ui/layout/dropdown/hooks/internal/useDropdownStates'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; @@ -56,6 +56,16 @@ export const useDropdown = (dropdownId?: string) => { } }; + const resetDropdown = useRecoilCallback( + ({ reset }) => + () => { + reset(dropdownHotkeyScopeState); + reset(dropdownWidthState); + reset(isDropdownOpenState); + }, + [dropdownHotkeyScopeState, dropdownWidthState, isDropdownOpenState], + ); + return { scopeId, isDropdownOpen, @@ -66,5 +76,6 @@ export const useDropdown = (dropdownId?: string) => { setDropdownWidth, dropdownPlacement, setDropdownPlacement, + resetDropdown, }; }; From ac2798b78f90e470186dd9c259c971450b17fd82 Mon Sep 17 00:00:00 2001 From: Ashish Viradiya <116018976+AshishViradiya153@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:35:19 +0530 Subject: [PATCH 05/12] Article on 20CRM (#8155) total point: 1500 Links: Selft hosting: https://medium.com/@ashishviradiya153/comprehensive-guide-to-self-hosting-twenty-crm-26e7fa36c846 about 20: https://medium.com/@ashishviradiya153/is-twenty-crm-the-right-tool-for-your-business-heres-my-honest-review-0d41e9d8a7eb --- .../twenty-content-challenges/2-write-blog-post-about-20.md | 4 +++- .../3-write-selfthost-guide-blog-post-20.md | 4 +++- 2 files changed, 6 insertions(+), 2 deletions(-) diff --git a/oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md b/oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md index 04ac8c68d..7b28342ae 100644 --- a/oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md +++ b/oss-gg/twenty-content-challenges/2-write-blog-post-about-20.md @@ -30,4 +30,6 @@ Your turn 👇 » 27-October-2024 by [Vardhaman619](https://oss.gg/vardhaman619) blog Link: [blog](https://dev.to/vardhaman619/my-experience-with-modern-open-source-crm-twenty-crm-2hen) -» 28-October-2024 by [harshsbhat](https://oss.gg/harshsbhat) blog Link: [blog](https://www.harshbhat.me/blog/twenty-crm) \ No newline at end of file +» 28-October-2024 by [harshsbhat](https://oss.gg/harshsbhat) blog Link: [blog](https://www.harshbhat.me/blog/twenty-crm) + +» 28-October-2024 by [AshishViradiya153](https://oss.gg/AshishViradiya153) blog Link: [blog](https://medium.com/@ashishviradiya153/is-twenty-crm-the-right-tool-for-your-business-heres-my-honest-review-0d41e9d8a7eb) \ No newline at end of file diff --git a/oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md b/oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md index 2d17bffb6..b472cd70b 100644 --- a/oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md +++ b/oss-gg/twenty-content-challenges/3-write-selfthost-guide-blog-post-20.md @@ -28,4 +28,6 @@ Your turn 👇 » 26-October-2024 by [Yash-1511](https://oss.gg/Yash-1511) blog Link: [blog](https://medium.com/@yashp3020/a-comprehensive-guide-to-self-hosting-twenty-crm-with-docker-compose-40ea3fb4afdc) --- -» 28-October-2024 by [harshsbhat](https://oss.gg/harshsbhat) blog Link: [blog](https://www.harshbhat.me/blog/twenty-self-host) \ No newline at end of file +» 28-October-2024 by [harshsbhat](https://oss.gg/harshsbhat) blog Link: [blog](https://www.harshbhat.me/blog/twenty-self-host) + +» 28-October-2024 by [AshishViradiya153](https://oss.gg/AshishViradiya153) blog Link: [blog](https://medium.com/@ashishviradiya153/comprehensive-guide-to-self-hosting-twenty-crm-26e7fa36c846) \ No newline at end of file From 6fba3e0805eb7d6007ba0049918ae49186e4f73b Mon Sep 17 00:00:00 2001 From: Aditya Deshlahre <132184385+adityadeshlahre@users.noreply.github.com> Date: Tue, 29 Oct 2024 14:41:32 +0530 Subject: [PATCH 06/12] ossgg: completed all side quest-wizard (#8158) # Quest Wizard completed all side quest - bug #8132 - all other side quest done #7848 - meme #7848 - gif #7848 - fav feat about twenty #7848 - initial contribution tweet #7848 # point 300 thank You :slightly_smiling_face: --- oss-gg/twenty-side-quest/6-quest-wizard.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/oss-gg/twenty-side-quest/6-quest-wizard.md b/oss-gg/twenty-side-quest/6-quest-wizard.md index f3d748dd0..21d4c4be4 100644 --- a/oss-gg/twenty-side-quest/6-quest-wizard.md +++ b/oss-gg/twenty-side-quest/6-quest-wizard.md @@ -20,4 +20,6 @@ Your turn 👇 » 22-October-2024 by [Khaan25](https://oss.gg/Khaan25) -» 26-October-2024 by [Naprila](https://oss.gg/Naprila) \ No newline at end of file +» 26-October-2024 by [Naprila](https://oss.gg/Naprila) + +» 28-October-2024 by [Aditya Deshlahre](https://oss.gg/adityadeshlahre) From 8ef4efa0f5dbf66b5debbcd4b69677d7ed389482 Mon Sep 17 00:00:00 2001 From: Ana Sofia Marin Alexandre <61988046+anamarn@users.noreply.github.com> Date: Tue, 29 Oct 2024 06:31:05 -0300 Subject: [PATCH 07/12] add twenty-tinybird package (#8030) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://github.com/twentyhq/private-issues/issues/75 **TLDR** Add twenty-server package, wich contains the last tinybird datasources and pipes used in analytics. This new version of the API endpoints, pipes and datasources are inspired by the implementation of dub.co (https://github.com/dubinc/dub/blob/main/packages/tinybird/). It contains the webhooks analytics, serverless functions duration and serverless functions error count analytics. As well as **In order to test** - Follow the instructions in the README.md on twenty-tinybird using your admin token from twenty_analytics_playground if you want to modify them. - For a better experience add the extension Tinybird support for VsCode - If you want more info about datasources and pipes please read the tinybird docs. --------- Co-authored-by: Félix Malfait Co-authored-by: Félix Malfait --- .github/workflows/ci-tinybird.yaml | 22 ++ .gitignore | 1 + packages/twenty-tinybird/.gitignore | 2 + packages/twenty-tinybird/.tinyenv | 18 ++ packages/twenty-tinybird/README.md | 42 +++ .../datasources/event.datasource | 11 + .../datasources/fixtures/event.csv | 283 ++++++++++++++++++ .../datasources/fixtures/pageview.csv | 11 + .../datasources/pageview.datasource | 16 + .../serverlessFunctionEventMV.datasource | 11 + .../datasources/webhookEventMV.datasource | 13 + .../twenty-tinybird/includes/timeSeries.incl | 87 ++++++ .../pipes/getServerlessFunctionDuration.pipe | 35 +++ .../pipes/getServerlessFunctionErrors.pipe | 41 +++ .../pipes/getWebhookAnalytics.pipe | 34 +++ .../materializeServerlessFunctionEvent.pipe | 14 + .../pipes/materializeWebhookEvent.pipe | 16 + packages/twenty-tinybird/requirements.txt | 1 + .../scripts/append_fixtures.sh | 21 ++ packages/twenty-tinybird/scripts/exec_test.sh | 58 ++++ packages/twenty-tinybird/tests/example.yml | 29 ++ .../twenty-tinybird/tests/regression.yaml | 25 ++ 22 files changed, 791 insertions(+) create mode 100644 .github/workflows/ci-tinybird.yaml create mode 100644 packages/twenty-tinybird/.gitignore create mode 100644 packages/twenty-tinybird/.tinyenv create mode 100644 packages/twenty-tinybird/README.md create mode 100644 packages/twenty-tinybird/datasources/event.datasource create mode 100644 packages/twenty-tinybird/datasources/fixtures/event.csv create mode 100644 packages/twenty-tinybird/datasources/fixtures/pageview.csv create mode 100644 packages/twenty-tinybird/datasources/pageview.datasource create mode 100644 packages/twenty-tinybird/datasources/serverlessFunctionEventMV.datasource create mode 100644 packages/twenty-tinybird/datasources/webhookEventMV.datasource create mode 100644 packages/twenty-tinybird/includes/timeSeries.incl create mode 100644 packages/twenty-tinybird/pipes/getServerlessFunctionDuration.pipe create mode 100644 packages/twenty-tinybird/pipes/getServerlessFunctionErrors.pipe create mode 100644 packages/twenty-tinybird/pipes/getWebhookAnalytics.pipe create mode 100644 packages/twenty-tinybird/pipes/materializeServerlessFunctionEvent.pipe create mode 100644 packages/twenty-tinybird/pipes/materializeWebhookEvent.pipe create mode 100644 packages/twenty-tinybird/requirements.txt create mode 100755 packages/twenty-tinybird/scripts/append_fixtures.sh create mode 100755 packages/twenty-tinybird/scripts/exec_test.sh create mode 100644 packages/twenty-tinybird/tests/example.yml create mode 100644 packages/twenty-tinybird/tests/regression.yaml diff --git a/.github/workflows/ci-tinybird.yaml b/.github/workflows/ci-tinybird.yaml new file mode 100644 index 000000000..3678c0ea7 --- /dev/null +++ b/.github/workflows/ci-tinybird.yaml @@ -0,0 +1,22 @@ +name: CI Tinybird +on: + # Temporarily disabled + # push: + # branches: + # - main + + # pull_request: + + +concurrency: + group: ${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + ci: + uses: tinybirdco/ci/.github/workflows/ci.yml@main + with: + data_project_dir: packages/twenty-tinybird + secrets: + tb_admin_token: ${{ secrets.TINYBIRD_ADMIN_TOKEN }} + tb_host: https://api.eu-central-1.aws.tinybird.co \ No newline at end of file diff --git a/.gitignore b/.gitignore index c5bb33e00..20f974922 100644 --- a/.gitignore +++ b/.gitignore @@ -29,3 +29,4 @@ storybook-static .nyc_output test-results/ dump.rdb +.tinyb diff --git a/packages/twenty-tinybird/.gitignore b/packages/twenty-tinybird/.gitignore new file mode 100644 index 000000000..77f27a593 --- /dev/null +++ b/packages/twenty-tinybird/.gitignore @@ -0,0 +1,2 @@ +.tinyb +.venv \ No newline at end of file diff --git a/packages/twenty-tinybird/.tinyenv b/packages/twenty-tinybird/.tinyenv new file mode 100644 index 000000000..2c802ef9e --- /dev/null +++ b/packages/twenty-tinybird/.tinyenv @@ -0,0 +1,18 @@ + +VERSION=0.0.0 + + + +########## +# OPTIONAL env vars + +# Don't print CLI version warning message if there's a new available version +# TB_VERSION_WARNING=0 + +# Skip regression tests +# TB_SKIP_REGRESSION=0 + +# Use `OBFUSCATE_REGEX_PATTERN` and `OBFUSCATE_PATTERN_SEPARATOR` environment variables to define a regex pattern and a separator (in case of a single string with multiple regex) to obfuscate secrets in the CLI output. +# OBFUSCATE_REGEX_PATTERN="https://(www\.)?[^/]+||^Follow these instructions =>" +# OBFUSCATE_PATTERN_SEPARATOR=|| +########## diff --git a/packages/twenty-tinybird/README.md b/packages/twenty-tinybird/README.md new file mode 100644 index 000000000..aa0d74023 --- /dev/null +++ b/packages/twenty-tinybird/README.md @@ -0,0 +1,42 @@ + +## How to use +Create a virtual enviroment and install tinybird +```sh +python3 -m venv .venv +source .venv/bin/activate +pip install tinybird-cli +``` +Authenticate using your admin token from your workspace (twenty_analytics_cli_playground) +```sh +tb auth -i + +** List of available regions: +[1] us-east4 (gcp) (https://app.us-east.tinybird.co) +[2] europe-west3 (gcp) (https://app.tinybird.co/gcp/europe-west3) +[3] us-east-1 (aws) (https://app.tinybird.co/aws/us-east-1) +[4] us-west-2 (aws) (https://app.tinybird.co/aws/us-west-2) +[5] eu-central-1 (aws) (https://app.tinybird.co/aws/eu-central-1) <- this +[0] Cancel + +Use region [5]: +Copy the "admin your@email" token from from https://app.tinybird.co/tokens and paste it here: +** Auth successful! +** Configuration written to .tinyb file, consider adding it to .gitignore +``` +To sync your changes to Tinybird use: +```sh +tb push --force --push-deps +``` +To pull data from Tinybird use: +```sh +tb pull +``` +Things I learned: + +* When creating Materialied Views think about populating it first using the files from the fixtures +* When pushing your pipes prefer to push one by one so you can have more coherent error messages +* The Include files will be nodes that will be added at the start of your node in Tinybird UI +* It's best to stick only with only the CLI or the UI when developping in Tinybird +* If you want to format the data us the tb fmt command, perhaps we can add it to the linter in a next pull request. + + diff --git a/packages/twenty-tinybird/datasources/event.datasource b/packages/twenty-tinybird/datasources/event.datasource new file mode 100644 index 000000000..c0629d75c --- /dev/null +++ b/packages/twenty-tinybird/datasources/event.datasource @@ -0,0 +1,11 @@ +SCHEMA > + `action` String `json:$.action`, + `timestamp` DateTime64(3) `json:$.timestamp`, + `version` String `json:$.version`, + `userId` String `json:$.userId` DEFAULT '', + `workspaceId` String `json:$.workspaceId` DEFAULT '', + `payload` String `json:$.payload` + +ENGINE MergeTree +ENGINE_PARTITION_KEY toYear(timestamp) +ENGINE_SORTING_KEY action, timestamp diff --git a/packages/twenty-tinybird/datasources/fixtures/event.csv b/packages/twenty-tinybird/datasources/fixtures/event.csv new file mode 100644 index 000000000..bb326307e --- /dev/null +++ b/packages/twenty-tinybird/datasources/fixtures/event.csv @@ -0,0 +1,283 @@ +"action","timestamp","version","userId","workspaceId","payload" +"apiKey.created","2024-10-24 15:55:35.177","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 15:55:35.178","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 15:55:35.212","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 15:57:42.810","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 15:57:42.812","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 15:57:42.989","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 16:03:18.134","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 16:03:18.135","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"apiKey.created","2024-10-24 16:03:18.205","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 15:55:31.949","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 15:55:31.950","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 15:55:32.027","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 15:57:31.970","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 15:57:31.979","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 15:57:34.033","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 16:03:17.602","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 16:03:17.602","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"attachment.created","2024-10-24 16:03:17.755","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 15:55:33.498","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 15:55:33.499","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 15:55:33.602","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 15:57:42.984","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 15:57:42.986","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 15:57:43.219","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 16:03:19.139","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 16:03:19.141","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"auditLog.created","2024-10-24 16:03:19.289","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 15:55:33.732","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 15:55:33.733","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 15:55:33.836","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 15:57:43.255","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 15:57:43.257","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 15:57:43.454","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 16:03:18.813","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 16:03:18.814","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"blocklist.created","2024-10-24 16:03:19.148","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:55:31.547","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:55:32.156","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:55:32.158","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:55:32.279","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:57:26.908","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:57:26.914","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:57:26.914","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 15:57:27.059","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 16:03:16.523","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 16:03:16.524","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 16:03:16.525","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannel.created","2024-10-24 16:03:16.686","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 15:55:32.230","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 15:55:32.231","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 15:55:32.334","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 15:57:27.238","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 15:57:27.238","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 15:57:27.611","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 16:03:16.756","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 16:03:16.757","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarChannelEventAssociation.created","2024-10-24 16:03:16.861","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEvent.created","2024-10-24 15:55:31.420","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEvent.created","2024-10-24 15:55:32.015","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEvent.created","2024-10-24 15:57:26.778","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEvent.created","2024-10-24 15:57:27.090","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEvent.created","2024-10-24 16:03:16.377","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEvent.created","2024-10-24 16:03:16.692","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 15:55:31.728","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 15:55:31.730","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 15:55:32.060","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 15:57:26.901","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 15:57:26.902","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 15:57:27.045","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 16:03:16.517","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 16:03:16.517","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"calendarEventParticipant.created","2024-10-24 16:03:16.682","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-22 09:31:13.563","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-22 10:17:00.671","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-22 13:16:50.935","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 15:55:36.922","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 15:55:36.927","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 15:55:38.123","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 15:57:34.430","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 15:57:34.443","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 15:57:37.343","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 16:03:17.741","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 16:03:17.742","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"company.created","2024-10-24 16:03:17.854","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:55:31.333","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:55:33.225","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:55:33.226","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:55:33.271","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:57:26.651","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:57:44.533","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:57:44.534","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 15:57:44.621","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 16:03:16.374","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 16:03:18.781","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 16:03:18.782","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"connectedAccount.created","2024-10-24 16:03:18.922","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 15:55:34.589","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 15:55:34.590","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 15:55:34.651","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 15:57:44.022","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 15:57:44.023","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 15:57:44.183","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 16:03:20.770","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 16:03:20.772","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"favorite.created","2024-10-24 16:03:20.964","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"function.execute","2024-10-22 14:51:25.149","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":37,""status"":""SUCCESS"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""testingMiVida""}" +"function.execute","2024-10-22 14:54:59.296","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":38,""status"":""ERROR"",""errorType"":""ReferenceError"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""testingMiVida""}" +"function.execute","2024-10-22 14:55:00.677","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":32,""status"":""ERROR"",""errorType"":""ReferenceError"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""testingMiVida""}" +"function.execute","2024-10-22 14:55:03.512","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":34,""status"":""ERROR"",""errorType"":""ReferenceError"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""testingMiVida""}" +"message.created","2024-10-24 15:55:32.004","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"message.created","2024-10-24 15:57:26.780","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"message.created","2024-10-24 16:03:16.384","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 15:55:32.169","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 15:55:32.170","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 15:55:32.281","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 15:57:26.872","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 15:57:26.872","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 15:57:27.035","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 16:03:16.506","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 16:03:16.507","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannel.created","2024-10-24 16:03:16.661","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 15:55:32.184","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 15:55:32.185","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 15:55:32.303","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 15:57:26.714","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 15:57:26.717","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 15:57:26.869","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 16:03:16.385","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 16:03:16.386","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageChannelMessageAssociation.created","2024-10-24 16:03:16.553","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 15:55:32.236","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 15:55:32.237","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 15:55:32.310","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 15:57:26.944","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 15:57:26.945","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 15:57:27.114","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 16:03:16.499","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 16:03:16.499","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageParticipant.created","2024-10-24 16:03:16.684","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 15:55:34.758","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 15:55:34.759","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 15:55:34.877","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 15:57:35.725","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 15:57:35.803","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 15:57:37.351","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 16:03:17.807","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 16:03:17.808","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"messageThread.created","2024-10-24 16:03:17.879","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 15:55:35.486","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 15:55:35.486","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 15:55:35.671","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 15:57:36.207","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 15:57:36.209","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 15:57:37.487","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 16:03:17.594","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 16:03:17.594","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"note.created","2024-10-24 16:03:17.762","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 15:55:33.621","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 15:55:33.622","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 15:55:33.734","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 15:57:42.859","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 15:57:42.859","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 15:57:43.174","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 16:03:18.800","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 16:03:18.802","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"noteTarget.created","2024-10-24 16:03:19.118","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 15:55:33.606","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 15:55:33.607","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 15:55:33.736","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 15:57:42.937","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 15:57:42.938","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 15:57:43.166","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 16:03:19.409","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 16:03:19.410","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"opportunity.created","2024-10-24 16:03:21.884","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:55:33.525","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:55:33.526","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:55:35.037","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:55:35.038","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:55:35.228","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:57:34.269","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:57:34.273","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:57:37.353","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:57:41.933","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 15:57:41.935","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 16:03:17.781","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 16:03:17.782","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 16:03:17.871","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 16:03:18.137","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"person.created","2024-10-24 16:03:18.137","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"serverlessFunction.executed","2024-10-22 16:08:22.853","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":49,""status"":""SUCCESS"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""""}" +"serverlessFunction.executed","2024-10-22 16:08:25.262","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":33,""status"":""SUCCESS"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""""}" +"serverlessFunction.executed","2024-10-22 16:08:38.831","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":1008,""status"":""SUCCESS"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""""}" +"serverlessFunction.executed","2024-10-22 16:08:40.553","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":35,""status"":""ERROR"",""errorType"":""ReferenceError"",""functionId"":""a9fd87c0-af86-4e17-be3a-a6d3d961678a"",""functionName"":""""}" +"serverlessFunction.executed","2024-10-22 16:17:42.534","1","serverless-function","20202020-1c25-4d02-bf25-6aeccf7ea419","{""duration"":42,""status"":""SUCCESS"",""functionId"":""01963805-b9e9-47c5-8bf0-b815c6ba5e1c"",""functionName"":""jjjj""}" +"task.created","2024-10-24 15:55:35.469","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 15:55:35.469","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 15:55:35.672","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 15:57:32.646","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 15:57:32.649","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 15:57:33.949","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 16:03:17.587","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 16:03:17.589","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"task.created","2024-10-24 16:03:17.738","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 15:55:33.705","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 15:55:33.706","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 15:55:33.781","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 15:57:42.390","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 15:57:42.392","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 15:57:42.749","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 16:03:18.274","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 16:03:18.275","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"taskTarget.created","2024-10-24 16:03:18.362","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 15:55:32.239","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 15:55:32.239","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 15:55:32.319","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 15:57:26.541","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 15:57:26.581","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 15:57:26.836","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 16:03:16.284","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 16:03:16.310","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"timelineActivity.created","2024-10-24 16:03:16.469","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 15:55:33.555","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 15:55:33.557","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 15:55:33.665","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 15:57:42.752","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 15:57:42.753","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 15:57:42.864","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 16:03:18.825","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 16:03:18.826","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"view.created","2024-10-24 16:03:18.968","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 15:55:33.519","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 15:55:33.520","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 15:55:33.604","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 15:57:44.535","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 15:57:44.535","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 15:57:44.649","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 16:03:19.752","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 16:03:19.754","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewField.created","2024-10-24 16:03:19.872","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 15:55:33.521","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 15:55:33.522","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 15:55:33.652","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 15:57:43.289","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 15:57:43.290","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 15:57:43.419","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 16:03:21.314","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 16:03:21.315","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewFilter.created","2024-10-24 16:03:23.508","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 15:55:35.156","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 15:55:35.158","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 15:55:35.205","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 15:57:40.833","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 15:57:40.840","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 15:57:41.421","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 16:03:17.860","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 16:03:17.860","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"viewSort.created","2024-10-24 16:03:17.966","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"webhook.created","2024-10-24 15:57:26.784","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"webhook.created","2024-10-24 15:57:26.787","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"webhook.created","2024-10-24 15:57:26.947","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"webhook.created","2024-10-24 16:03:16.340","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"webhook.created","2024-10-24 16:03:16.341","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"webhook.created","2024-10-24 16:03:16.555","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"webhook.response","2024-10-22 09:31:14.307","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""status"":200,""success"":true,""url"":""https://enfcx639bne28.x.pipedream.net"",""webhookId"":""90f12aed-0276-4bea-bcaa-c21ea2763d7d"",""eventName"":""company.create""}" +"webhook.response","2024-10-22 09:31:14.447","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""status"":405,""success"":false,""url"":""https://google.com"",""webhookId"":""57995a1c-7429-4846-ab9a-3073ddec7865"",""eventName"":""company.create""}" +"webhook.response","2024-10-22 09:31:14.453","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""success"":false,""url"":""a.com"",""webhookId"":""c19ea782-417e-4d44-a486-fd794fc44a27"",""eventName"":""company.create""}" +"webhook.response","2024-10-22 10:17:01.108","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""status"":200,""success"":true,""url"":""https://enfcx639bne28.x.pipedream.net"",""webhookId"":""90f12aed-0276-4bea-bcaa-c21ea2763d7d"",""eventName"":""company.create""}" +"webhook.response","2024-10-22 10:17:01.271","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""status"":405,""success"":false,""url"":""https://google.com"",""webhookId"":""57995a1c-7429-4846-ab9a-3073ddec7865"",""eventName"":""company.create""}" +"webhook.response","2024-10-22 10:17:01.277","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""success"":false,""url"":""a.com"",""webhookId"":""c19ea782-417e-4d44-a486-fd794fc44a27"",""eventName"":""company.create""}" +"webhook.response","2024-10-22 13:16:51.473","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""status"":200,""success"":true,""url"":""https://enfcx639bne28.x.pipedream.net"",""webhookId"":""90f12aed-0276-4bea-bcaa-c21ea2763d7d"",""eventName"":""company.create""}" +"webhook.response","2024-10-22 13:16:51.617","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""success"":false,""url"":""https://google.com"",""webhookId"":""57995a1c-7429-4846-ab9a-3073ddec7865"",""eventName"":""company.create"",""status"":405}" +"webhook.response","2024-10-22 13:16:51.621","1","webhook","20202020-1c25-4d02-bf25-6aeccf7ea419","{""success"":false,""url"":""a.com"",""webhookId"":""c19ea782-417e-4d44-a486-fd794fc44a27"",""eventName"":""company.create""}" +"workspaceMember.created","2024-10-24 15:55:32.038","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 15:55:32.039","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 15:55:32.223","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 15:57:26.646","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 15:57:26.647","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 15:57:26.854","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 16:03:16.337","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 16:03:16.337","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" +"workspaceMember.created","2024-10-24 16:03:16.490","1","20202020-9e3b-46d4-a556-88b9ddc2b034","20202020-1c25-4d02-bf25-6aeccf7ea419","{}" diff --git a/packages/twenty-tinybird/datasources/fixtures/pageview.csv b/packages/twenty-tinybird/datasources/fixtures/pageview.csv new file mode 100644 index 000000000..4cab99aeb --- /dev/null +++ b/packages/twenty-tinybird/datasources/fixtures/pageview.csv @@ -0,0 +1,11 @@ +"href","locale","pathname","referrer","sessionId","timeZone","timestamp","userAgent","userId","version","workspaceId" +"http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","en-US","/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","ebb6279c-c9a6-44c7-b751-6ee615e6a5fe","Europe/Paris","2024-10-17 12:30:33.604","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/objects/companies","en-US","/welcome","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:37:53.093","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/objects/companies","en-US","/objects/companies","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:37:53.184","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/settings/profile","en-US","/settings/profile","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:37:54.802","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/settings/integrations","en-US","/settings/integrations","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:37:56.686","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/settings/developers","en-US","/settings/developers","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:38:01.364","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","en-US","/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:38:02.518","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","en-US","/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:41:11.844","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/settings/profile","en-US","/settings/profile","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:41:23.864","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" +"http://localhost:3001/settings/appearance","en-US","/settings/appearance","http://localhost:3001/settings/developers/webhooks/41a8ad80-265a-425a-93da-35452d0ac83d","8fc30143-b648-4fc0-afe7-e55e1c452003","Europe/Paris","2024-10-17 12:41:25.972","Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/128.0.0.0 Safari/537.36","20202020-9e3b-46d4-a556-88b9ddc2b034","1","20202020-1c25-4d02-bf25-6aeccf7ea419" diff --git a/packages/twenty-tinybird/datasources/pageview.datasource b/packages/twenty-tinybird/datasources/pageview.datasource new file mode 100644 index 000000000..d1be6b7e3 --- /dev/null +++ b/packages/twenty-tinybird/datasources/pageview.datasource @@ -0,0 +1,16 @@ +SCHEMA > + `href` String `json:$.href`, + `locale` String `json:$.locale`, + `pathname` String `json:$.pathname`, + `referrer` String `json:$.referrer`, + `sessionId` String `json:$.sessionId`, + `timeZone` String `json:$.timeZone`, + `timestamp` DateTime64(3) `json:$.timestamp`, + `userAgent` String `json:$.userAgent`, + `userId` String `json:$.userId` DEFAULT '', + `version` String `json:$.version`, + `workspaceId` String `json:$.workspaceId` + +ENGINE MergeTree +ENGINE_PARTITION_KEY toYear(timestamp) +ENGINE_SORTING_KEY timestamp, userId, version, workspaceId diff --git a/packages/twenty-tinybird/datasources/serverlessFunctionEventMV.datasource b/packages/twenty-tinybird/datasources/serverlessFunctionEventMV.datasource new file mode 100644 index 000000000..fb9eb8f0b --- /dev/null +++ b/packages/twenty-tinybird/datasources/serverlessFunctionEventMV.datasource @@ -0,0 +1,11 @@ +SCHEMA > + `timestamp` DateTime64(3), + `workspaceId` String, + `functionId` String, + `durationInMs` Int64, + `success` Bool, + `errorType` String + +ENGINE MergeTree +ENGINE_PARTITION_KEY toYYYYMM(timestamp) +ENGINE_SORTING_KEY timestamp, functionId, success diff --git a/packages/twenty-tinybird/datasources/webhookEventMV.datasource b/packages/twenty-tinybird/datasources/webhookEventMV.datasource new file mode 100644 index 000000000..6ec1601a6 --- /dev/null +++ b/packages/twenty-tinybird/datasources/webhookEventMV.datasource @@ -0,0 +1,13 @@ +SCHEMA > + `timestamp` DateTime64(3), + `workspaceId` String, + `webhookId` String, + `url` String, + `success` UInt8, + `status` Int64, + `eventName` String, + `version` String + +ENGINE MergeTree +ENGINE_PARTITION_KEY toYYYYMM(timestamp) +ENGINE_SORTING_KEY timestamp, workspaceId diff --git a/packages/twenty-tinybird/includes/timeSeries.incl b/packages/twenty-tinybird/includes/timeSeries.incl new file mode 100644 index 000000000..b00dcd0df --- /dev/null +++ b/packages/twenty-tinybird/includes/timeSeries.incl @@ -0,0 +1,87 @@ +DESCRIPTION > + Inspired by DUB implementation + +NODE dayIntervals +SQL > + % + WITH + toStartOfDay( + toDateTime64({{ DateTime64(start, '2024-10-16 00:00:00.000') }}, 3), + {{ String(timezone, 'UTC') }} + ) AS start, + toStartOfDay( + toDateTime64({{ DateTime64(end, '2024-10-23 00:00:00.000') }}, 3), + {{ String(timezone, 'UTC') }} + ) AS + end + SELECT + arrayJoin( + arrayMap( + x -> toDateTime64(toStartOfDay(toDateTime64(x, 3), {{ String(timezone, 'UTC') }}), 3), + range(toUInt32(start + 86400), toUInt32(end + 86400), + 86400 + ) + ) + ) as interval + +NODE hourIntervals +SQL > + % + WITH + toStartOfHour( + toDateTime64({{ DateTime64(start, '2024-10-22 00:00:00.000') }}, 3), + {{ String(timezone, 'UTC') }} + ) AS start, + toStartOfHour( + toDateTime64({{ DateTime64(end, '2024-10-23 00:00:00.000') }}, 3), + {{ String(timezone, 'UTC') }} + ) AS + end + SELECT + arrayJoin( + arrayMap(x -> toDateTime64(x, 3), range(toUInt32(start + 3600), toUInt32(end + 3600), 3600) + ) + ) as interval + +NODE customIntervals +SQL > + % + WITH + time_series AS ( + SELECT + toDateTime64( + toDateTime( + toStartOfInterval( + toDateTime64({{ DateTime64(start, '2024-10-22 00:00:00.000') }}, 3), + INTERVAL {{ Int32(tickIntervalInMinutes, 420) }} MINUTE + ) + ) + + INTERVAL number * {{ Int32(tickIntervalInMinutes, 420) }} MINUTE, + 3 + ) AS interval + FROM + numbers( + 0, + 1 + intDiv( + dateDiff( + 'minute', + toDateTime64({{ DateTime64(start, '2024-10-22 00:00:00.000') }}, 3), + toDateTime64({{ DateTime64(end, '2024-10-23 00:00:00.000') }}, 3) + ), + {{ Int32(tickIntervalInMinutes, 420) }} + ) + ) + WHERE interval <= toDateTime64({{ DateTime64(end, '2024-10-23 00:00:00.000') }}, 3) + ) + SELECT interval + FROM time_series + +NODE selectIntervalByGranularity +SQL > + % + SELECT * + FROM + {% if granularity == "custom" %} customIntervals + {% elif granularity == "hour" %} hourIntervals + {% else %} dayIntervals + {% end %} diff --git a/packages/twenty-tinybird/pipes/getServerlessFunctionDuration.pipe b/packages/twenty-tinybird/pipes/getServerlessFunctionDuration.pipe new file mode 100644 index 000000000..c0d1bf068 --- /dev/null +++ b/packages/twenty-tinybird/pipes/getServerlessFunctionDuration.pipe @@ -0,0 +1,35 @@ +INCLUDE "../includes/timeSeries.incl" + +NODE timeSeriesServerlessFunctionDurationData +SQL > + % + SELECT + {% if granularity == "hour" %} toStartOfHour(timestamp, {{ String(timezone, 'UTC') }}) + {% elif granularity == "custom" %} + toDateTime64( + toStartOfMinute(timestamp, {{ String(timezone, 'UTC') }}), + 3, + {{ String(timezone, 'UTC') }} + ) + {% else %} toDateTime64(toStartOfDay(timestamp, {{ String(timezone, 'UTC') }}), 3) + {% end %} AS interval, + avg(CAST(durationInMs AS Float64)) as average, + min(durationInMs) as minimum, + max(durationInMs) as maximum + FROM serverlessFunctionEventMV + WHERE + true + AND functionId = {{ String(functionId, 'a9fd87c0-af86-4e17-be3a-a6d3d961678a', required=True) }} + AND workspaceId + ={{ String(workspaceId, '20202020-1c25-4d02-bf25-6aeccf7ea419', required=True) }} + AND timestamp >= {{ DateTime(start, '2024-10-22 00:00:00') }} + AND timestamp < {{ DateTime(end, '2024-10-23 00:00:00') }} + GROUP BY interval + ORDER BY interval + +NODE endpoint +SQL > + % + SELECT formatDateTime(interval, '%FT%T.000%z') as start, minimum, maximum, average + FROM selectIntervalByGranularity + LEFT JOIN timeSeriesServerlessFunctionDurationData USING interval diff --git a/packages/twenty-tinybird/pipes/getServerlessFunctionErrors.pipe b/packages/twenty-tinybird/pipes/getServerlessFunctionErrors.pipe new file mode 100644 index 000000000..04ece887b --- /dev/null +++ b/packages/twenty-tinybird/pipes/getServerlessFunctionErrors.pipe @@ -0,0 +1,41 @@ +INCLUDE "../includes/timeSeries.incl" + +NODE timeSeriesServerlessFunctionErrorsData +SQL > + % + SELECT + {% if granularity == "hour" %} toStartOfHour(timestamp, {{ String(timezone, 'UTC') }}) + {% elif granularity == "custom" %} + toDateTime64( + toStartOfMinute(timestamp, {{ String(timezone, 'UTC') }}), + 3, + {{ String(timezone, 'UTC') }} + ) + {% else %} toDateTime64(toStartOfDay(timestamp, {{ String(timezone, 'UTC') }}), 3) + {% end %} AS interval, + uniqIf(*, success = false) as error_count, + round( + if( + uniqIf(*, success = true) = 0, + 0, + (uniqIf(*, success = true) - uniqIf(*, success = false)) / uniqIf(*, success = true) + ), + 2 + ) as success_rate + FROM serverlessFunctionEventMV + WHERE + true + AND functionId = {{ String(functionId, 'a9fd87c0-af86-4e17-be3a-a6d3d961678a', required=True) }} + AND workspaceId + ={{ String(workspaceId, '20202020-1c25-4d02-bf25-6aeccf7ea419', required=True) }} + AND timestamp >= {{ DateTime(start, '2024-10-22 00:00:00') }} + AND timestamp < {{ DateTime(end, '2024-10-23 00:00:00') }} + GROUP BY interval + ORDER BY interval + +NODE endpoint +SQL > + % + SELECT formatDateTime(interval, '%FT%T.000%z') as start, error_count, success_rate + FROM selectIntervalByGranularity + LEFT JOIN timeSeriesServerlessFunctionErrorsData USING interval diff --git a/packages/twenty-tinybird/pipes/getWebhookAnalytics.pipe b/packages/twenty-tinybird/pipes/getWebhookAnalytics.pipe new file mode 100644 index 000000000..7fbfe67aa --- /dev/null +++ b/packages/twenty-tinybird/pipes/getWebhookAnalytics.pipe @@ -0,0 +1,34 @@ +INCLUDE "../includes/timeSeries.incl" + +NODE timeSeriesWebhookData +SQL > + % + SELECT + {% if granularity == "hour" %} toStartOfHour(timestamp, {{ String(timezone, 'UTC') }}) + {% elif granularity == "custom" %} + toDateTime64( + toStartOfMinute(timestamp, {{ String(timezone, 'UTC') }}), + 3, + {{ String(timezone, 'UTC') }} + ) + {% else %} toDateTime64(toStartOfDay(timestamp, {{ String(timezone, 'UTC') }}), 3) + {% end %} AS interval, + uniqIf(*, success = true) as success_count, + uniqIf(*, success = false) as failure_count + FROM webhookEventMV + WHERE + true + AND webhookId = {{ String(webhookId, '90f12aed-0276-4bea-bcaa-c21ea2763d7d', required=True) }} + AND workspaceId + ={{ String(workspaceId, '20202020-1c25-4d02-bf25-6aeccf7ea419', required=True) }} + AND timestamp >= {{ DateTime(start, '2024-10-22 00:00:00') }} + AND timestamp < {{ DateTime(end, '2024-10-23 00:00:00') }} + GROUP BY interval + ORDER BY interval + +NODE endpoint +SQL > + % + SELECT formatDateTime(interval, '%FT%T.000%z') as start, success_count, failure_count + FROM selectIntervalByGranularity + LEFT JOIN timeSeriesWebhookData USING interval diff --git a/packages/twenty-tinybird/pipes/materializeServerlessFunctionEvent.pipe b/packages/twenty-tinybird/pipes/materializeServerlessFunctionEvent.pipe new file mode 100644 index 000000000..8b234b4bc --- /dev/null +++ b/packages/twenty-tinybird/pipes/materializeServerlessFunctionEvent.pipe @@ -0,0 +1,14 @@ +NODE mv +SQL > + SELECT + timestamp, + workspaceId, + JSONExtractString(payload, 'functionId') as functionId, + JSONExtractInt(payload, 'duration') as durationInMs, + if(JSONExtractString(payload, 'status') = 'SUCCESS', TRUE, FALSE) as success, + JSONExtractString(payload, 'errorType') as errorType + FROM event + WHERE action = 'serverlessFunction.executed' + +TYPE MATERIALIZED +DATASOURCE serverlessFunctionEventMV diff --git a/packages/twenty-tinybird/pipes/materializeWebhookEvent.pipe b/packages/twenty-tinybird/pipes/materializeWebhookEvent.pipe new file mode 100644 index 000000000..98a72f009 --- /dev/null +++ b/packages/twenty-tinybird/pipes/materializeWebhookEvent.pipe @@ -0,0 +1,16 @@ +NODE mv +SQL > + SELECT + timestamp, + workspaceId, + JSONExtractString(payload, 'webhookId') as webhookId, + JSONExtractString(payload, 'url') as url, + JSONExtractBool(payload, 'success') as success, + JSONExtractInt(payload, 'status') as status, + JSONExtractString(payload, 'eventName') as eventName, + version + FROM event + WHERE action = 'webhook.response' + +TYPE MATERIALIZED +DATASOURCE webhookEventMV diff --git a/packages/twenty-tinybird/requirements.txt b/packages/twenty-tinybird/requirements.txt new file mode 100644 index 000000000..cea4440b3 --- /dev/null +++ b/packages/twenty-tinybird/requirements.txt @@ -0,0 +1 @@ +tinybird-cli==5.10.1 \ No newline at end of file diff --git a/packages/twenty-tinybird/scripts/append_fixtures.sh b/packages/twenty-tinybird/scripts/append_fixtures.sh new file mode 100755 index 000000000..e8745565a --- /dev/null +++ b/packages/twenty-tinybird/scripts/append_fixtures.sh @@ -0,0 +1,21 @@ + +#!/usr/bin/env bash +set -euxo pipefail + +directory="datasources/fixtures" +extensions=("csv" "ndjson") + +absolute_directory=$(realpath "$directory") + +for extension in "${extensions[@]}"; do + file_list=$(find "$absolute_directory" -type f -name "*.$extension") + + for file_path in $file_list; do + file_name=$(basename "$file_path") + file_name_without_extension="${file_name%.*}" + + command="tb datasource append $file_name_without_extension datasources/fixtures/$file_name" + echo $command + $command + done +done diff --git a/packages/twenty-tinybird/scripts/exec_test.sh b/packages/twenty-tinybird/scripts/exec_test.sh new file mode 100755 index 000000000..50571d952 --- /dev/null +++ b/packages/twenty-tinybird/scripts/exec_test.sh @@ -0,0 +1,58 @@ + +#!/usr/bin/env bash +set -euxo pipefail + +export TB_VERSION_WARNING=0 + +run_test() { + t=$1 + echo "** Running $t **" + echo "** $(cat $t)" + tmpfile=$(mktemp) + retries=0 + TOTAL_RETRIES=3 + + # When appending fixtures, we need to retry in case of the data is not replicated in time + while [ $retries -lt $TOTAL_RETRIES ]; do + # Run the test and store the output in a temporary file + bash $t $2 >$tmpfile + exit_code=$? + if [ "$exit_code" -eq 0 ]; then + # If the test passed, break the loop + if diff -B ${t}.result $tmpfile >/dev/null 2>&1; then + break + # If the test failed, increment the retries counter and try again + else + retries=$((retries+1)) + fi + # If the bash command failed, print an error message and break the loop + else + break + fi + done + + if diff -B ${t}.result $tmpfile >/dev/null 2>&1; then + echo "✅ Test $t passed" + rm $tmpfile + return 0 + elif [ $retries -eq $TOTAL_RETRIES ]; then + echo "🚨 ERROR: Test $t failed, diff:"; + diff -B ${t}.result $tmpfile + rm $tmpfile + return 1 + else + echo "🚨 ERROR: Test $t failed with bash command exit code $?" + cat $tmpfile + rm $tmpfile + return 1 + fi + echo "" +} +export -f run_test + +fail=0 +find ./tests -name "*.test" -print0 | xargs -0 -I {} -P 4 bash -c 'run_test "$@"' _ {} || fail=1 + +if [ $fail == 1 ]; then + exit -1; +fi diff --git a/packages/twenty-tinybird/tests/example.yml b/packages/twenty-tinybird/tests/example.yml new file mode 100644 index 000000000..14b2259a9 --- /dev/null +++ b/packages/twenty-tinybird/tests/example.yml @@ -0,0 +1,29 @@ + +############################################################################################################################## +### Visit https://www.tinybird.co/docs/production/implementing-test-strategies.html#data-quality-tests ### +### for more details on Data Quality tests ### +############################################################################################################################## + +- example_no_negative_numbers: + max_bytes_read: null + max_time: null + sql: | + SELECT + number + FROM numbers(10) + WHERE + number < 0 + +# - example_top_products_params_no_empty_top_10_on_2023: +# max_bytes_read: null +# max_time: null +# sql: | +# SELECT * +# FROM top_products_params +# WHERE empty(top_10) +# pipe: +# name: top_products_params +# params: +# start: '2023-01-01' +# end: '2023-12-31' + diff --git a/packages/twenty-tinybird/tests/regression.yaml b/packages/twenty-tinybird/tests/regression.yaml new file mode 100644 index 000000000..6d4708a4e --- /dev/null +++ b/packages/twenty-tinybird/tests/regression.yaml @@ -0,0 +1,25 @@ + +############################################################################################################################ +### Visit https://www.tinybird.co/docs/production/implementing-test-strategies.html#regression-tests ### +### for more details on Regression tests ### +############################################################################################################################ + +### +### New pipes are covered by this rule, rules below this one supersede this setting +### +- pipe: '.*' + tests: + - coverage: + + + +### +### These are rules to customize regression testing by pipe using regular expressions +### For instance skip regression tests for the pipes matching `endpoint_name.*` +### +- pipe: 'endpoint_name.*' + tests: + - coverage: + config: + skip: True + From f79e904dd61552570fc4addb7e439940b6e3edcb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?F=C3=A9lix=20Malfait?= Date: Tue, 29 Oct 2024 10:43:04 +0100 Subject: [PATCH 08/12] Enable Tinybird CI (#8168) Test to enable it in a second PR. I think it needed to merged in main first --- .github/workflows/ci-tinybird.yaml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/.github/workflows/ci-tinybird.yaml b/.github/workflows/ci-tinybird.yaml index 3678c0ea7..af4e591c6 100644 --- a/.github/workflows/ci-tinybird.yaml +++ b/.github/workflows/ci-tinybird.yaml @@ -1,11 +1,10 @@ name: CI Tinybird on: - # Temporarily disabled - # push: - # branches: - # - main + push: + branches: + - main - # pull_request: + pull_request: concurrency: From c0484aa9a2914108ef479dc1d93dd7202bfacab2 Mon Sep 17 00:00:00 2001 From: Harsh Singh Date: Tue, 29 Oct 2024 15:30:35 +0530 Subject: [PATCH 09/12] fix: dropdown max-height and padding bottom (#8167) Fixes: #6105 Also fixed side effect due to previous PR: [Screencast from 2024-10-29 13-54-44.webm](https://github.com/user-attachments/assets/f15db853-ca1c-4be8-9362-610122c4d988) --- .../ui/layout/dropdown/components/Dropdown.tsx | 15 ++++++++++++++- .../layout/dropdown/components/DropdownMenu.tsx | 2 ++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx index c4d62a560..ce7c7dbb4 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/Dropdown.tsx @@ -4,6 +4,7 @@ import { FloatingPortal, offset, Placement, + size, useFloating, } from '@floating-ui/react'; import { MouseEvent, useEffect, useRef } from 'react'; @@ -85,7 +86,19 @@ export const Dropdown = ({ const { refs, floatingStyles, placement } = useFloating({ placement: dropdownPlacement, - middleware: [flip(), ...offsetMiddlewares], + middleware: [ + flip(), + size({ + padding: 12 + 20, // 12px for padding bottom, 20px for dropdown bottom margin target + apply: ({ availableHeight, elements }) => { + elements.floating.style.maxHeight = + availableHeight >= elements.floating.scrollHeight + ? '' + : `${availableHeight}px`; + }, + }), + ...offsetMiddlewares, + ], whileElementsMounted: autoUpdate, strategy: dropdownStrategy, }); diff --git a/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx b/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx index 5ac402f98..8111b291b 100644 --- a/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx +++ b/packages/twenty-front/src/modules/ui/layout/dropdown/components/DropdownMenu.tsx @@ -25,6 +25,8 @@ const StyledDropdownMenu = styled.div<{ flex-direction: column; z-index: 30; + overflow-y: auto; + overflow-x: hidden; width: ${({ width = 160 }) => typeof width === 'number' ? `${width}px` : width}; `; From 95b475c8559e61cdca5f29caacc5e8ef3ec1eecf Mon Sep 17 00:00:00 2001 From: Sanskar Jain <52746480+sans-byte@users.noreply.github.com> Date: Tue, 29 Oct 2024 16:06:25 +0530 Subject: [PATCH 10/12] Fixes "No Result" flash and add a separator (#8140) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fix for #8137 --------- Co-authored-by: Félix Malfait --- .github/workflows/ci-tinybird.yaml | 2 +- .../components/MultiRecordSelect.tsx | 44 +++++++++++-------- 2 files changed, 27 insertions(+), 19 deletions(-) diff --git a/.github/workflows/ci-tinybird.yaml b/.github/workflows/ci-tinybird.yaml index af4e591c6..acc57bfd7 100644 --- a/.github/workflows/ci-tinybird.yaml +++ b/.github/workflows/ci-tinybird.yaml @@ -17,5 +17,5 @@ jobs: with: data_project_dir: packages/twenty-tinybird secrets: - tb_admin_token: ${{ secrets.TINYBIRD_ADMIN_TOKEN }} + tb_admin_token: ${{ secrets.TB_ADMIN_TOKEN }} tb_host: https://api.eu-central-1.aws.tinybird.co \ No newline at end of file diff --git a/packages/twenty-front/src/modules/object-record/relation-picker/components/MultiRecordSelect.tsx b/packages/twenty-front/src/modules/object-record/relation-picker/components/MultiRecordSelect.tsx index cc69eae40..b1c10cbbb 100644 --- a/packages/twenty-front/src/modules/object-record/relation-picker/components/MultiRecordSelect.tsx +++ b/packages/twenty-front/src/modules/object-record/relation-picker/components/MultiRecordSelect.tsx @@ -13,7 +13,6 @@ import { DropdownMenuSeparator } from '@/ui/layout/dropdown/components/DropdownM import { SelectableItem } from '@/ui/layout/selectable-list/components/SelectableItem'; import { SelectableList } from '@/ui/layout/selectable-list/components/SelectableList'; import { useSelectableList } from '@/ui/layout/selectable-list/hooks/useSelectableList'; -import { MenuItem } from '@/ui/navigation/menu-item/components/MenuItem'; import { usePreviousHotkeyScope } from '@/ui/utilities/hotkey/hooks/usePreviousHotkeyScope'; import { useScopedHotkeys } from '@/ui/utilities/hotkey/hooks/useScopedHotkeys'; import { useSetHotkeyScope } from '@/ui/utilities/hotkey/hooks/useSetHotkeyScope'; @@ -119,22 +118,15 @@ export const MultiRecordSelect = ({ ); })} - {objectRecordsIdsMultiSelect?.length === 0 && - !recordMultiSelectIsLoading && } ); const createNewButton = isDefined(onCreate) && ( - <> - - - onCreate?.(relationPickerSearchFilter)} - LeftIcon={IconPlus} - text="Add New" - /> - - + onCreate?.(relationPickerSearchFilter)} + LeftIcon={IconPlus} + text="Add New" + /> ); return ( @@ -148,12 +140,20 @@ export const MultiRecordSelect = ({ {dropdownPlacement?.includes('end') && ( <> - {createNewButton} + + {createNewButton} + + {results} {recordMultiSelectIsLoading && !relationPickerSearchFilter && ( - + <> + + + + )} + {objectRecordsIdsMultiSelect?.length > 0 && ( + )} - )} {recordMultiSelectIsLoading && !relationPickerSearchFilter && ( - + <> + + + )} {results} - {createNewButton} + {objectRecordsIdsMultiSelect?.length > 0 && ( + + )} + + {createNewButton} + )} From 2e10070fdbbed17331c03ab4961936eb30687b0f Mon Sep 17 00:00:00 2001 From: Antoine Moreaux Date: Tue, 29 Oct 2024 11:39:00 +0100 Subject: [PATCH 11/12] fix(sso): improve enterprise key var management (#8152) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve https://github.com/twentyhq/twenty/issues/8070 --------- Co-authored-by: Félix Malfait --- .../twenty-front/src/generated/graphql.tsx | 12 +-- .../auth/states/currentWorkspaceState.ts | 1 + ...ColumnDefinitionsFromFieldMetadata.test.ts | 1 + ...SettingsSSOIdentitiesProvidersListCard.tsx | 73 +++++++------------ ...sSSOIdentitiesProvidersListCardWrapper.tsx | 56 ++++++++++++++ ...OIdentitiesProvidersListEmptyStateCard.tsx | 33 --------- .../graphql/fragments/userQueryFragment.ts | 1 + .../settings/security/SettingsSecurity.tsx | 15 +++- .../src/testing/mock-data/users.ts | 1 + .../engine/core-modules/user/user.resolver.ts | 1 + .../workspace/workspace.resolver.ts | 8 ++ .../src/display/tag/components/Tag.tsx | 6 +- 12 files changed, 119 insertions(+), 89 deletions(-) create mode 100644 packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCardWrapper.tsx delete mode 100644 packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListEmptyStateCard.tsx diff --git a/packages/twenty-front/src/generated/graphql.tsx b/packages/twenty-front/src/generated/graphql.tsx index d18e39ba1..8635146f8 100644 --- a/packages/twenty-front/src/generated/graphql.tsx +++ b/packages/twenty-front/src/generated/graphql.tsx @@ -1,5 +1,5 @@ -import { gql } from '@apollo/client'; import * as Apollo from '@apollo/client'; +import { gql } from '@apollo/client'; export type Maybe = T | null; export type InputMaybe = Maybe; export type Exact = { [K in keyof T]: T[K] }; @@ -1283,6 +1283,7 @@ export type Workspace = { displayName?: Maybe; domainName?: Maybe; featureFlags?: Maybe>; + hasValidEntrepriseKey: Scalars['Boolean']; id: Scalars['UUID']; inviteHash?: Maybe; isPublicInviteLinkEnabled: Scalars['Boolean']; @@ -1688,7 +1689,7 @@ export type ImpersonateMutationVariables = Exact<{ }>; -export type ImpersonateMutation = { __typename?: 'Mutation', impersonate: { __typename?: 'Verify', user: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> }, tokens: { __typename?: 'AuthTokenPair', accessToken: { __typename?: 'AuthToken', token: string, expiresAt: string }, refreshToken: { __typename?: 'AuthToken', token: string, expiresAt: string } } } }; +export type ImpersonateMutation = { __typename?: 'Mutation', impersonate: { __typename?: 'Verify', user: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, hasValidEntrepriseKey: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> }, tokens: { __typename?: 'AuthTokenPair', accessToken: { __typename?: 'AuthToken', token: string, expiresAt: string }, refreshToken: { __typename?: 'AuthToken', token: string, expiresAt: string } } } }; export type RenewTokenMutationVariables = Exact<{ appToken: Scalars['String']; @@ -1721,7 +1722,7 @@ export type VerifyMutationVariables = Exact<{ }>; -export type VerifyMutation = { __typename?: 'Mutation', verify: { __typename?: 'Verify', user: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> }, tokens: { __typename?: 'AuthTokenPair', accessToken: { __typename?: 'AuthToken', token: string, expiresAt: string }, refreshToken: { __typename?: 'AuthToken', token: string, expiresAt: string } } } }; +export type VerifyMutation = { __typename?: 'Mutation', verify: { __typename?: 'Verify', user: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, hasValidEntrepriseKey: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> }, tokens: { __typename?: 'AuthTokenPair', accessToken: { __typename?: 'AuthToken', token: string, expiresAt: string }, refreshToken: { __typename?: 'AuthToken', token: string, expiresAt: string } } } }; export type CheckUserExistsQueryVariables = Exact<{ email: Scalars['String']; @@ -1808,7 +1809,7 @@ export type ListSsoIdentityProvidersByWorkspaceIdQueryVariables = Exact<{ [key: export type ListSsoIdentityProvidersByWorkspaceIdQuery = { __typename?: 'Query', listSSOIdentityProvidersByWorkspaceId: Array<{ __typename?: 'FindAvailableSSOIDPOutput', type: IdpType, id: string, name: string, issuer: string, status: SsoIdentityProviderStatus }> }; -export type UserQueryFragmentFragment = { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> }; +export type UserQueryFragmentFragment = { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, hasValidEntrepriseKey: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> }; export type DeleteUserAccountMutationVariables = Exact<{ [key: string]: never; }>; @@ -1825,7 +1826,7 @@ export type UploadProfilePictureMutation = { __typename?: 'Mutation', uploadProf export type GetCurrentUserQueryVariables = Exact<{ [key: string]: never; }>; -export type GetCurrentUserQuery = { __typename?: 'Query', currentUser: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> } }; +export type GetCurrentUserQuery = { __typename?: 'Query', currentUser: { __typename?: 'User', id: any, firstName: string, lastName: string, email: string, canImpersonate: boolean, supportUserHash?: string | null, analyticsTinybirdJwt?: string | null, onboardingStatus?: OnboardingStatus | null, userVars: any, workspaceMember?: { __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } } | null, workspaceMembers?: Array<{ __typename?: 'WorkspaceMember', id: any, colorScheme: string, avatarUrl?: string | null, locale?: string | null, timeZone?: string | null, dateFormat?: WorkspaceMemberDateFormatEnum | null, timeFormat?: WorkspaceMemberTimeFormatEnum | null, name: { __typename?: 'FullName', firstName: string, lastName: string } }> | null, defaultWorkspace: { __typename?: 'Workspace', id: any, displayName?: string | null, logo?: string | null, domainName?: string | null, inviteHash?: string | null, allowImpersonation: boolean, activationStatus: WorkspaceActivationStatus, isPublicInviteLinkEnabled: boolean, hasValidEntrepriseKey: boolean, metadataVersion: number, workspaceMembersCount?: number | null, featureFlags?: Array<{ __typename?: 'FeatureFlag', id: any, key: string, value: boolean, workspaceId: string }> | null, currentBillingSubscription?: { __typename?: 'BillingSubscription', id: any, status: SubscriptionStatus, interval?: SubscriptionInterval | null } | null }, workspaces: Array<{ __typename?: 'UserWorkspace', workspace?: { __typename?: 'Workspace', id: any, logo?: string | null, displayName?: string | null, domainName?: string | null } | null }> } }; export type ActivateWorkflowVersionMutationVariables = Exact<{ workflowVersionId: Scalars['String']; @@ -2062,6 +2063,7 @@ export const UserQueryFragmentFragmentDoc = gql` allowImpersonation activationStatus isPublicInviteLinkEnabled + hasValidEntrepriseKey featureFlags { id key diff --git a/packages/twenty-front/src/modules/auth/states/currentWorkspaceState.ts b/packages/twenty-front/src/modules/auth/states/currentWorkspaceState.ts index e384b5b6a..fde976113 100644 --- a/packages/twenty-front/src/modules/auth/states/currentWorkspaceState.ts +++ b/packages/twenty-front/src/modules/auth/states/currentWorkspaceState.ts @@ -14,6 +14,7 @@ export type CurrentWorkspace = Pick< | 'currentBillingSubscription' | 'workspaceMembersCount' | 'isPublicInviteLinkEnabled' + | 'hasValidEntrepriseKey' | 'metadataVersion' >; diff --git a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts index 13f5bec9a..2205cd82a 100644 --- a/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts +++ b/packages/twenty-front/src/modules/object-metadata/hooks/__tests__/useColumnDefinitionsFromFieldMetadata.test.ts @@ -16,6 +16,7 @@ const Wrapper = getJestMetadataAndApolloMocksWrapper({ featureFlags: [], allowImpersonation: false, activationStatus: WorkspaceActivationStatus.Active, + hasValidEntrepriseKey: false, metadataVersion: 1, isPublicInviteLinkEnabled: false, }); diff --git a/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCard.tsx b/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCard.tsx index 1a4781990..2ab21068a 100644 --- a/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCard.tsx +++ b/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCard.tsx @@ -1,61 +1,40 @@ /* @license Enterprise */ -import { useNavigate } from 'react-router-dom'; +import { Link } from 'react-router-dom'; import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath'; import { SettingsPath } from '@/types/SettingsPath'; -import { SettingsSSOIdentitiesProvidersListEmptyStateCard } from '@/settings/security/components/SettingsSSOIdentitiesProvidersListEmptyStateCard'; -import { SettingsSSOIdentityProviderRowRightContainer } from '@/settings/security/components/SettingsSSOIdentityProviderRowRightContainer'; +import { currentWorkspaceState } from '@/auth/states/currentWorkspaceState'; +import { SettingsCard } from '@/settings/components/SettingsCard'; +import { SettingsSSOIdentitiesProvidersListCardWrapper } from '@/settings/security/components/SettingsSSOIdentitiesProvidersListCardWrapper'; import { SSOIdentitiesProvidersState } from '@/settings/security/states/SSOIdentitiesProviders.state'; -import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar'; -import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; -import { useRecoilState } from 'recoil'; -import { useListSsoIdentityProvidersByWorkspaceIdQuery } from '~/generated/graphql'; -import { SettingsListCard } from '../../components/SettingsListCard'; -import { guessSSOIdentityProviderIconByUrl } from '../utils/guessSSOIdentityProviderIconByUrl'; +import styled from '@emotion/styled'; +import { useRecoilValue } from 'recoil'; +import { IconKey } from 'twenty-ui'; + +const StyledLink = styled(Link)<{ isDisabled: boolean }>` + pointer-events: ${({ isDisabled }) => (isDisabled ? 'none' : 'auto')}; + text-decoration: none; +`; export const SettingsSSOIdentitiesProvidersListCard = () => { - const navigate = useNavigate(); - const { enqueueSnackBar } = useSnackBar(); + const currentWorkspace = useRecoilValue(currentWorkspaceState); - const [SSOIdentitiesProviders, setSSOIdentitiesProviders] = useRecoilState( - SSOIdentitiesProvidersState, - ); + const SSOIdentitiesProviders = useRecoilValue(SSOIdentitiesProvidersState); - const { loading } = useListSsoIdentityProvidersByWorkspaceIdQuery({ - onCompleted: (data) => { - setSSOIdentitiesProviders( - data?.listSSOIdentityProvidersByWorkspaceId ?? [], - ); - }, - onError: (error: Error) => { - enqueueSnackBar(error.message, { - variant: SnackBarVariant.Error, - }); - }, - }); - - return !SSOIdentitiesProviders.length && !loading ? ( - + return !SSOIdentitiesProviders.length ? ( + + } + /> + ) : ( - - `${SSOIdentityProvider.name} - ${SSOIdentityProvider.type}` - } - isLoading={loading} - RowIconFn={(SSOIdentityProvider) => - guessSSOIdentityProviderIconByUrl(SSOIdentityProvider.issuer) - } - RowRightComponent={({ item: SSOIdp }) => ( - - )} - hasFooter - footerButtonLabel="Add SSO Identity Provider" - onFooterButtonClick={() => - navigate(getSettingsPagePath(SettingsPath.NewSSOIdentityProvider)) - } - /> + ); }; diff --git a/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCardWrapper.tsx b/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCardWrapper.tsx new file mode 100644 index 000000000..360f7bd33 --- /dev/null +++ b/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListCardWrapper.tsx @@ -0,0 +1,56 @@ +/* @license Enterprise */ + +import { guessSSOIdentityProviderIconByUrl } from '@/settings/security/utils/guessSSOIdentityProviderIconByUrl'; +import { SettingsSSOIdentityProviderRowRightContainer } from '@/settings/security/components/SettingsSSOIdentityProviderRowRightContainer'; +import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath'; +import { SettingsPath } from '@/types/SettingsPath'; +import { SettingsListCard } from '@/settings/components/SettingsListCard'; +import { useListSsoIdentityProvidersByWorkspaceIdQuery } from '~/generated/graphql'; +import { SnackBarVariant } from '@/ui/feedback/snack-bar-manager/components/SnackBar'; +import { SSOIdentitiesProvidersState } from '@/settings/security/states/SSOIdentitiesProviders.state'; +import { useSnackBar } from '@/ui/feedback/snack-bar-manager/hooks/useSnackBar'; +import { useRecoilState } from 'recoil'; +import { useNavigate } from 'react-router-dom'; + +export const SettingsSSOIdentitiesProvidersListCardWrapper = () => { + const { enqueueSnackBar } = useSnackBar(); + const navigate = useNavigate(); + + const [SSOIdentitiesProviders, setSSOIdentitiesProviders] = useRecoilState( + SSOIdentitiesProvidersState, + ); + + const { loading } = useListSsoIdentityProvidersByWorkspaceIdQuery({ + onCompleted: (data) => { + setSSOIdentitiesProviders( + data?.listSSOIdentityProvidersByWorkspaceId ?? [], + ); + }, + onError: (error: Error) => { + enqueueSnackBar(error.message, { + variant: SnackBarVariant.Error, + }); + }, + }); + + return ( + + `${SSOIdentityProvider.name} - ${SSOIdentityProvider.type}` + } + isLoading={loading} + RowIconFn={(SSOIdentityProvider) => + guessSSOIdentityProviderIconByUrl(SSOIdentityProvider.issuer) + } + RowRightComponent={({ item: SSOIdp }) => ( + + )} + hasFooter + footerButtonLabel="Add SSO Identity Provider" + onFooterButtonClick={() => + navigate(getSettingsPagePath(SettingsPath.NewSSOIdentityProvider)) + } + /> + ); +}; diff --git a/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListEmptyStateCard.tsx b/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListEmptyStateCard.tsx deleted file mode 100644 index 7645a3213..000000000 --- a/packages/twenty-front/src/modules/settings/security/components/SettingsSSOIdentitiesProvidersListEmptyStateCard.tsx +++ /dev/null @@ -1,33 +0,0 @@ -/* @license Enterprise */ - -import { getSettingsPagePath } from '@/settings/utils/getSettingsPagePath'; -import { SettingsPath } from '@/types/SettingsPath'; -import styled from '@emotion/styled'; -import { Button, Card, CardContent, CardHeader, IconKey } from 'twenty-ui'; - -const StyledHeader = styled(CardHeader)` - align-items: center; - display: flex; - height: ${({ theme }) => theme.spacing(6)}; -`; - -const StyledBody = styled(CardContent)` - display: flex; - justify-content: center; -`; - -export const SettingsSSOIdentitiesProvidersListEmptyStateCard = () => { - return ( - - {'No SSO Identity Providers Configured'} - -