From 7d28de6a5848bddf44357026f7a8cc2da435d536 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 1 Dec 2021 13:15:52 +0100 Subject: [PATCH 01/24] Bump webpack from 5.59.1 to 5.64.4 (#2620) Bumps [webpack](https://github.com/webpack/webpack) from 5.59.1 to 5.64.4. - [Release notes](https://github.com/webpack/webpack/releases) - [Commits](https://github.com/webpack/webpack/compare/v5.59.1...v5.64.4) --- updated-dependencies: - dependency-name: webpack dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 56 ++++++++++++++-------------------------------------- 2 files changed, 16 insertions(+), 42 deletions(-) diff --git a/package.json b/package.json index f888188381..78695f7d50 100644 --- a/package.json +++ b/package.json @@ -67,7 +67,7 @@ "terser-webpack-plugin": "^5.2.4", "typescript": "4.3.5", "url-loader": "^4.1.1", - "webpack": "5.59.1", + "webpack": "5.64.4", "webpack-bundle-analyzer": "^4.5.0", "webpack-cli": "^4.8.0", "webpack-dev-server": "^3.11.2" diff --git a/yarn.lock b/yarn.lock index 418a3a2598..efa8727058 100644 --- a/yarn.lock +++ b/yarn.lock @@ -2244,18 +2244,7 @@ braces@^3.0.1, braces@~3.0.2: dependencies: fill-range "^7.0.1" -browserslist@^4.14.5, browserslist@^4.17.3: - version "4.17.4" - resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.17.4.tgz#72e2508af2a403aec0a49847ef31bd823c57ead4" - integrity sha512-Zg7RpbZpIJRW3am9Lyckue7PLytvVxxhJj1CaJVlCWENsGEAOlnlt8X0ZxGRPp7Bt9o8tIRM5SEXy4BCPMJjLQ== - dependencies: - caniuse-lite "^1.0.30001265" - electron-to-chromium "^1.3.867" - escalade "^3.1.1" - node-releases "^2.0.0" - picocolors "^1.0.0" - -browserslist@^4.17.5: +browserslist@^4.14.5, browserslist@^4.17.3, browserslist@^4.17.5: version "4.18.1" resolved "https://registry.yarnpkg.com/browserslist/-/browserslist-4.18.1.tgz#60d3920f25b6860eb917c6c7b185576f4d8b017f" integrity sha512-8ScCzdpPwR2wQh8IT82CA2VgDwjHyqMovPBZSNH54+tm4Jk2pCuv90gmAdH6J84OCRWi0b4gMe6O6XPXuJnjgQ== @@ -2352,11 +2341,6 @@ camelcase@^6.2.0: resolved "https://registry.npmjs.org/camelcase/-/camelcase-6.2.0.tgz" integrity sha512-c7wVvbw3f37nuobQNtgsgG9POC9qMbNuMQmTCqZv23b6MIz0fcYpBiOlv9gEN/hdLdnZTDQhg6e9Dq5M1vKvfg== -caniuse-lite@^1.0.30001265: - version "1.0.30001267" - resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001267.tgz#b1cf2937175afc0570e4615fc2d2f9069fa0ed30" - integrity sha512-r1mjTzAuJ9W8cPBGbbus8E0SKcUP7gn03R14Wk8FlAlqhH9hroy9nLqmpuXlfKEw/oILW+FGz47ipXV2O7x8lg== - caniuse-lite@^1.0.30001280: version "1.0.30001282" resolved "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001282.tgz#38c781ee0a90ccfe1fe7fefd00e43f5ffdcb96fd" @@ -3143,11 +3127,6 @@ ee-first@1.1.1: resolved "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz" integrity sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0= -electron-to-chromium@^1.3.867: - version "1.3.870" - resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.870.tgz#c15c921e66a46985181b261f8093b91c2abb6604" - integrity sha512-PiJMshfq6PL+i1V+nKLwhHbCKeD8eAz8rvO9Cwk/7cChOHJBtufmjajLyYLsSRHguRFiOCVx3XzJLeZsIAYfSA== - electron-to-chromium@^1.3.896: version "1.3.900" resolved "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.900.tgz#5be2c5818a2a012c511b4b43e87b6ab7a296d4f5" @@ -5611,11 +5590,6 @@ node-forge@^0.10.0: resolved "https://registry.npmjs.org/node-forge/-/node-forge-0.10.0.tgz" integrity sha512-PPmu8eEeG9saEUvI97fm4OYxXVB6bFvyNTyiUOBichBpFG8A1Ljw3bY62+5oOjDEMHRnd0Y7HQ+x7uzxOzC6JA== -node-releases@^2.0.0: - version "2.0.0" - resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.0.tgz#67dc74903100a7deb044037b8a2e5f453bb05400" - integrity sha512-aA87l0flFYMzCHpTM3DERFSYxc6lv/BltdbRTOMZuxZ0cwZCD3mejE5n9vLhSJCN++/eOqr77G1IO5uXxlQYWA== - node-releases@^2.0.1: version "2.0.1" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.1.tgz#3d1d395f204f1f2f29a54358b9fb678765ad2fc5" @@ -7878,10 +7852,10 @@ warning@^4.0.3: dependencies: loose-envify "^1.0.0" -watchpack@^2.2.0: - version "2.2.0" - resolved "https://registry.npmjs.org/watchpack/-/watchpack-2.2.0.tgz" - integrity sha512-up4YAn/XHgZHIxFBVCdlMiWDj6WaLKpwVeGQk2I5thdYxF/KmF0aaz6TfJZ/hfl1h/XlcDr7k1KH7ThDagpFaA== +watchpack@^2.3.0: + version "2.3.0" + resolved "https://registry.yarnpkg.com/watchpack/-/watchpack-2.3.0.tgz#a41bca3da6afaff31e92a433f4c856a0c25ea0c4" + integrity sha512-MnN0Q1OsvB/GGHETrFeZPQaOelWh/7O+EiFlj8sM9GPjtQkis7k01aAxrg/18kTfoIVcLL+haEVFlXDaSRwKRw== dependencies: glob-to-regexp "^0.4.1" graceful-fs "^4.1.2" @@ -7998,15 +7972,15 @@ webpack-merge@^5.7.3: clone-deep "^4.0.1" wildcard "^2.0.0" -webpack-sources@^3.2.0: - version "3.2.1" - resolved "https://registry.npmjs.org/webpack-sources/-/webpack-sources-3.2.1.tgz" - integrity sha512-t6BMVLQ0AkjBOoRTZgqrWm7xbXMBzD+XDq2EZ96+vMfn3qKgsvdXZhbPZ4ElUOpdv4u+iiGe+w3+J75iy/bYGA== +webpack-sources@^3.2.2: + version "3.2.2" + resolved "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-3.2.2.tgz#d88e3741833efec57c4c789b6010db9977545260" + integrity sha512-cp5qdmHnu5T8wRg2G3vZZHoJPN14aqQ89SyQ11NpGH5zEMDCclt49rzo+MaRazk7/UeILhAI+/sEtcM+7Fr0nw== -webpack@5.59.1: - version "5.59.1" - resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.59.1.tgz#60c77e9aad796252153d4d7ab6b2d4c11f0e548c" - integrity sha512-I01IQV9K96FlpXX3V0L4nvd7gb0r7thfuu1IfT2P4uOHOA77nKARAKDYGe/tScSHKnffNIyQhLC8kRXzY4KEHQ== +webpack@5.64.4: + version "5.64.4" + resolved "https://registry.yarnpkg.com/webpack/-/webpack-5.64.4.tgz#e1454b6a13009f57cc2c78e08416cd674622937b" + integrity sha512-LWhqfKjCLoYJLKJY8wk2C3h77i8VyHowG3qYNZiIqD6D0ZS40439S/KVuc/PY48jp2yQmy0mhMknq8cys4jFMw== dependencies: "@types/eslint-scope" "^3.7.0" "@types/estree" "^0.0.50" @@ -8030,8 +8004,8 @@ webpack@5.59.1: schema-utils "^3.1.0" tapable "^2.1.1" terser-webpack-plugin "^5.1.3" - watchpack "^2.2.0" - webpack-sources "^3.2.0" + watchpack "^2.3.0" + webpack-sources "^3.2.2" websocket-driver@>=0.5.1, websocket-driver@^0.7.4: version "0.7.4" From f4c71bd343fd9880a9fdea43010605093f8a8103 Mon Sep 17 00:00:00 2001 From: Pascal Holy Date: Wed, 1 Dec 2021 13:34:46 +0100 Subject: [PATCH 02/24] Bump version to 0.37.1-alpha --- VERSION | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/VERSION b/VERSION index 19199bccac..ed68852ec0 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.36.1 +0.37.1-alpha From 8a2c477e563a0764879f3d579a9aab9b38f5a9b9 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 3 Dec 2021 11:44:42 +0100 Subject: [PATCH 03/24] Bump @babel/preset-typescript from 7.15.0 to 7.16.0 (#2599) Bumps [@babel/preset-typescript](https://github.com/babel/babel/tree/HEAD/packages/babel-preset-typescript) from 7.15.0 to 7.16.0. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.16.0/packages/babel-preset-typescript) --- updated-dependencies: - dependency-name: "@babel/preset-typescript" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 49 ++++++++++++++++++++++++++++++++++--------------- 2 files changed, 35 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index 78695f7d50..3e9fe3f588 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ "@babel/plugin-transform-spread": "^7.16.0", "@babel/preset-env": "^7.15.8", "@babel/preset-react": "^7.14.5", - "@babel/preset-typescript": "^7.15.0", + "@babel/preset-typescript": "^7.16.0", "@bazel/typescript": "^4.3.0", "@svgr/webpack": "^5.5.0", "@types/lodash-es": "^4.17.5", diff --git a/yarn.lock b/yarn.lock index efa8727058..224b0d617f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -63,6 +63,13 @@ dependencies: "@babel/types" "^7.15.4" +"@babel/helper-annotate-as-pure@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.16.0.tgz#9a1f0ebcda53d9a2d00108c4ceace6a5d5f1f08d" + integrity sha512-ItmYF9vR4zA8cByDocY05o0LGUkp1zhbTQOH1NFyl5xXEqlTJQCEJjieriw+aFpxo16swMxUnUiKS7a/r4vtHg== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-builder-binary-assignment-operator-visitor@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.14.5.tgz" @@ -93,6 +100,18 @@ "@babel/helper-replace-supers" "^7.15.4" "@babel/helper-split-export-declaration" "^7.15.4" +"@babel/helper-create-class-features-plugin@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" + integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== + dependencies: + "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/helper-create-regexp-features-plugin@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.14.5.tgz" @@ -587,10 +606,10 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-syntax-typescript@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.14.5.tgz" - integrity sha512-u6OXzDaIXjEstBRRoBCQ/uKQKlbuaeE5in0RvWdA4pN6AhqxTIwUsnHPU1CFZA/amYObMsuWhYfRl3Ch90HD0Q== +"@babel/plugin-syntax-typescript@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.16.0.tgz#2feeb13d9334cc582ea9111d3506f773174179bb" + integrity sha512-Xv6mEXqVdaqCBfJFyeab0fH2DnUoMsDmhamxsSi4j8nLd4Vtw213WMJr55xxqipC/YVWyPY3K0blJncPYji+dQ== dependencies: "@babel/helper-plugin-utils" "^7.14.5" @@ -867,14 +886,14 @@ dependencies: "@babel/helper-plugin-utils" "^7.14.5" -"@babel/plugin-transform-typescript@^7.15.0": - version "7.15.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.15.4.tgz" - integrity sha512-sM1/FEjwYjXvMwu1PJStH11kJ154zd/lpY56NQJ5qH2D0mabMv1CAy/kdvS9RP4Xgfj9fBBA3JiSLdDHgXdzOA== +"@babel/plugin-transform-typescript@^7.16.0": + version "7.16.1" + resolved "https://registry.yarnpkg.com/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.16.1.tgz#cc0670b2822b0338355bc1b3d2246a42b8166409" + integrity sha512-NO4XoryBng06jjw/qWEU2LhcLJr1tWkhpMam/H4eas/CDKMX/b2/Ylb6EI256Y7+FVPCawwSM1rrJNOpDiz+Lg== dependencies: - "@babel/helper-create-class-features-plugin" "^7.15.4" + "@babel/helper-create-class-features-plugin" "^7.16.0" "@babel/helper-plugin-utils" "^7.14.5" - "@babel/plugin-syntax-typescript" "^7.14.5" + "@babel/plugin-syntax-typescript" "^7.16.0" "@babel/plugin-transform-unicode-escapes@^7.14.5": version "7.14.5" @@ -993,14 +1012,14 @@ "@babel/plugin-transform-react-jsx-development" "^7.14.5" "@babel/plugin-transform-react-pure-annotations" "^7.14.5" -"@babel/preset-typescript@^7.15.0": - version "7.15.0" - resolved "https://registry.npmjs.org/@babel/preset-typescript/-/preset-typescript-7.15.0.tgz" - integrity sha512-lt0Y/8V3y06Wq/8H/u0WakrqciZ7Fz7mwPDHWUJAXlABL5hiUG42BNlRXiELNjeWjO5rWmnNKlx+yzJvxezHow== +"@babel/preset-typescript@^7.16.0": + version "7.16.0" + resolved "https://registry.yarnpkg.com/@babel/preset-typescript/-/preset-typescript-7.16.0.tgz#b0b4f105b855fb3d631ec036cdc9d1ffd1fa5eac" + integrity sha512-txegdrZYgO9DlPbv+9QOVpMnKbOtezsLHWsnsRF4AjbSIsVaujrq1qg8HK0mxQpWv0jnejt0yEoW1uWpvbrDTg== dependencies: "@babel/helper-plugin-utils" "^7.14.5" "@babel/helper-validator-option" "^7.14.5" - "@babel/plugin-transform-typescript" "^7.15.0" + "@babel/plugin-transform-typescript" "^7.16.0" "@babel/runtime@^7.0.0", "@babel/runtime@^7.1.2", "@babel/runtime@^7.12.0", "@babel/runtime@^7.12.1", "@babel/runtime@^7.12.13", "@babel/runtime@^7.14.5", "@babel/runtime@^7.15.4", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": version "7.16.0" From 2422f0f64091ca259cb6da931e2ce31b008b2438 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 8 Dec 2021 09:56:54 +0100 Subject: [PATCH 04/24] Bump algoliasearch-helper from 3.4.4 to 3.6.2 in /docs (#2614) Bumps [algoliasearch-helper](https://github.com/algolia/algoliasearch-helper-js) from 3.4.4 to 3.6.2. - [Release notes](https://github.com/algolia/algoliasearch-helper-js/releases) - [Changelog](https://github.com/algolia/algoliasearch-helper-js/blob/develop/CHANGELOG) - [Commits](https://github.com/algolia/algoliasearch-helper-js/compare/3.4.4...3.6.2) --- updated-dependencies: - dependency-name: algoliasearch-helper dependency-type: indirect ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- docs/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/yarn.lock b/docs/yarn.lock index 26db3e8608..531d8e0f7e 100644 --- a/docs/yarn.lock +++ b/docs/yarn.lock @@ -2040,9 +2040,9 @@ ajv@^6.1.0, ajv@^6.10.2, ajv@^6.12.4, ajv@^6.12.5: uri-js "^4.2.2" algoliasearch-helper@^3.3.4: - version "3.4.4" - resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.4.4.tgz#f2eb46bc4d2f6fed82c7201b8ac4ce0a1988ae67" - integrity sha512-OjyVLjykaYKCMxxRMZNiwLp8CS310E0qAeIY2NaublcmLAh8/SL19+zYHp7XCLtMem2ZXwl3ywMiA32O9jszuw== + version "3.6.2" + resolved "https://registry.yarnpkg.com/algoliasearch-helper/-/algoliasearch-helper-3.6.2.tgz#45e19b12589cfa0c611b573287f65266ea2cc14a" + integrity sha512-Xx0NOA6k4ySn+R2l3UMSONAaMkyfmrZ3AP1geEMo32MxDJQJesZABZYsldO9fa6FKQxH91afhi4hO1G0Zc2opg== dependencies: events "^1.1.1" From 80af39a07b85f76af0d2cdeedd19a9cfa1f13111 Mon Sep 17 00:00:00 2001 From: Aitor Algorta Date: Wed, 8 Dec 2021 11:13:36 +0100 Subject: [PATCH 05/24] [#2611] Session timeout (#2630) * wip * fix more problems * linting * fix reconnection problem * linting --- .../AiryInputBar/index.module.scss | 4 +-- .../airyRenderProps/AiryInputBar/index.tsx | 6 ++-- .../chat-plugin/lib/src/websocket/index.ts | 8 +++-- frontend/ui/src/assets/scss/fonts.scss | 36 +++++++++---------- .../MessageInput/InputOptions.module.scss | 2 +- lib/typescript/assets/scss/fonts.scss | 36 +++++++++---------- 6 files changed, 49 insertions(+), 43 deletions(-) diff --git a/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.module.scss b/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.module.scss index c4c625764f..988e49c396 100644 --- a/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.module.scss +++ b/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.module.scss @@ -198,7 +198,7 @@ svg { path { - fill: #4bb3fd; + fill: var(--color-airy-accent); } } @@ -208,7 +208,7 @@ } .fileInput { - display: none; + display: none !important; } .selectorLoader { diff --git a/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.tsx b/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.tsx index 72fb2f32a8..76528986cb 100644 --- a/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.tsx +++ b/frontend/chat-plugin/lib/src/airyRenderProps/AiryInputBar/index.tsx @@ -42,8 +42,10 @@ const AiryInputBar = (props: AiryInputBarProps) => { const isMobileDevice = window.innerHeight < 1200 || window.innerWidth < 1000; useEffect(() => { - textInputRef.current.selectionStart = props.messageString?.length ?? 0; - textInputRef.current.selectionEnd = props.messageString?.length ?? 0; + if (textInputRef.current) { + textInputRef.current.selectionStart = props.messageString?.length ?? 0; + textInputRef.current.selectionEnd = props.messageString?.length ?? 0; + } }, []); useEffect(() => { diff --git a/frontend/chat-plugin/lib/src/websocket/index.ts b/frontend/chat-plugin/lib/src/websocket/index.ts index 1c18f0264f..15a403df3e 100644 --- a/frontend/chat-plugin/lib/src/websocket/index.ts +++ b/frontend/chat-plugin/lib/src/websocket/index.ts @@ -70,9 +70,13 @@ class WebSocket { this.client.onStompError = (frame: IFrame) => { console.error('Broker reported error: ' + frame.headers['message']); console.error('Additional details: ' + frame.body); - authenticate(this.channelId); + if (frame.headers['message'].includes('401')) { + this.client.deactivate(); + this.start(); + } else { + authenticate(this.channelId); + } }; - this.client.activate(); }; diff --git a/frontend/ui/src/assets/scss/fonts.scss b/frontend/ui/src/assets/scss/fonts.scss index 7ee32d73a8..c9037aecc6 100644 --- a/frontend/ui/src/assets/scss/fonts.scss +++ b/frontend/ui/src/assets/scss/fonts.scss @@ -2,56 +2,56 @@ @mixin font-s { font-family: 'Lato', sans-serif; - font-size: 0.8rem; // 13px - line-height: 1rem; + font-size: 13px; + line-height: 16px; } @mixin font-base { font-family: 'Lato', sans-serif; - font-size: 1rem; // 16 px - line-height: 1.5rem; + font-size: 16px; + line-height: 24px; } @mixin font-m { font-family: 'Lato', sans-serif; - font-size: 1.25rem; // 20px - line-height: 2rem; + font-size: 20px; + line-height: 32px; } @mixin font-l { font-family: 'Lato', sans-serif; - font-size: 1.563rem; // 25px - line-height: 2rem; + font-size: 25px; + line-height: 32px; } @mixin font-xl { font-family: 'Lato', sans-serif; - font-size: 1.953rem; // 31px - line-height: 2.5rem; + font-size: 31px; + line-height: 42px; } @mixin font-xxl { font-family: 'Lato', sans-serif; - font-size: 2.441rem; // 39px - line-height: 3rem; + font-size: 39px; + line-height: 48px; } @mixin font-xxxl { font-family: 'Lato', sans-serif; - font-size: 3.052rem; // 48px - line-height: 3.5rem; + font-size: 48px; + line-height: 56px; } @mixin font-4l { font-family: 'Lato', sans-serif; - font-size: 3.815rem; // 61px - line-height: 4rem; + font-size: 61px; + line-height: 72px; } @mixin font-5l { font-family: 'Lato', sans-serif; - font-size: 4.815rem; // 76px - line-height: 4.5rem; + font-size: 76px; + line-height: 82px; } .font-s { diff --git a/frontend/ui/src/pages/Inbox/MessageInput/InputOptions.module.scss b/frontend/ui/src/pages/Inbox/MessageInput/InputOptions.module.scss index 86a9ac4a21..711a888167 100644 --- a/frontend/ui/src/pages/Inbox/MessageInput/InputOptions.module.scss +++ b/frontend/ui/src/pages/Inbox/MessageInput/InputOptions.module.scss @@ -105,7 +105,7 @@ } .fileInput { - display: none; + display: none !important; } .paperclipIcon { diff --git a/lib/typescript/assets/scss/fonts.scss b/lib/typescript/assets/scss/fonts.scss index 7ee32d73a8..c9037aecc6 100644 --- a/lib/typescript/assets/scss/fonts.scss +++ b/lib/typescript/assets/scss/fonts.scss @@ -2,56 +2,56 @@ @mixin font-s { font-family: 'Lato', sans-serif; - font-size: 0.8rem; // 13px - line-height: 1rem; + font-size: 13px; + line-height: 16px; } @mixin font-base { font-family: 'Lato', sans-serif; - font-size: 1rem; // 16 px - line-height: 1.5rem; + font-size: 16px; + line-height: 24px; } @mixin font-m { font-family: 'Lato', sans-serif; - font-size: 1.25rem; // 20px - line-height: 2rem; + font-size: 20px; + line-height: 32px; } @mixin font-l { font-family: 'Lato', sans-serif; - font-size: 1.563rem; // 25px - line-height: 2rem; + font-size: 25px; + line-height: 32px; } @mixin font-xl { font-family: 'Lato', sans-serif; - font-size: 1.953rem; // 31px - line-height: 2.5rem; + font-size: 31px; + line-height: 42px; } @mixin font-xxl { font-family: 'Lato', sans-serif; - font-size: 2.441rem; // 39px - line-height: 3rem; + font-size: 39px; + line-height: 48px; } @mixin font-xxxl { font-family: 'Lato', sans-serif; - font-size: 3.052rem; // 48px - line-height: 3.5rem; + font-size: 48px; + line-height: 56px; } @mixin font-4l { font-family: 'Lato', sans-serif; - font-size: 3.815rem; // 61px - line-height: 4rem; + font-size: 61px; + line-height: 72px; } @mixin font-5l { font-family: 'Lato', sans-serif; - font-size: 4.815rem; // 76px - line-height: 4.5rem; + font-size: 76px; + line-height: 82px; } .font-s { From 0455fd18ad916bc3421384a8a8a7818ba2313f82 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Wed, 8 Dec 2021 12:04:36 +0100 Subject: [PATCH 06/24] [#2637] Fix channel prefill (#2639) --- frontend/ui/src/AiryConfig.ts | 4 ---- .../pages/Channels/Providers/Instagram/InstagramConnect.tsx | 4 ++-- lib/typescript/model/Channel.ts | 3 +++ 3 files changed, 5 insertions(+), 6 deletions(-) delete mode 100644 frontend/ui/src/AiryConfig.ts diff --git a/frontend/ui/src/AiryConfig.ts b/frontend/ui/src/AiryConfig.ts deleted file mode 100644 index 7abde61ad7..0000000000 --- a/frontend/ui/src/AiryConfig.ts +++ /dev/null @@ -1,4 +0,0 @@ -export class AiryConfig { - static NODE_ENV = process.env.NODE_ENV; - static FACEBOOK_APP_ID = 'CHANGE_ME'; -} diff --git a/frontend/ui/src/pages/Channels/Providers/Instagram/InstagramConnect.tsx b/frontend/ui/src/pages/Channels/Providers/Instagram/InstagramConnect.tsx index ea40363ccf..495eab0a2c 100644 --- a/frontend/ui/src/pages/Channels/Providers/Instagram/InstagramConnect.tsx +++ b/frontend/ui/src/pages/Channels/Providers/Instagram/InstagramConnect.tsx @@ -30,9 +30,9 @@ const connector = connect(mapStateToProps, mapDispatchToProps); const InstagramConnect = (props: InstagramProps) => { const {connectInstagramChannel, channel} = props; - const [id, setId] = useState(channel?.sourceChannelId || ''); + const [id, setId] = useState(''); const [token, setToken] = useState(''); - const [accountId, setAccountId] = useState(''); + const [accountId, setAccountId] = useState(channel?.sourceChannelId || ''); const [name, setName] = useState(channel?.metadata?.name || ''); const [image, setImage] = useState(channel?.metadata?.imageUrl || ''); const [buttonTitle, setButtonTitle] = useState('Connect Page'); diff --git a/lib/typescript/model/Channel.ts b/lib/typescript/model/Channel.ts index e87dbc25ae..2b371ad198 100644 --- a/lib/typescript/model/Channel.ts +++ b/lib/typescript/model/Channel.ts @@ -3,6 +3,9 @@ import {Metadata} from './Metadata'; export type ChannelMetadata = Metadata & { name: string; imageUrl?: string; + pageId?: string; + pageToken?: string; + accountId?: string; }; export interface Channel { From 7d7c4f13b836facb8eeb972d4863390b4614b5cb Mon Sep 17 00:00:00 2001 From: Ljupco Vangelski Date: Thu, 9 Dec 2021 09:57:32 +0100 Subject: [PATCH 07/24] [#2586] Multiple instances in a single cluster (#2643) Co-authored-by: Pascal Holy --- .../main/files/defaultResourceLimits.yaml | 175 ++++++++++++++++++ infrastructure/terraform/main/main.tf | 1 + .../terraform/modules/aws_eks/main.tf | 9 +- .../terraform/modules/aws_eks/outputs.tf | 8 + .../terraform/modules/aws_eks/variables.tf | 11 +- infrastructure/terraform/modules/core/main.tf | 13 +- .../terraform/modules/core/variables.tf | 4 + 7 files changed, 207 insertions(+), 14 deletions(-) create mode 100644 infrastructure/terraform/main/files/defaultResourceLimits.yaml diff --git a/infrastructure/terraform/main/files/defaultResourceLimits.yaml b/infrastructure/terraform/main/files/defaultResourceLimits.yaml new file mode 100644 index 0000000000..b8b4b3aa9d --- /dev/null +++ b/infrastructure/terraform/main/files/defaultResourceLimits.yaml @@ -0,0 +1,175 @@ +prerequisites: + kafka: + kafka: + resources: + requests: + cpu: "300m" + memory: "512Mi" + limits: + cpu: "2000m" + memory: "4096Mi" + zookeeper: + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "2048Mi" +components: + api: + admin: + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + communication: + communication: + resources: + requests: + cpu: "200m" + memory: "128Mi" + limits: + cpu: "2000m" + memory: "2048Mi" + websocket: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + frontend: + ui: + resources: + requests: + cpu: "50m" + memory: "64Mi" + limits: + cpu: "500m" + memory: "512Mi" + integration: + source-api: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + webhook: + consumer: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + publisher: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "2048Mi" + media: + resolver: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + sources: + chatplugin: + backend: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + frontend: + resources: + requests: + cpu: "50m" + memory: "64Mi" + limits: + cpu: "500m" + memory: "1024Mi" + facebook: + connector: + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + eventsRouter: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + google: + connector: + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + eventsRouter: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + twilio: + connector: + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + eventsRouter: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + viber: + connector: + resources: + requests: + cpu: "100m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" + eventsRouter: + resources: + requests: + cpu: "50m" + memory: "128Mi" + limits: + cpu: "1000m" + memory: "1024Mi" diff --git a/infrastructure/terraform/main/main.tf b/infrastructure/terraform/main/main.tf index f142cb6a9d..f3fef1ae43 100644 --- a/infrastructure/terraform/main/main.tf +++ b/infrastructure/terraform/main/main.tf @@ -11,6 +11,7 @@ provider "kubernetes" { module "my-airy-core" { source = "../modules/core" values_yaml = data.template_file.airy_yaml.rendered + resources_yaml = file("${path.module}/files/defaultResourceLimits.yaml") } data "template_file" "airy_yaml" { diff --git a/infrastructure/terraform/modules/aws_eks/main.tf b/infrastructure/terraform/modules/aws_eks/main.tf index ce21ee0f2c..f85f712835 100644 --- a/infrastructure/terraform/modules/aws_eks/main.tf +++ b/infrastructure/terraform/modules/aws_eks/main.tf @@ -21,8 +21,12 @@ module "vpc" { private_subnets = var.private_subnets public_subnets = var.public_subnets - enable_nat_gateway = true - enable_vpn_gateway = true + enable_nat_gateway = true + enable_vpn_gateway = true + enable_dns_support = true + enable_dns_hostnames = true + + single_nat_gateway = true tags = { Terraform = "true" @@ -56,6 +60,7 @@ module "eks" { fargate_subnets = [local.vpc.private_subnets[0]] kubeconfig_output_path = var.kubeconfig_output_path write_kubeconfig = true + map_users = var.kubernetes_users node_groups = { default = { diff --git a/infrastructure/terraform/modules/aws_eks/outputs.tf b/infrastructure/terraform/modules/aws_eks/outputs.tf index 6c3e36bdb3..bb7600447e 100644 --- a/infrastructure/terraform/modules/aws_eks/outputs.tf +++ b/infrastructure/terraform/modules/aws_eks/outputs.tf @@ -17,3 +17,11 @@ output "cluster_iam_role_arn" { output "subnet_ids" { value = module.vpc.private_subnets } + +output "vpc_id" { + value = module.vpc.vpc_id +} + +output "vpc_cidr_block" { + value = module.vpc.vpc_cidr_block +} diff --git a/infrastructure/terraform/modules/aws_eks/variables.tf b/infrastructure/terraform/modules/aws_eks/variables.tf index 22630bff09..f0525b5b14 100644 --- a/infrastructure/terraform/modules/aws_eks/variables.tf +++ b/infrastructure/terraform/modules/aws_eks/variables.tf @@ -71,4 +71,13 @@ variable "fargate_namespaces" { variable "fargate_profiles" { -} \ No newline at end of file +} + +variable "kubernetes_users" { + type = list(object({ + userarn = string + username = string + groups = list(string) + })) + default = [] +} diff --git a/infrastructure/terraform/modules/core/main.tf b/infrastructure/terraform/modules/core/main.tf index 2155fabe48..30338845e1 100644 --- a/infrastructure/terraform/modules/core/main.tf +++ b/infrastructure/terraform/modules/core/main.tf @@ -1,13 +1,3 @@ -provider "helm" { - kubernetes { - config_path = var.kubeconfig_output_path - } -} - -provider "kubernetes" { - config_path = var.kubeconfig_output_path -} - resource "kubernetes_namespace" "core" { metadata { name = var.core_id @@ -32,7 +22,8 @@ resource "helm_release" "airy_core" { timeout = "600" values = [ - var.values_yaml + var.values_yaml, + var.resources_yaml ] namespace = var.namespace diff --git a/infrastructure/terraform/modules/core/variables.tf b/infrastructure/terraform/modules/core/variables.tf index 311361d4e1..e9e51d2185 100644 --- a/infrastructure/terraform/modules/core/variables.tf +++ b/infrastructure/terraform/modules/core/variables.tf @@ -17,6 +17,10 @@ variable "values_yaml" { description = "The helm values overrides" } +variable "resources_yaml" { + description = "Resource requests and limits for the components" +} + variable "core_version" { description = "Version of the Airy Core instance" type = string From 848100509bb1c15b704d9be4e3f487cad4131cb5 Mon Sep 17 00:00:00 2001 From: Ljupco Vangelski Date: Thu, 9 Dec 2021 17:35:05 +0100 Subject: [PATCH 08/24] [#2586] Set min and max size for EKS node group (#2648) --- infrastructure/terraform/modules/aws_eks/main.tf | 2 ++ 1 file changed, 2 insertions(+) diff --git a/infrastructure/terraform/modules/aws_eks/main.tf b/infrastructure/terraform/modules/aws_eks/main.tf index f85f712835..ef0bfa6714 100644 --- a/infrastructure/terraform/modules/aws_eks/main.tf +++ b/infrastructure/terraform/modules/aws_eks/main.tf @@ -65,6 +65,8 @@ module "eks" { node_groups = { default = { desired_capacity = var.node_group_size + min_capacity = var.node_group_size + max_capacity = (var.node_group_size + 1) instance_types = [var.instance_type] update_config = { From 2c04cbf1d548ec8b7fce3b8e23a785bad2edcb03 Mon Sep 17 00:00:00 2001 From: AudreyKj <38159391+AudreyKj@users.noreply.github.com> Date: Fri, 10 Dec 2021 09:52:11 +0100 Subject: [PATCH 09/24] [#2649] ui fix instagram messages (#2650) --- .../render/SourceMessagePreview.tsx | 29 ++++++++++++++++++- .../InstagramStoryReplies/index.module.scss | 20 ++++++++++--- .../InstagramStoryReplies/index.tsx | 4 ++- 3 files changed, 47 insertions(+), 6 deletions(-) diff --git a/lib/typescript/render/SourceMessagePreview.tsx b/lib/typescript/render/SourceMessagePreview.tsx index 84a290a741..df0b4b5d8c 100644 --- a/lib/typescript/render/SourceMessagePreview.tsx +++ b/lib/typescript/render/SourceMessagePreview.tsx @@ -37,7 +37,9 @@ export const SourceMessagePreview = (props: SourceMessagePreviewProps) => { const {conversation} = props; const lastMessageIsText = (conversation: Conversation) => { - const lastMessageContent = conversation.lastMessage.content; + const lastMessageContent = conversation?.lastMessage?.content?.message || conversation?.lastMessage?.content; + + //google const googleLiveAgentRequest = lastMessageContent?.userStatus?.requestedLiveAgent; const googleSurveyResponse = lastMessageContent?.surveyResponse; @@ -57,6 +59,31 @@ export const SourceMessagePreview = (props: SourceMessagePreviewProps) => { ); } + //instagram + const instagramStoryMention = + lastMessageContent?.attachment?.type === 'story_mention' || + lastMessageContent?.attachments?.[0]?.type === 'story_mention'; + const instagramStoryReplies = lastMessageContent?.reply_to; + const instagramDeletedMessage = lastMessageContent?.is_deleted; + const instagramShare = + lastMessageContent?.attachment?.type === 'share' || lastMessageContent?.attachments?.[0]?.type === 'share'; + + if (instagramStoryMention) { + return <>story mention; + } + + if (instagramStoryReplies) { + return <>story reply; + } + + if (instagramDeletedMessage) { + return <>deleted message; + } + + if (instagramShare) { + return <>shared post; + } + if (typeof lastMessageContent === 'string') { let text; diff --git a/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.module.scss b/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.module.scss index c2cffb6d17..3ef586f173 100644 --- a/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.module.scss +++ b/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.module.scss @@ -1,6 +1,22 @@ @import 'assets/scss/fonts.scss'; @import 'assets/scss/colors.scss'; +.container { + margin-top: 10px; +} + +.containerMemberContent { + display: flex; + flex-direction: column; + align-items: flex-end; +} + +.containerContactContent { + display: flex; + flex-direction: column; + align-items: flex-start; +} + .textMessage { display: inline-block; overflow-wrap: break-word; @@ -25,10 +41,6 @@ color: white; } -.container { - margin-top: 10px; -} - .storyReply { display: flex; align-items: center; diff --git a/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.tsx b/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.tsx index 63872cf557..44950d70a1 100644 --- a/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.tsx +++ b/lib/typescript/render/providers/facebook/components/InstagramStoryReplies/index.tsx @@ -13,7 +13,9 @@ type InstagramRepliesProps = { export const StoryReplies = ({url, text, sentAt, fromContact}: InstagramRepliesProps) => { return ( -
+
In response to a  {timeElapsedInHours(sentAt) <= 24 ? ( From d7fd7aa9ec845712ba09364dcc69fe3485634d78 Mon Sep 17 00:00:00 2001 From: Ljupco Vangelski Date: Fri, 10 Dec 2021 11:44:53 +0100 Subject: [PATCH 10/24] [#2550] Docs for multiple providers using helm (#2597) Resolves #2550 --- .../docs/getting-started/installation/helm.md | 189 +++++++++++++++++- .../installation/k8s-azure.jpg | Bin 0 -> 163103 bytes .../installation/k8s-digitalocean-setup.jpg | Bin 0 -> 39360 bytes .../installation/k8s-digitalocean.jpg | Bin 0 -> 128790 bytes 4 files changed, 179 insertions(+), 10 deletions(-) create mode 100644 docs/static/img/getting-started/installation/k8s-azure.jpg create mode 100644 docs/static/img/getting-started/installation/k8s-digitalocean-setup.jpg create mode 100644 docs/static/img/getting-started/installation/k8s-digitalocean.jpg diff --git a/docs/docs/getting-started/installation/helm.md b/docs/docs/getting-started/installation/helm.md index 6f66a55688..90741ee47a 100644 --- a/docs/docs/getting-started/installation/helm.md +++ b/docs/docs/getting-started/installation/helm.md @@ -4,8 +4,11 @@ sidebar_label: Helm --- import TLDR from "@site/src/components/TLDR"; +import useBaseUrl from '@docusaurus/useBaseUrl'; import ButtonBox from "@site/src/components/ButtonBox"; import DiamondSVG from "@site/static/icons/diamond.svg"; +import Tabs from '@theme/Tabs'; +import TabItem from '@theme/TabItem'; Deploy Airy with Helm, on an existing Kubernetes cluster. @@ -16,28 +19,194 @@ an already existing Kubernetes cluster [Helm](https://helm.sh/). ## Prerequisites -You would need an existing Kubernetes cluster and administrative access to it. For the purpose of this guide, we will use a Google (GKE) Kubernetes cluster. -The cluster that we will create will have two nodes with 2cpu and 16GB RAM each. +### Kubernetes + +You would need an existing Kubernetes cluster and administrative access to it. The size of the cluster depends on the number of connected sources and the number of messages flowing through the `Airy Core` platform. It is important that the pods are running stable and that they are not restarting. You can start with a simple setup of `two nodes`, each of them with `4 vCPUs` and `8GB RAM`. After that you can add or remove computing resources, so that the cluster is not under or over provisioned. + +In case you are not sure how to create a Kubernetes cluster, here is a small guide on setting up Kubernetes in different environments: + + + + + +For creating a Kubernetes cluster in Google, you can use either the [Google cloud dashboard](https://console.cloud.google.com) or the [gcloud](https://cloud.google.com/sdk/docs/install) command line tool which is part of the Google SDK. + +After you install the Google SDK and you have setup your Google account, you can create a Kubernetes cluster with one command: ```sh gcloud container clusters create awesomechat --num-nodes=2 --machine-type=e2-standard-4 ``` -You will also need the [Helm](https://helm.sh/docs/intro/quickstart/) and [Kubectl](https://kubernetes.io/docs/tasks/tools/) binaries, locally on your machine. +The command will also update your `kubeconfig` file. + +For more information refer to the [official Google Guide](https://cloud.google.com/kubernetes-engine/docs/quickstart) + + + + + +For creating a Kubernetes cluster on Microsoft Azure, you can use the [Microsoft Azure Portal](https://portal.azure.com), the [Azure PowerShell utility](https://docs.microsoft.com/en-us/powershell/azure/get-started-azureps) or the [Azure CLI](https://docs.microsoft.com/en-us/cli/azure/install-azure-cli). + +The simplest way to create the cluster is using the Microsoft Azure Portal. Navigate to the `Kubernetes services` dashboard and click on `Create` -> `Create a Kubernetes cluster`. + +On the following screen make sure that you: + +- Select the default resource group or create a new one. +- Fill in the name of the cluster (ex. awesomechat). +- Select the number of nodes. + +Azure portal - Kubernetes services + +After the cluster is created, you can use the `az` Azure CLI to setup access to the cluster: + +```sh +az login +az aks list +az aks get-credentials --resource-group DefaultResourceGroup-EUS --name awesomechat +``` + +The last command will update your `kubeconfig` file with the proper credentials. + +For more information refer to the [official Microsoft Guide](https://docs.microsoft.com/en-us/azure/aks/kubernetes-walkthrough). + + + + + +A Kubernetes cluster can be created directly on the [DigitalOcean dashboard](https://cloud.digitalocean.com/kubernetes/clusters) by clicking `Create` -> `Kubernetes`. You can leave all the options default, except for the `Node plan` as the default nodes might be too small for running the `Airy Core` platform. + +DigitalOcean - Create Kubernetes + +After you create the cluster you need to go through a short guided cluster setup. + +DigitalOcean - Setup Kubernetes + +After you complete the setup you can `Download Config File` to save the `kubeconfig` file to your machine. With the `kubeconfig` file you can now access the kubernetes cluster. + +```sh +kubectl --kubeconfig ./awesomechat-kubeconfig.yaml get pods +``` + +For more information refer to the [official DigitalOcean Guide](https://docs.digitalocean.com/products/kubernetes/quickstart/) + + + + + +`Airy Core` can be created on Minikube with predefined settings, using the [Airy CLI](/cli/introduction). However, if you want to create your custom Minikube instance, for example with custom settings for CPU and RAM, you can also do that with the [Minikube](https://minikube.sigs.k8s.io/docs/start/) utility: + +```sh +minikube -p airy start --driver=virtualbox --cpus=4 --memory=7168 --extra-config=apiserver.service-nodeport-range=1-65535 +``` + +The `apiserver.service-nodeport-range` settings is needed if you want to use port 80 on the Minikube VM as the NodePort for the ingress controller service. + +For more information refer to the [official Minikube Documentation](https://minikube.sigs.k8s.io/docs/start/). + + + + + +`Airy Core` can be created on AWS using the [Airy CLI](/cli/introduction). However that approach doesn't allow you to customize parameters other then the `vpcId` and `instanceType`. To be fully in control of the creation of the [Kubernetes cluster on AWS](https://docs.aws.amazon.com/eks/latest/userguide/create-cluster.html) you can use create one using the [AWS Console](https://console.aws.amazon.com/) or the [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html). + +For creating a cluster you first need an AWS IAM Role and a VPC. Export your profile and your region: + +```sh +export AWS_PROFILE=my-aws-profile +export AWS_REGION=my-aws-region +``` + +Create a new AWS IAM Role and attach the appropriate policies: + +```sh +export POLICY='{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Principal": {"Service": "eks.amazonaws.com"},"Action": "sts:AssumeRole"}]}' +``` + +```sh +aws iam create-role --role-name awesomechat --assume-role-policy-document "$POLICY" +``` + +```sh +aws iam attach-role-policy --role-name awesomechat --policy-arn \ + "arn:aws:iam::aws:policy/AmazonEKSClusterPolicy" +``` + +```sh +aws iam attach-role-policy --role-name awesomechat --policy-arn \ + "arn:aws:iam::aws:policy/AmazonEKSWorkerNodePolicy" +``` + +```sh +aws iam attach-role-policy --role-name awesomechat --policy-arn \ + "arn:aws:iam::aws:policy/AmazonEC2ContainerRegistryReadOnly" +``` + +```sh +aws iam attach-role-policy --role-name awesomechat --policy-arn \ + "arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy" +``` + +```sh +ROLE_ARN=$(aws iam get-role --role-name awesomechat --query 'Role.Arn' --output text) +``` -Make sure that you can access the cluster running: +Get the default VPC and the public subnets: ```sh -kubectl get pods -No resources found in default namespace. +VPC_ID=$(aws ec2 describe-vpcs --filters Name=is-default,Values=true --query 'Vpcs[0].VpcId' --output text) +``` + +```sh +SUBNETS=$(aws ec2 describe-subnets --filters Name=vpc-id,Values=${VPC_ID} \ + --query 'Subnets[?MapPublicIpOnLaunch==`true`].SubnetId' --output text | sed 's/\t/,/g') +``` + +You can modify the list of subnets according to your needs, but you must have at least two subnets with the property `MapPublicIpOnLaunch` set to true. + +Then create the Kubernetes cluster with the following command: -helm list -NAME NAMESPACE REVISION UPDATED STATUS CHART APP VERSION +```sh +aws eks create-cluster --name awesomechat --role-arn ${ROLE_ARN} --resources-vpc-config subnetIds=${SUBNETS} +``` + +To update your `kubeconfig` file run: + +```sh +aws eks update-kubeconfig --name awesomechat --alias awesomechat ``` +For more information refer to the [official AWS Guide](https://docs.aws.amazon.com/eks/latest/userguide/getting-started-console.html). + + + + + +### Command line utilities + +You will also need the [Helm](https://helm.sh/docs/intro/quickstart/) and [Kubectl](https://kubernetes.io/docs/tasks/tools/) binaries, locally on your machine. + ## Install -Deploy Airy Core with the latest version. You can also configure a specific version +:::note + +Before you proceed with the Helm installation, make sure that you are connected to the correct Kubernetes cluster. +If you are not using your default `kubeconfig` file, you need to export an environment variable: + +export KUBECONFIG=./kube.conf + +::: + +Deploy Airy Core with the latest version. You can also configure a specific version. ```sh VERSION=$(curl -L -s https://airy-core-binaries.s3.amazonaws.com/stable.txt) @@ -49,7 +218,7 @@ By default `Airy Core` creates only a HTTP listener and when running in cloud en Get the address of your LoadBalancer: ```sh -kubectl -n kube-system get service ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].ip}' +kubectl -n kube-system get service ingress-nginx-controller -o jsonpath='{.status.loadBalancer.ingress[0].*}{"\n"}' ``` Configure your DNS so that your desired hostname points to the IP address of LoadBalancer. In this example we will be using the hostname `awesomechat.airy.co`. diff --git a/docs/static/img/getting-started/installation/k8s-azure.jpg b/docs/static/img/getting-started/installation/k8s-azure.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ab7db80fda6c0b2911aa647b09e93691efb67f1f GIT binary patch literal 163103 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%0A#K=62ixgn!z>0bvmpGx=vgv=i>er|a2 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

=h((qWsVJ{NU=ZW9WZ3?G6`JA}HUriHi3C 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 literal 0 HcmV?d00001 diff --git a/docs/static/img/getting-started/installation/k8s-digitalocean.jpg b/docs/static/img/getting-started/installation/k8s-digitalocean.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8bad42f8d3422a12bbb03eb5ac5cb1ef72836674 GIT binary patch literal 128790 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 bf4kL&H-ze+Nou>>;fECjL$c4S|9t%i2MdDT literal 0 HcmV?d00001 From 6a51c8bcad4e4cd975d3bf0668bc54489c08fa46 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Dec 2021 09:48:58 +0100 Subject: [PATCH 11/24] Bump prettier from 2.4.1 to 2.5.1 (#2635) Bumps [prettier](https://github.com/prettier/prettier) from 2.4.1 to 2.5.1. - [Release notes](https://github.com/prettier/prettier/releases) - [Changelog](https://github.com/prettier/prettier/blob/main/CHANGELOG.md) - [Commits](https://github.com/prettier/prettier/compare/2.4.1...2.5.1) --- updated-dependencies: - dependency-name: prettier dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 8 ++++---- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/package.json b/package.json index 3e9fe3f588..7b9c8168fd 100644 --- a/package.json +++ b/package.json @@ -59,7 +59,7 @@ "file-loader": "^6.2.0", "html-webpack-plugin": "^5.5.0", "minimist": "^1.2.5", - "prettier": "^2.4.1", + "prettier": "^2.5.1", "react-hot-loader": "^4.13.0", "sass": "^1.43.4", "sass-loader": "^12.3.0", diff --git a/yarn.lock b/yarn.lock index 224b0d617f..bb45beb3cb 100644 --- a/yarn.lock +++ b/yarn.lock @@ -6120,10 +6120,10 @@ prelude-ls@^1.2.1: resolved "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz" integrity sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g== -prettier@^2.4.1: - version "2.4.1" - resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.4.1.tgz#671e11c89c14a4cfc876ce564106c4a6726c9f5c" - integrity sha512-9fbDAXSBcc6Bs1mZrDYb3XKzDLm4EXXL9sC1LqKP5rZkT6KRr/rf9amVUcODVXgguK/isJz0d0hP72WeaKWsvA== +prettier@^2.5.1: + version "2.5.1" + resolved "https://registry.yarnpkg.com/prettier/-/prettier-2.5.1.tgz#fff75fa9d519c54cf0fce328c1017d94546bc56a" + integrity sha512-vBZcPRUR5MZJwoyi3ZoyQlc1rXeEck8KgeC9AwwOn+exuxLxq5toTRDTSaVrXHxelDMHy9zlicw8u66yxoSUFg== pretty-bytes@^5.6.0: version "5.6.0" From 668fe7bb35e084242d3f5a55b3626ef517a8610c Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 14 Dec 2021 13:40:30 +0100 Subject: [PATCH 12/24] Bump terser-webpack-plugin from 5.2.4 to 5.2.5 (#2655) Bumps [terser-webpack-plugin](https://github.com/webpack-contrib/terser-webpack-plugin) from 5.2.4 to 5.2.5. - [Release notes](https://github.com/webpack-contrib/terser-webpack-plugin/releases) - [Changelog](https://github.com/webpack-contrib/terser-webpack-plugin/blob/master/CHANGELOG.md) - [Commits](https://github.com/webpack-contrib/terser-webpack-plugin/compare/v5.2.4...v5.2.5) --- updated-dependencies: - dependency-name: terser-webpack-plugin dependency-type: direct:development update-type: version-update:semver-patch ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 9 ++++----- 2 files changed, 5 insertions(+), 6 deletions(-) diff --git a/package.json b/package.json index 7b9c8168fd..1946087e8a 100644 --- a/package.json +++ b/package.json @@ -64,7 +64,7 @@ "sass": "^1.43.4", "sass-loader": "^12.3.0", "style-loader": "^3.3.1", - "terser-webpack-plugin": "^5.2.4", + "terser-webpack-plugin": "^5.2.5", "typescript": "4.3.5", "url-loader": "^4.1.1", "webpack": "5.64.4", diff --git a/yarn.lock b/yarn.lock index bb45beb3cb..80be088efa 100644 --- a/yarn.lock +++ b/yarn.lock @@ -7391,13 +7391,12 @@ tapable@^2.0.0, tapable@^2.1.1, tapable@^2.2.0: resolved "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz" integrity sha512-FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw== -terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.4: - version "5.2.4" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.2.4.tgz" - integrity sha512-E2CkNMN+1cho04YpdANyRrn8CyN4yMy+WdFKZIySFZrGXZxJwJP6PMNGGc/Mcr6qygQHUUqRxnAPmi0M9f00XA== +terser-webpack-plugin@^5.1.3, terser-webpack-plugin@^5.2.5: + version "5.2.5" + resolved "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-5.2.5.tgz#ce65b9880a0c36872555c4874f45bbdb02ee32c9" + integrity sha512-3luOVHku5l0QBeYS8r4CdHYWEGMmIj3H1U64jgkdZzECcSOJAyJ9TjuqcQZvw1Y+4AOBN9SeYJPJmFn2cM4/2g== dependencies: jest-worker "^27.0.6" - p-limit "^3.1.0" schema-utils "^3.1.1" serialize-javascript "^6.0.0" source-map "^0.6.1" From af8dcf809dfba0e000dfaaee14b842269a0eeeee Mon Sep 17 00:00:00 2001 From: Juan Sebastian Pena Rodriguez Date: Tue, 14 Dec 2021 17:59:20 +0100 Subject: [PATCH 13/24] [#2653] upgrade slf4j and underlying log4j libraries (#2654) --- lib/java/log/BUILD | 2 + maven_install.json | 264 +++++++++++++++++++++++++-------------------- repositories.bzl | 9 +- 3 files changed, 154 insertions(+), 121 deletions(-) diff --git a/lib/java/log/BUILD b/lib/java/log/BUILD index 688c1dd32a..ca109e4d76 100644 --- a/lib/java/log/BUILD +++ b/lib/java/log/BUILD @@ -9,12 +9,14 @@ custom_java_library( "@maven//:org_apache_logging_log4j_log4j_api", "@maven//:org_apache_logging_log4j_log4j_slf4j_impl", "@maven//:org_slf4j_slf4j_api", + "@maven//:org_slf4j_slf4j_nop", ], deps = [ "@maven//:org_apache_logging_log4j_log4j_api", "@maven//:org_apache_logging_log4j_log4j_core", "@maven//:org_apache_logging_log4j_log4j_slf4j_impl", "@maven//:org_slf4j_slf4j_api", + "@maven//:org_slf4j_slf4j_nop", ], ) diff --git a/maven_install.json b/maven_install.json index f44c3c961b..817b282297 100644 --- a/maven_install.json +++ b/maven_install.json @@ -1,11 +1,10 @@ { "dependency_tree": { - "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": -376988728, + "__AUTOGENERATED_FILE_DO_NOT_MODIFY_THIS_FILE_MANUALLY": 1389523621, "conflict_resolution": { "com.fasterxml.jackson.core:jackson-annotations:2.10.0": "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "com.fasterxml.jackson.core:jackson-core:2.10.0": "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-databind:2.10.0": "com.fasterxml.jackson.core:jackson-databind:2.11.4", - "com.segment.analytics.java:analytics-core:2.1.0": "com.segment.analytics.java:analytics-core:3.1.3", "io.jsonwebtoken:jjwt-api:0.10.5": "io.jsonwebtoken:jjwt-api:0.10.7", "io.jsonwebtoken:jjwt-impl:0.10.5": "io.jsonwebtoken:jjwt-impl:0.10.7", "io.jsonwebtoken:jjwt-jackson:0.10.5": "io.jsonwebtoken:jjwt-jackson:0.10.7", @@ -17,7 +16,6 @@ "org.junit.platform:junit-platform-engine:1.7.0": "org.junit.platform:junit-platform-engine:1.7.1", "org.mockito:mockito-core:2.28.2": "org.mockito:mockito-core:3.6.28", "org.rocksdb:rocksdbjni:5.18.3": "org.rocksdb:rocksdbjni:5.18.4", - "org.slf4j:slf4j-api:1.7.29": "org.slf4j:slf4j-api:1.7.30", "org.springframework:spring-aop:4.1.4.RELEASE": "org.springframework:spring-aop:5.3.6" }, "dependencies": [ @@ -43,10 +41,10 @@ { "coord": "com.101tec:zkclient:0.11", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "org.slf4j:slf4j-log4j12", @@ -227,13 +225,13 @@ { "coord": "com.dinstone:beanstalkc:2.3.0", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", - "org.slf4j:slf4j-api:jar:1.7.30", - "org.apache.mina:mina-core:2.1.3" + "org.apache.mina:mina-core:2.1.3", + "org.slf4j:slf4j-api:jar:1.7.32", + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ "org.apache.mina:mina-core:2.1.3", - "org.slf4j:slf4j-api:jar:1.7.30" + "org.slf4j:slf4j-api:jar:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -1202,14 +1200,14 @@ { "coord": "com.jayway.jsonpath:json-path:2.4.0", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", "net.minidev:json-smart:2.3", "org.ow2.asm:asm:9.0", - "net.minidev:accessors-smart:1.2" + "net.minidev:accessors-smart:1.2", + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ "net.minidev:json-smart:2.3", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -1235,9 +1233,9 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.3.50", - "org.slf4j:slf4j-api:1.7.30", "org.scala-lang:scala-library:2.13.3", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "org.jetbrains.kotlin:kotlin-scripting-jvm:1.3.50", "org.jetbrains.kotlin:kotlin-scripting-common:1.3.50", "org.jetbrains.kotlin:kotlin-reflect:1.3.50", @@ -1247,9 +1245,9 @@ "directDependencies": [ "io.github.classgraph:classgraph:4.8.21", "org.jetbrains.kotlin:kotlin-scripting-compiler-embeddable:1.3.50", - "org.slf4j:slf4j-api:1.7.30", "org.scala-lang:scala-library:2.13.3", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "javax.validation:validation-api:2.0.1.Final" ], "exclusions": [ @@ -1863,13 +1861,13 @@ "coord": "com.typesafe.scala-logging:scala-logging_2.13:3.9.2", "dependencies": [ "org.scala-lang:scala-library:2.13.3", - "org.slf4j:slf4j-api:1.7.30", - "org.scala-lang:scala-reflect:2.13.3" + "org.scala-lang:scala-reflect:2.13.3", + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ "org.scala-lang:scala-library:2.13.3", "org.scala-lang:scala-reflect:2.13.3", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "org.slf4j:slf4j-log4j12", @@ -1919,11 +1917,11 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "com.google.code.findbugs:jsr305:3.0.2", - "org.slf4j:slf4j-api:1.7.30", "org.jetbrains.kotlin:kotlin-stdlib-common:1.4.21", "com.squareup.okio:okio:2.8.0", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "com.google.errorprone:error_prone_annotations:2.3.4", + "org.slf4j:slf4j-api:1.7.32", "com.google.guava:failureaccess:1.0.1", "com.google.guava:guava:29.0-jre", "org.jetbrains.kotlin:kotlin-stdlib:1.4.21", @@ -1933,8 +1931,8 @@ ], "directDependencies": [ "com.google.code.findbugs:jsr305:3.0.2", - "org.slf4j:slf4j-api:1.7.30", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "com.google.guava:guava:29.0-jre", "com.squareup.okhttp3:okhttp:4.9.1" ], @@ -1956,10 +1954,10 @@ { "coord": "com.yammer.metrics:metrics-core:2.2.0", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "org.slf4j:slf4j-log4j12", @@ -2155,10 +2153,10 @@ { "coord": "io.confluent:common-utils:6.1.1", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -2202,7 +2200,6 @@ "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "io.confluent:common-utils:6.1.1", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.glassfish.hk2:osgi-resource-locator:1.0.3", "org.apache.commons:commons-compress:1.20", "io.swagger:swagger-annotations:1.6.2", @@ -2210,6 +2207,7 @@ "com.fasterxml.jackson.core:jackson-databind:2.11.4", "com.sun.activation:jakarta.activation:1.2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", @@ -2259,7 +2257,6 @@ "io.confluent:common-utils:6.1.1", "org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.3.50", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.scala-lang:scala-library:2.13.3", "org.glassfish.hk2:osgi-resource-locator:1.0.3", "com.fasterxml.jackson.datatype:jackson-datatype-joda:2.10.5", @@ -2274,6 +2271,7 @@ "com.sun.activation:jakarta.activation:1.2.2", "org.apache.avro:avro:1.10.0", "com.google.errorprone:error_prone_annotations:2.3.4", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", @@ -2336,7 +2334,6 @@ "com.google.code.findbugs:jsr305:3.0.2", "io.confluent:common-utils:6.1.1", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.glassfish.hk2:osgi-resource-locator:1.0.3", "org.jetbrains.kotlin:kotlin-stdlib-common:1.4.21", "org.apache.commons:commons-compress:1.20", @@ -2348,6 +2345,7 @@ "com.sun.activation:jakarta.activation:1.2.2", "org.apache.avro:avro:1.10.0", "com.google.errorprone:error_prone_annotations:2.3.4", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", "org.xerial.snappy:snappy-java:1.1.7.7", @@ -2396,7 +2394,6 @@ "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "io.confluent:common-utils:6.1.1", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.glassfish.hk2:osgi-resource-locator:1.0.3", "org.apache.commons:commons-compress:1.20", "io.swagger:swagger-annotations:1.6.2", @@ -2404,6 +2401,7 @@ "com.fasterxml.jackson.core:jackson-databind:2.11.4", "com.sun.activation:jakarta.activation:1.2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", @@ -2472,7 +2470,6 @@ "javax.activation:javax.activation-api:1.2.0", "org.jetbrains.kotlin:kotlin-scripting-compiler-impl-embeddable:1.3.50", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.scala-lang:scala-library:2.13.3", "org.eclipse.jetty:jetty-http:9.4.39.v20210325", "org.eclipse.jetty:jetty-webapp:9.4.39.v20210325", @@ -2516,6 +2513,7 @@ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.10.5", "com.google.errorprone:error_prone_annotations:2.3.4", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.4.10", "io.netty:netty-buffer:4.1.50.Final", @@ -2632,7 +2630,6 @@ "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "io.confluent:common-utils:6.1.1", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.glassfish.hk2:osgi-resource-locator:1.0.3", "org.apache.commons:commons-compress:1.20", "io.swagger:swagger-annotations:1.6.2", @@ -2640,6 +2637,7 @@ "com.fasterxml.jackson.core:jackson-databind:2.11.4", "com.sun.activation:jakarta.activation:1.2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", @@ -2674,7 +2672,6 @@ "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "io.confluent:common-utils:6.1.1", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.glassfish.hk2:osgi-resource-locator:1.0.3", "org.apache.commons:commons-compress:1.20", "io.swagger:swagger-annotations:1.6.2", @@ -2682,6 +2679,7 @@ "com.fasterxml.jackson.core:jackson-databind:2.11.4", "com.sun.activation:jakarta.activation:1.2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", @@ -2732,7 +2730,6 @@ "io.confluent:common-utils:6.1.1", "javax.activation:javax.activation-api:1.2.0", "org.glassfish.hk2.external:jakarta.inject:2.6.1", - "org.slf4j:slf4j-api:1.7.30", "org.eclipse.jetty:jetty-http:9.4.39.v20210325", "org.eclipse.jetty:jetty-webapp:9.4.39.v20210325", "com.fasterxml.jackson.jaxrs:jackson-jaxrs-json-provider:2.10.5", @@ -2758,6 +2755,7 @@ "com.fasterxml.jackson.module:jackson-module-jaxb-annotations:2.10.5", "com.google.errorprone:error_prone_annotations:2.3.4", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.xerial.snappy:snappy-java:1.1.7.7", "org.glassfish.jersey.core:jersey-client:2.31", @@ -3362,10 +3360,10 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "com.google.code.findbugs:jsr305:3.0.2", - "org.slf4j:slf4j-api:1.7.30", "io.swagger:swagger-annotations:1.6.2", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "com.google.errorprone:error_prone_annotations:2.3.4", + "org.slf4j:slf4j-api:1.7.32", "com.google.guava:failureaccess:1.0.1", "com.google.guava:guava:29.0-jre", "org.apache.commons:commons-lang3:3.9", @@ -3376,8 +3374,8 @@ "directDependencies": [ "com.fasterxml.jackson.dataformat:jackson-dataformat-yaml:2.11.1", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "com.google.guava:guava:29.0-jre", "org.apache.commons:commons-lang3:3.9", "io.swagger:swagger-models:1.6.2" @@ -3402,13 +3400,13 @@ "coord": "io.swagger:swagger-models:1.6.2", "dependencies": [ "io.swagger:swagger-annotations:1.6.2", - "org.slf4j:slf4j-api:1.7.30", - "com.fasterxml.jackson.core:jackson-annotations:2.11.4" + "com.fasterxml.jackson.core:jackson-annotations:2.11.4", + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "io.swagger:swagger-annotations:1.6.2", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "org.slf4j:slf4j-log4j12", @@ -3949,18 +3947,18 @@ "dependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "org.apache.commons:commons-compress:1.20", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.velocity:velocity-engine-core:2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "org.apache.commons:commons-lang3:3.9" ], "directDependencies": [ - "org.slf4j:slf4j-api:1.7.30", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.velocity:velocity-engine-core:2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "org.apache.commons:commons-lang3:3.9" ], "exclusions": [ @@ -3984,13 +3982,13 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "org.apache.avro:avro-ipc:1.10.0", - "org.slf4j:slf4j-api:1.7.30", "org.eclipse.jetty:jetty-http:9.4.39.v20210325", "org.apache.commons:commons-compress:1.20", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.velocity:velocity-engine-core:2.2", "org.apache.avro:avro:1.10.0", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "javax.annotation:javax.annotation-api:1.3.2", @@ -4005,9 +4003,9 @@ ], "directDependencies": [ "org.apache.avro:avro-ipc:1.10.0", - "org.slf4j:slf4j-api:1.7.30", "org.apache.avro:avro:1.10.0", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "org.eclipse.jetty:jetty-servlet:9.4.39.v20210325", "org.eclipse.jetty:jetty-util:9.4.39.v20210325" ], @@ -4031,11 +4029,11 @@ "dependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "org.apache.commons:commons-compress:1.20", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.velocity:velocity-engine-core:2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "javax.annotation:javax.annotation-api:1.3.2", @@ -4044,10 +4042,10 @@ ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.velocity:velocity-engine-core:2.2", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "javax.annotation:javax.annotation-api:1.3.2", @@ -4075,13 +4073,13 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "org.apache.avro:avro-ipc:1.10.0", - "org.slf4j:slf4j-api:1.7.30", "org.eclipse.jetty:jetty-http:9.4.39.v20210325", "org.apache.commons:commons-compress:1.20", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.velocity:velocity-engine-core:2.2", "org.apache.avro:avro:1.10.0", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "javax.annotation:javax.annotation-api:1.3.2", @@ -4098,7 +4096,7 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "org.apache.avro:avro-ipc:1.10.0", "org.apache.avro:avro-ipc-jetty:1.10.0", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4122,7 +4120,6 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "org.apache.avro:avro-ipc:1.10.0", - "org.slf4j:slf4j-api:1.7.30", "org.eclipse.jetty:jetty-http:9.4.39.v20210325", "org.apache.commons:commons-compress:1.20", "com.fasterxml.jackson.core:jackson-databind:2.11.4", @@ -4130,6 +4127,7 @@ "org.apache.avro:trevni-core:1.10.0", "org.apache.avro:avro:1.10.0", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "javax.annotation:javax.annotation-api:1.3.2", @@ -4152,9 +4150,9 @@ "directDependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", "org.apache.avro:avro-ipc:1.10.0", - "org.slf4j:slf4j-api:1.7.30", "org.apache.avro:trevni-core:1.10.0", "org.apache.avro:avro:1.10.0", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "org.apache.avro:trevni-core:jar:tests:1.10.0", @@ -4186,15 +4184,15 @@ "dependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "org.apache.commons:commons-compress:1.20", - "com.fasterxml.jackson.core:jackson-databind:2.11.4" + "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.commons:commons-compress:1.20", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4218,7 +4216,6 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "org.apache.avro:avro-ipc:1.10.0", - "org.slf4j:slf4j-api:1.7.30", "org.eclipse.jetty:jetty-http:9.4.39.v20210325", "org.apache.commons:commons-compress:1.20", "com.fasterxml.jackson.core:jackson-databind:2.11.4", @@ -4226,6 +4223,7 @@ "org.apache.avro:trevni-core:1.10.0", "org.apache.avro:avro:1.10.0", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "javax.annotation:javax.annotation-api:1.3.2", @@ -4243,7 +4241,7 @@ "org.apache.avro:avro:1.10.0", "org.apache.avro:avro-mapred:1.10.0", "org.apache.avro:trevni-core:1.10.0", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4267,7 +4265,6 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "org.apache.avro:avro-ipc:1.10.0", - "org.slf4j:slf4j-api:1.7.30", "org.eclipse.jetty:jetty-http:9.4.39.v20210325", "org.apache.commons:commons-compress:1.20", "com.fasterxml.jackson.core:jackson-databind:2.11.4", @@ -4275,6 +4272,7 @@ "org.apache.avro:trevni-core:1.10.0", "org.apache.avro:avro:1.10.0", "org.eclipse.jetty:jetty-server:9.4.39.v20210325", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.tukaani:xz:1.8", "javax.annotation:javax.annotation-api:1.3.2", @@ -4292,7 +4290,7 @@ "org.apache.avro:avro:1.10.0", "org.apache.avro:avro-mapred:1.10.0", "org.apache.avro:trevni-core:1.10.0", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4313,12 +4311,12 @@ "coord": "org.apache.avro:trevni-core:1.10.0", "dependencies": [ "org.apache.commons:commons-compress:1.20", - "org.slf4j:slf4j-api:1.7.30", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "directDependencies": [ "org.apache.commons:commons-compress:1.20", - "org.slf4j:slf4j-api:1.7.30", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "exclusions": [ @@ -4340,12 +4338,12 @@ "coord": "org.apache.avro:trevni-core:jar:tests:1.10.0", "dependencies": [ "org.apache.commons:commons-compress:1.20", - "org.slf4j:slf4j-api:1.7.30", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "directDependencies": [ "org.apache.commons:commons-compress:1.20", - "org.slf4j:slf4j-api:1.7.30", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "exclusions": [ @@ -4407,7 +4405,6 @@ "com.google.guava:listenablefuture:9999.0-empty-to-avoid-conflict-with-guava", "com.google.j2objc:j2objc-annotations:1.3", "com.google.code.findbugs:jsr305:3.0.2", - "org.slf4j:slf4j-api:1.7.30", "io.netty:netty-codec:4.1.50.Final", "io.netty:netty-transport-native-unix-common:4.1.50.Final", "log4j:log4j:1.2.17", @@ -4415,6 +4412,7 @@ "io.netty:netty-handler:4.1.50.Final", "io.netty:netty-common:4.1.50.Final", "com.google.errorprone:error_prone_annotations:2.3.4", + "org.slf4j:slf4j-api:1.7.32", "io.netty:netty-buffer:4.1.50.Final", "org.apache.yetus:audience-annotations:0.5.0", "org.apache.zookeeper:zookeeper:3.5.9", @@ -4493,8 +4491,8 @@ { "coord": "org.apache.kafka:connect-api:2.7.0", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", "org.lz4:lz4-java:1.7.1", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", "javax.ws.rs:javax.ws.rs-api:2.1.1", @@ -4503,7 +4501,7 @@ "directDependencies": [ "javax.ws.rs:javax.ws.rs-api:2.1.1", "org.apache.kafka:kafka-clients:6.1.1-ccs", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4525,10 +4523,10 @@ "dependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "org.lz4:lz4-java:1.7.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", "org.apache.kafka:connect-api:2.7.0", @@ -4538,7 +4536,7 @@ "com.fasterxml.jackson.core:jackson-databind:2.11.4", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4", "org.apache.kafka:connect-api:2.7.0", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "org.slf4j:slf4j-log4j12", @@ -4559,8 +4557,8 @@ { "coord": "org.apache.kafka:connect-transforms:2.7.0", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", "org.lz4:lz4-java:1.7.1", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", "javax.ws.rs:javax.ws.rs-api:2.1.1", @@ -4569,7 +4567,7 @@ ], "directDependencies": [ "org.apache.kafka:connect-api:2.7.0", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4589,15 +4587,15 @@ { "coord": "org.apache.kafka:kafka-clients:6.1.1-ccs", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", "com.github.luben:zstd-jni:1.4.5-6", "org.lz4:lz4-java:1.7.1", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "directDependencies": [ "com.github.luben:zstd-jni:1.4.5-6", "org.lz4:lz4-java:1.7.1", - "org.slf4j:slf4j-api:1.7.30", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "exclusions": [ @@ -4624,15 +4622,15 @@ { "coord": "org.apache.kafka:kafka-clients:jar:test:6.1.1-ccs", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", "com.github.luben:zstd-jni:1.4.5-6", "org.lz4:lz4-java:1.7.1", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "directDependencies": [ "com.github.luben:zstd-jni:1.4.5-6", "org.lz4:lz4-java:1.7.1", - "org.slf4j:slf4j-api:1.7.30", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7" ], "exclusions": [ @@ -4655,9 +4653,9 @@ "dependencies": [ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "org.lz4:lz4-java:1.7.1", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", "com.github.luben:zstd-jni:1.4.5-6" @@ -4665,7 +4663,7 @@ "directDependencies": [ "com.fasterxml.jackson.core:jackson-databind:2.11.4", "org.apache.kafka:kafka-clients:6.1.1-ccs", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "org.slf4j:slf4j-log4j12", @@ -4694,11 +4692,11 @@ "org.apache.kafka:connect-json:2.7.0", "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", - "org.slf4j:slf4j-api:1.7.30", "org.rocksdb:rocksdbjni:5.18.4", "org.lz4:lz4-java:1.7.1", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-clients:6.1.1-ccs", "org.apache.kafka:connect-api:2.7.0", @@ -4708,7 +4706,7 @@ "org.apache.kafka:connect-json:2.7.0", "org.apache.kafka:kafka-clients:6.1.1-ccs", "org.rocksdb:rocksdbjni:5.18.4", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4735,7 +4733,6 @@ "com.fasterxml.jackson.core:jackson-core:2.11.4", "com.fasterxml.jackson.core:jackson-annotations:2.11.4", "org.scala-lang.modules:scala-collection-compat_2.13:2.2.0", - "org.slf4j:slf4j-api:1.7.30", "org.scala-lang:scala-library:2.13.3", "io.netty:netty-codec:4.1.50.Final", "io.netty:netty-transport-native-unix-common:4.1.50.Final", @@ -4745,6 +4742,7 @@ "com.fasterxml.jackson.core:jackson-databind:2.11.4", "io.netty:netty-handler:4.1.50.Final", "io.netty:netty-common:4.1.50.Final", + "org.slf4j:slf4j-api:1.7.32", "io.netty:netty-buffer:4.1.50.Final", "org.xerial.snappy:snappy-java:1.1.7.7", "org.apache.kafka:kafka-raft:6.1.1-ccs", @@ -4767,10 +4765,10 @@ "com.typesafe.scala-logging:scala-logging_2.13:3.9.2", "org.scala-lang:scala-reflect:2.13.3", "org.scala-lang.modules:scala-collection-compat_2.13:2.2.0", - "org.slf4j:slf4j-api:1.7.30", "org.scala-lang:scala-library:2.13.3", "com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.4", "com.fasterxml.jackson.core:jackson-databind:2.11.4", + "org.slf4j:slf4j-api:1.7.32", "org.apache.kafka:kafka-raft:6.1.1-ccs", "org.apache.kafka:kafka-clients:6.1.1-ccs", "com.yammer.metrics:metrics-core:2.2.0", @@ -4796,7 +4794,7 @@ "url": "https://packages.confluent.io/maven/org/apache/kafka/kafka_2.13/6.1.1-ccs/kafka_2.13-6.1.1-ccs.jar" }, { - "coord": "org.apache.logging.log4j:log4j-api:2.12.1", + "coord": "org.apache.logging.log4j:log4j-api:2.15.0", "dependencies": [], "directDependencies": [], "exclusions": [ @@ -4805,22 +4803,22 @@ "org.springframework.boot:spring-boot-starter-logging", "org.slf4j:slf4j-log4j12" ], - "file": "v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.15.0/log4j-api-2.15.0.jar", "mirror_urls": [ - "https://packages.confluent.io/maven/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar", - "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar", - "https://jitpack.io/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar" + "https://packages.confluent.io/maven/org/apache/logging/log4j/log4j-api/2.15.0/log4j-api-2.15.0.jar", + "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.15.0/log4j-api-2.15.0.jar", + "https://jitpack.io/org/apache/logging/log4j/log4j-api/2.15.0/log4j-api-2.15.0.jar" ], - "sha256": "429534d03bdb728879ab551d469e26f6f7ff4c8a8627f59ac68ab6ef26063515", - "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.12.1/log4j-api-2.12.1.jar" + "sha256": "c8c33e7e8e05496dae69cf0caac8c3092cffd937a164526e92922d2d566d0a55", + "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-api/2.15.0/log4j-api-2.15.0.jar" }, { - "coord": "org.apache.logging.log4j:log4j-core:2.12.1", + "coord": "org.apache.logging.log4j:log4j-core:2.15.0", "dependencies": [ - "org.apache.logging.log4j:log4j-api:2.12.1" + "org.apache.logging.log4j:log4j-api:2.15.0" ], "directDependencies": [ - "org.apache.logging.log4j:log4j-api:2.12.1" + "org.apache.logging.log4j:log4j-api:2.15.0" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4828,26 +4826,26 @@ "org.springframework.boot:spring-boot-starter-logging", "org.slf4j:slf4j-log4j12" ], - "file": "v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.12.1/log4j-core-2.12.1.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.15.0/log4j-core-2.15.0.jar", "mirror_urls": [ - "https://packages.confluent.io/maven/org/apache/logging/log4j/log4j-core/2.12.1/log4j-core-2.12.1.jar", - "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.12.1/log4j-core-2.12.1.jar", - "https://jitpack.io/org/apache/logging/log4j/log4j-core/2.12.1/log4j-core-2.12.1.jar" + "https://packages.confluent.io/maven/org/apache/logging/log4j/log4j-core/2.15.0/log4j-core-2.15.0.jar", + "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.15.0/log4j-core-2.15.0.jar", + "https://jitpack.io/org/apache/logging/log4j/log4j-core/2.15.0/log4j-core-2.15.0.jar" ], - "sha256": "885e31a14fc71cb4849e93564d26a221c685a789379ef63cb2d082cedf3c2235", - "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.12.1/log4j-core-2.12.1.jar" + "sha256": "419a8512895971b7b4f4f33e620d361254e5c9552b904b0474b09ddd4a6a220b", + "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-core/2.15.0/log4j-core-2.15.0.jar" }, { - "coord": "org.apache.logging.log4j:log4j-slf4j-impl:2.12.1", + "coord": "org.apache.logging.log4j:log4j-slf4j-impl:2.15.0", "dependencies": [ - "org.apache.logging.log4j:log4j-core:2.12.1", - "org.slf4j:slf4j-api:1.7.30", - "org.apache.logging.log4j:log4j-api:2.12.1" + "org.apache.logging.log4j:log4j-core:2.15.0", + "org.apache.logging.log4j:log4j-api:2.15.0", + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ - "org.apache.logging.log4j:log4j-api:2.12.1", - "org.apache.logging.log4j:log4j-core:2.12.1", - "org.slf4j:slf4j-api:1.7.30" + "org.apache.logging.log4j:log4j-api:2.15.0", + "org.apache.logging.log4j:log4j-core:2.15.0", + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4855,14 +4853,14 @@ "org.springframework.boot:spring-boot-starter-logging", "org.slf4j:slf4j-log4j12" ], - "file": "v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar", + "file": "v1/https/repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.15.0/log4j-slf4j-impl-2.15.0.jar", "mirror_urls": [ - "https://packages.confluent.io/maven/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar", - "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar", - "https://jitpack.io/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar" + "https://packages.confluent.io/maven/org/apache/logging/log4j/log4j-slf4j-impl/2.15.0/log4j-slf4j-impl-2.15.0.jar", + "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.15.0/log4j-slf4j-impl-2.15.0.jar", + "https://jitpack.io/org/apache/logging/log4j/log4j-slf4j-impl/2.15.0/log4j-slf4j-impl-2.15.0.jar" ], - "sha256": "3d9620afc3cd58527a182b70e7c111b7289046989c0d04a50e46b0ec31dc138a", - "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.12.1/log4j-slf4j-impl-2.12.1.jar" + "sha256": "fd654a1aa0b34196be41aa9e1e53362493f1a89109ff931c79ad2d58cc90eaa6", + "url": "https://repo1.maven.org/maven2/org/apache/logging/log4j/log4j-slf4j-impl/2.15.0/log4j-slf4j-impl-2.15.0.jar" }, { "coord": "org.apache.lucene:lucene-analyzers-common:8.7.0", @@ -4976,10 +4974,10 @@ { "coord": "org.apache.mina:mina-core:2.1.3", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -4999,12 +4997,12 @@ { "coord": "org.apache.velocity:velocity-engine-core:2.2", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", - "org.apache.commons:commons-lang3:3.9" + "org.apache.commons:commons-lang3:3.9", + "org.slf4j:slf4j-api:1.7.32" ], "directDependencies": [ "org.apache.commons:commons-lang3:3.9", - "org.slf4j:slf4j-api:1.7.30" + "org.slf4j:slf4j-api:1.7.32" ], "exclusions": [ "ch.qos.logback:logback-classic", @@ -5080,12 +5078,12 @@ { "coord": "org.apache.zookeeper:zookeeper:3.5.9", "dependencies": [ - "org.slf4j:slf4j-api:1.7.30", "io.netty:netty-codec:4.1.50.Final", "io.netty:netty-transport-native-unix-common:4.1.50.Final", "io.netty:netty-transport-native-epoll:4.1.50.Final", "io.netty:netty-handler:4.1.50.Final", "io.netty:netty-common:4.1.50.Final", + "org.slf4j:slf4j-api:1.7.32", "io.netty:netty-buffer:4.1.50.Final", "org.apache.yetus:audience-annotations:0.5.0", "org.apache.zookeeper:zookeeper-jute:3.5.9", @@ -5093,9 +5091,9 @@ "io.netty:netty-transport:4.1.50.Final" ], "directDependencies": [ - "org.slf4j:slf4j-api:1.7.30", "io.netty:netty-transport-native-epoll:4.1.50.Final", "io.netty:netty-handler:4.1.50.Final", + "org.slf4j:slf4j-api:1.7.32", "org.apache.yetus:audience-annotations:0.5.0", "org.apache.zookeeper:zookeeper-jute:3.5.9" ], @@ -7448,23 +7446,53 @@ "url": "https://repo1.maven.org/maven2/org/skyscreamer/jsonassert/1.5.0/jsonassert-1.5.0.jar" }, { - "coord": "org.slf4j:slf4j-api:1.7.30", + "coord": "org.slf4j:slf4j-api:1.7.32", "dependencies": [], "directDependencies": [], + "exclusions": [ + "*:jline", + "*:jmxtools", + "*:log4j", + "*:slf4j-log4j12", + "*:jms", + "*:mail", + "*:javax", + "*:jmxri", + "org.springframework.boot:spring-boot-starter-tomcat", + "ch.qos.logback:logback-classic", + "org.springframework.boot:spring-boot-starter-logging" + ], + "file": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar", + "mirror_urls": [ + "https://packages.confluent.io/maven/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar", + "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar", + "https://jitpack.io/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" + ], + "sha256": "3624f8474c1af46d75f98bc097d7864a323c81b3808aa43689a6e1c601c027be", + "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.32/slf4j-api-1.7.32.jar" + }, + { + "coord": "org.slf4j:slf4j-nop:1.7.32", + "dependencies": [ + "org.slf4j:slf4j-api:1.7.32" + ], + "directDependencies": [ + "org.slf4j:slf4j-api:1.7.32" + ], "exclusions": [ "ch.qos.logback:logback-classic", "org.springframework.boot:spring-boot-starter-tomcat", "org.springframework.boot:spring-boot-starter-logging", "org.slf4j:slf4j-log4j12" ], - "file": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar", + "file": "v1/https/repo1.maven.org/maven2/org/slf4j/slf4j-nop/1.7.32/slf4j-nop-1.7.32.jar", "mirror_urls": [ - "https://packages.confluent.io/maven/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar", - "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar", - "https://jitpack.io/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" + "https://packages.confluent.io/maven/org/slf4j/slf4j-nop/1.7.32/slf4j-nop-1.7.32.jar", + "https://repo1.maven.org/maven2/org/slf4j/slf4j-nop/1.7.32/slf4j-nop-1.7.32.jar", + "https://jitpack.io/org/slf4j/slf4j-nop/1.7.32/slf4j-nop-1.7.32.jar" ], - "sha256": "cdba07964d1bb40a0761485c6b1e8c2f8fd9eb1d19c53928ac0d7f9510105c57", - "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-api/1.7.30/slf4j-api-1.7.30.jar" + "sha256": "f2d20b60b2b87fc1ca904e0cd4520deeeebf8a9c5b723ae2493cc4219389d782", + "url": "https://repo1.maven.org/maven2/org/slf4j/slf4j-nop/1.7.32/slf4j-nop-1.7.32.jar" }, { "coord": "org.springframework.boot:spring-boot-actuator-autoconfigure:2.4.5", @@ -7831,7 +7859,6 @@ "org.springframework.boot:spring-boot-autoconfigure:2.4.5", "org.ow2.asm:asm:9.0", "org.springframework:spring-beans:5.3.6", - "org.slf4j:slf4j-api:1.7.30", "org.springframework:spring-jcl:5.3.6", "org.objenesis:objenesis:3.1", "org.mockito:mockito-junit-jupiter:3.6.28", @@ -7840,6 +7867,7 @@ "org.springframework:spring-context:5.3.6", "org.opentest4j:opentest4j:1.2.0", "org.springframework:spring-expression:5.3.6", + "org.slf4j:slf4j-api:1.7.32", "jakarta.annotation:jakarta.annotation-api:1.3.5", "org.junit.jupiter:junit-jupiter-api:5.7.1", "org.springframework.boot:spring-boot-test:2.4.5", diff --git a/repositories.bzl b/repositories.bzl index 1a7cb00cc0..e09300a127 100644 --- a/repositories.bzl +++ b/repositories.bzl @@ -22,9 +22,10 @@ airy_jvm_deps = [ "javax.activation:javax.activation-api:1.2.0", "javax.validation:validation-api:2.0.1.Final", "javax.xml.bind:jaxb-api:2.3.1", - "org.apache.logging.log4j:log4j-core:2.12.1", - "org.apache.logging.log4j:log4j-slf4j-impl:2.12.1", - "org.slf4j:slf4j-api:1.7.29", + "org.apache.logging.log4j:log4j-core:2.15.0", + "org.apache.logging.log4j:log4j-slf4j-impl:2.15.0", + "org.slf4j:slf4j-nop:1.7.32", + "org.slf4j:slf4j-api:1.7.32", "org.apache.avro:avro-tools:1.10.0", "org.apache.avro:avro:1.10.0", "org.apache.curator:curator-test:4.2.0", @@ -63,6 +64,8 @@ airy_jvm_deps = [ "org.springframework:spring-websocket:5.3.6", "org.springframework.security:spring-security-core:5.4.6", "org.rocksdb:rocksdbjni:5.18.3", + "com.segment.analytics.java:analytics-core:3.1.3", + "com.segment.analytics.java:analytics:3.1.3", ] excluded_artifacts = [ From d846d6d1e75ef85b7ae46690af5e84660559f31d Mon Sep 17 00:00:00 2001 From: Ljupco Vangelski Date: Thu, 16 Dec 2021 16:11:24 +0100 Subject: [PATCH 14/24] [#2660] Refactor fargate_profiles in AWS EKS (#2661) --- infrastructure/terraform/modules/aws_eks/main.tf | 14 +++++--------- .../terraform/modules/aws_eks/outputs.tf | 8 ++++++++ .../terraform/modules/aws_eks/variables.tf | 9 +++------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/infrastructure/terraform/modules/aws_eks/main.tf b/infrastructure/terraform/modules/aws_eks/main.tf index ef0bfa6714..8494c6c05d 100644 --- a/infrastructure/terraform/modules/aws_eks/main.tf +++ b/infrastructure/terraform/modules/aws_eks/main.tf @@ -100,21 +100,17 @@ module "eks" { } -resource "aws_eks_fargate_profile" "example" { - - +resource "aws_eks_fargate_profile" "namespaces" { + count = length(var.fargate_profiles) cluster_name = var.core_id - fargate_profile_name = "stateless" + fargate_profile_name = "stateless-${var.fargate_profiles[count.index]}" pod_execution_role_arn = module.eks.fargate_iam_role_arn subnet_ids = module.vpc.private_subnets - dynamic "selector" { - for_each = var.fargate_profiles - content { - namespace = selector.value + selector { + namespace = var.fargate_profiles[count.index] labels = { WorkerType = "fargate" } - } } } diff --git a/infrastructure/terraform/modules/aws_eks/outputs.tf b/infrastructure/terraform/modules/aws_eks/outputs.tf index bb7600447e..20edcf6723 100644 --- a/infrastructure/terraform/modules/aws_eks/outputs.tf +++ b/infrastructure/terraform/modules/aws_eks/outputs.tf @@ -25,3 +25,11 @@ output "vpc_id" { output "vpc_cidr_block" { value = module.vpc.vpc_cidr_block } + +output "fargate_iam_role_arn" { + value = module.eks.fargate_iam_role_arn +} + +output "vpc_private_subnets" { + value = module.vpc.private_subnets +} \ No newline at end of file diff --git a/infrastructure/terraform/modules/aws_eks/variables.tf b/infrastructure/terraform/modules/aws_eks/variables.tf index f0525b5b14..16124dcaa6 100644 --- a/infrastructure/terraform/modules/aws_eks/variables.tf +++ b/infrastructure/terraform/modules/aws_eks/variables.tf @@ -64,13 +64,10 @@ variable "kubeconfig_output_path" { default = "../main/.kubeconfig" } -variable "fargate_namespaces" { - type = list(string) - default = [ "default" ] -} - variable "fargate_profiles" { - + type = list(string) + description = "List of Fargate namespaces (maximum of 10)" + default = [] } variable "kubernetes_users" { From a6f5b9e12d651fd59d199bc81557d00225cea1b2 Mon Sep 17 00:00:00 2001 From: Pascal Holy <54705263+pascal-airy@users.noreply.github.com> Date: Thu, 16 Dec 2021 16:52:14 +0100 Subject: [PATCH 15/24] =?UTF-8?q?[#2644]=20Draft=20release=20contains=20fe?= =?UTF-8?q?atures=20that=20are=E2=80=A6=20(#2645)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #2645 --- .github/workflows/release-drafter.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/release-drafter.yml b/.github/workflows/release-drafter.yml index ba09160463..15fc9e17d8 100644 --- a/.github/workflows/release-drafter.yml +++ b/.github/workflows/release-drafter.yml @@ -3,7 +3,7 @@ name: Release Drafter on: push: branches: - - develop + - release/* jobs: update_release_draft: From cb69d4cbf1779c210c2a01abd4f865b823810f7c Mon Sep 17 00:00:00 2001 From: Aitor Algorta Date: Thu, 16 Dec 2021 17:03:39 +0100 Subject: [PATCH 16/24] full screen chat for mobile (#2662) --- frontend/chat-plugin/lib/src/AiryChatPlugin.tsx | 9 +++++++-- .../lib/src/airyRenderProps/AiryBubble/index.module.scss | 4 ++++ .../lib/src/airyRenderProps/AiryBubble/index.tsx | 7 ++++++- .../src/airyRenderProps/AiryHeaderBar/index.module.scss | 6 ++++++ .../lib/src/components/chat/index.module.scss | 5 +++++ 5 files changed, 28 insertions(+), 3 deletions(-) diff --git a/frontend/chat-plugin/lib/src/AiryChatPlugin.tsx b/frontend/chat-plugin/lib/src/AiryChatPlugin.tsx index c17588dcbe..339c6d942b 100644 --- a/frontend/chat-plugin/lib/src/AiryChatPlugin.tsx +++ b/frontend/chat-plugin/lib/src/AiryChatPlugin.tsx @@ -17,18 +17,23 @@ export const AiryChatPlugin = (props: AiryChatPluginProps) => { const [windowHeight, setWindowHeight] = useState(window.innerHeight); const [windowWidth, setWindowWidth] = useState(window.innerWidth); + const [windowBrowserHeight, setWindowBrowserHeight] = useState(window.outerHeight); + const [windowBrowserWidth, setWindowBrowserWidth] = useState(window.outerWidth); const handleResize = () => { setWindowHeight(window.innerHeight); setWindowWidth(window.innerWidth); + setWindowBrowserHeight(window.outerHeight); + setWindowBrowserWidth(window.outerWidth); }; window.addEventListener('resize', handleResize); const customStyle = { background: 'transparent', - width: Math.min(config.config?.width ?? defaultWidth, windowWidth), - height: Math.min(config.config?.height ?? defaultHeight, windowHeight), + width: windowBrowserWidth < 420 ? windowBrowserWidth : Math.min(config.config?.width ?? defaultWidth, windowWidth), + height: + windowBrowserHeight < 850 ? windowBrowserHeight : Math.min(config.config?.height ?? defaultHeight, windowHeight), ...(config.config?.primaryColor && { '--color-airy-blue': config.config?.primaryColor, '--color-airy-message-outbound': config.config?.primaryColor, diff --git a/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.module.scss b/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.module.scss index 801b218e03..fb7349063f 100644 --- a/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.module.scss +++ b/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.module.scss @@ -10,6 +10,10 @@ transition: all 0.2s ease-in-out; cursor: pointer; pointer-events: all; + @media only screen and (max-device-width: 420px) and (max-device-width: 820px) { + height: 0; + display: none; + } } .hideBubble:hover { diff --git a/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx b/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx index bd5a3ea7f3..c7a96a58b1 100644 --- a/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx +++ b/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx @@ -38,7 +38,12 @@ const AiryBubble = (props: Props) => { }; return ( -

props.toggleHideChat()} data-cy={props.dataCyId}> +
props.toggleHideChat()} + data-cy={props.dataCyId} + > {!props.isChatHidden ? ( diff --git a/frontend/chat-plugin/lib/src/airyRenderProps/AiryHeaderBar/index.module.scss b/frontend/chat-plugin/lib/src/airyRenderProps/AiryHeaderBar/index.module.scss index 161b910aa9..8ac2e4f1ff 100644 --- a/frontend/chat-plugin/lib/src/airyRenderProps/AiryHeaderBar/index.module.scss +++ b/frontend/chat-plugin/lib/src/airyRenderProps/AiryHeaderBar/index.module.scss @@ -7,6 +7,10 @@ border-top-right-radius: 8px; border-bottom: 1px solid #fff; height: 48px; + @media only screen and (max-device-width: 420px) and (max-device-width: 820px) { + border-top-left-radius: 0; + border-top-right-radius: 0; + } } .headerInfo { @@ -26,6 +30,8 @@ font-size: 20px; line-height: 24px; font-weight: bold; + text-align: left; + text-transform: none; padding: 0; margin: 0 8px 0 8px; cursor: none; diff --git a/frontend/chat-plugin/lib/src/components/chat/index.module.scss b/frontend/chat-plugin/lib/src/components/chat/index.module.scss index 9d617cb796..691dfe6c4a 100644 --- a/frontend/chat-plugin/lib/src/components/chat/index.module.scss +++ b/frontend/chat-plugin/lib/src/components/chat/index.module.scss @@ -51,6 +51,11 @@ flex-direction: column; flex-grow: 1; pointer-events: all; + @media only screen and (max-device-width: 420px) and (max-device-width: 820px) { + margin: 0; + border-radius: 0; + box-shadow: none; + } } .containerAnimationOpen { From cc835f958d2637f01d227bdc349a7c194bf712ff Mon Sep 17 00:00:00 2001 From: Christoph Proeschel Date: Thu, 16 Dec 2021 17:05:26 +0100 Subject: [PATCH 17/24] [#2623] Return message delivery error as metadata (#2657) --- .../co/airy/model/metadata/MetadataKeys.java | 1 + .../airy/core/sources/facebook/Connector.java | 18 +++++-- .../airy/core/sources/facebook/api/Api.java | 45 +++++++++++------ .../sources/facebook/api/ApiException.java | 12 ++++- .../sources/facebook/SendMessageTest.java | 39 +++++++++++++-- .../core/sources/google/ApiException.java | 12 ++++- .../airy/core/sources/google/Connector.java | 31 ++++++++---- .../co/airy/core/sources/google/Stores.java | 18 ++++--- .../core/sources/google/services/Api.java | 21 ++++++-- .../airy/core/sources/twilio/Connector.java | 37 ++++++++++---- .../co/airy/core/sources/twilio/Stores.java | 18 ++++--- .../sources/twilio/services/ApiException.java | 15 ++++++ .../core/sources/twilio/SendMessageTest.java | 46 +++++++++++++---- .../co/airy/core/sources/viber/Connector.java | 6 +-- .../airy/core/sources/viber/EventsRouter.java | 8 +++ .../airy/core/sources/viber/services/Api.java | 46 +++++++++++++++-- .../sources/viber/services/ApiException.java | 15 ++++++ .../airy/core/sources/viber/ChannelsTest.java | 3 +- .../core/sources/viber/EventsRouterTest.java | 5 ++ .../core/sources/viber/SendMessageTest.java | 32 +++++++++++- .../sources/viber/WebhookControllerTest.java | 5 ++ .../api/endpoints/google-messages-send.mdx | 46 ----------------- docs/docs/api/endpoints/messages.md | 49 +++++++++++++++++-- docs/docs/sources/google.md | 43 +++++++++++++++- 24 files changed, 434 insertions(+), 137 deletions(-) create mode 100644 backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/services/ApiException.java create mode 100644 backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/ApiException.java delete mode 100644 docs/docs/api/endpoints/google-messages-send.mdx diff --git a/backend/model/metadata/src/main/java/co/airy/model/metadata/MetadataKeys.java b/backend/model/metadata/src/main/java/co/airy/model/metadata/MetadataKeys.java index b70944781a..1c60e6d917 100644 --- a/backend/model/metadata/src/main/java/co/airy/model/metadata/MetadataKeys.java +++ b/backend/model/metadata/src/main/java/co/airy/model/metadata/MetadataKeys.java @@ -50,6 +50,7 @@ public static class MessageKeys { public static class Source { public static final String ID = "source.id"; public static final String DELIVERY_STATE = "source.delivery_state"; + public static final String ERROR = "source.error"; } public static class Reaction { diff --git a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/Connector.java b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/Connector.java index 4ce019e554..829758e9a0 100644 --- a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/Connector.java +++ b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/Connector.java @@ -78,13 +78,23 @@ public List> sendMessage(SendMessageRequest return List.of(KeyValue.pair(message.getId(), message), KeyValue.pair(getId(metadata).toString(), metadata)); } catch (ApiException e) { - log.error(String.format("Failed to send a message to Facebook \n SendMessageRequest: %s \n Error Message: %s \n", sendMessageRequest, e.getMessage()), e); + log.error(String.format("Failed to send a message to Facebook \n SendMessageRequest: %s \n Api Exception: %s \n", sendMessageRequest, e.getMessage()), e); + final ArrayList> results = new ArrayList<>(); + final Metadata error = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.ERROR, e.getMessage()); + results.add(KeyValue.pair(getId(error).toString(), error)); + + if (e.getErrorPayload() != null) { + final Metadata errorPayload = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.Source.ERROR, e.getErrorPayload()); + results.add(KeyValue.pair(getId(errorPayload).toString(), errorPayload)); + } + updateDeliveryState(message, DeliveryState.FAILED); + return results; } catch (Exception e) { log.error(String.format("Failed to send a message to Facebook \n SendMessageRequest: %s", sendMessageRequest), e); + final Metadata metadata = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.ERROR, e.getMessage()); + updateDeliveryState(message, DeliveryState.FAILED); + return List.of(KeyValue.pair(message.getId(), message), KeyValue.pair(getId(metadata).toString(), metadata)); } - - updateDeliveryState(message, DeliveryState.FAILED); - return List.of(KeyValue.pair(message.getId(), message)); } private boolean isMessageStale(Message message) { diff --git a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/Api.java b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/Api.java index 33cb25e559..4264715ff1 100644 --- a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/Api.java +++ b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/Api.java @@ -8,7 +8,12 @@ import co.airy.core.sources.facebook.api.model.SendMessagePayload; import co.airy.core.sources.facebook.api.model.SendMessageResponse; import co.airy.core.sources.facebook.api.model.UserProfile; +import co.airy.log.AiryLoggerFactory; +import com.fasterxml.jackson.databind.DeserializationFeature; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; +import com.fasterxml.jackson.databind.PropertyNamingStrategy; +import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.web.client.RestTemplateBuilder; @@ -39,6 +44,7 @@ */ @Service public class Api implements ApplicationListener { + private static final Logger log = AiryLoggerFactory.getLogger(Api.class); private final RestTemplateBuilder restTemplateBuilder; private final ObjectMapper objectMapper; private RestTemplate restTemplate; @@ -51,16 +57,15 @@ public class Api implements ApplicationListener { private final HttpHeaders httpHeaders = new HttpHeaders(); private final String appId; private final String apiSecret; - private static final String errorMessageTemplate = - "Exception while sending a message to Facebook: \n" + - "Http Status Code: %s \n" + - "Error Message: %s \n"; - public Api(ObjectMapper objectMapper, RestTemplateBuilder restTemplateBuilder, + public Api(RestTemplateBuilder restTemplateBuilder, @Value("${facebook.app-id}") String appId, @Value("${facebook.app-secret}") String apiSecret) { httpHeaders.setContentType(MediaType.APPLICATION_JSON); - this.objectMapper = objectMapper; + this.objectMapper = new ObjectMapper() + .configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false) + .configure(DeserializationFeature.FAIL_ON_MISSING_EXTERNAL_TYPE_ID_PROPERTY, false) + .setPropertyNamingStrategy(PropertyNamingStrategy.SNAKE_CASE); this.restTemplateBuilder = restTemplateBuilder; this.appId = appId; this.apiSecret = apiSecret; @@ -111,11 +116,8 @@ public UserProfile getInstagramProfile(String sourceConversationId, String token public UserProfile getProfileFromContact(String sourceConversationId, String token) { String reqUrl = String.format(baseUrl + "/%s?fields=first_name,last_name,profile_pic&access_token=%s", sourceConversationId, token); - ResponseEntity responseEntity = restTemplate.getForEntity(reqUrl, UserProfile.class); - if (responseEntity.getStatusCode() != HttpStatus.OK) { - throw new ApiException("Call unsuccessful, received HTTP status " + responseEntity.getStatusCodeValue()); - } - return responseEntity.getBody(); + ResponseEntity response = restTemplate.getForEntity(reqUrl, UserProfile.class); + return response.getBody(); } // See https://developers.facebook.com/docs/graph-api/reference/v9.0/conversation#edges @@ -123,12 +125,12 @@ public UserProfile getProfileFromParticipants(String sourceConversationId, Strin String reqUrl = String.format(baseUrl + "/me/conversations?user_id=%s&fields=participants&access_token=%s", sourceConversationId, token); - ResponseEntity responseEntity = restTemplate.getForEntity(reqUrl, Participants.class); - if (responseEntity.getBody() == null || responseEntity.getStatusCode() != HttpStatus.OK) { - throw new ApiException("Call unsuccessful"); + ResponseEntity response = restTemplate.getForEntity(reqUrl, Participants.class); + if (response.getBody() == null) { + throw new ApiException(String.format("Response body was null, status code %s", response.getStatusCode())); } - return fromParticipants(responseEntity.getBody(), sourceConversationId); + return fromParticipants(response.getBody(), sourceConversationId); } public PageWithConnectInfo getPageForUser(final String pageId, final String accessToken) throws Exception { @@ -180,7 +182,18 @@ public boolean hasError(ClientHttpResponse response) throws IOException { @Override public void handleError(ClientHttpResponse response) throws IOException { - throw new ApiException(String.format(errorMessageTemplate, response.getRawStatusCode(), new String(response.getBody().readAllBytes()))); + final String errorPayload = new String(response.getBody().readAllBytes()); + final int statusCode = response.getRawStatusCode(); + + final JsonNode jsonNode = objectMapper.readTree(errorPayload); + final String errorMessage = Optional.of(jsonNode.get("error")) + .map((node) -> node.get("message")) + .map(JsonNode::textValue) + .orElseGet(() -> { + log.warn("Could not parse error message from response: {}", errorPayload); + return String.format("Api replied with status code %s and payload %s", statusCode, errorPayload); + }); + throw new ApiException(errorMessage, errorPayload); } }) .additionalMessageConverters(new MappingJackson2HttpMessageConverter(objectMapper)) diff --git a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/ApiException.java b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/ApiException.java index 69dbceff1a..01dae8f3e0 100644 --- a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/ApiException.java +++ b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/ApiException.java @@ -1,7 +1,15 @@ package co.airy.core.sources.facebook.api; +import lombok.Getter; + public class ApiException extends RuntimeException { - public ApiException(String msg) { - super(msg); + @Getter + private String errorPayload; + public ApiException(String message) { + super(message); + } + public ApiException(String message, String errorPayload) { + super(message); + this.errorPayload = errorPayload; } } diff --git a/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/SendMessageTest.java b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/SendMessageTest.java index cbbd660c34..dbb865a7d5 100644 --- a/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/SendMessageTest.java +++ b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/SendMessageTest.java @@ -4,7 +4,9 @@ import co.airy.avro.communication.ChannelConnectionState; import co.airy.avro.communication.DeliveryState; import co.airy.avro.communication.Message; +import co.airy.avro.communication.Metadata; import co.airy.core.sources.facebook.api.Api; +import co.airy.core.sources.facebook.api.ApiException; import co.airy.core.sources.facebook.api.model.SendMessagePayload; import co.airy.core.sources.facebook.api.model.SendMessageResponse; import co.airy.kafka.schema.Topic; @@ -13,6 +15,7 @@ import co.airy.kafka.schema.application.ApplicationCommunicationMetadata; import co.airy.kafka.test.KafkaTestHelper; import co.airy.kafka.test.junit.SharedKafkaTestResource; +import co.airy.model.metadata.MetadataKeys; import co.airy.spring.core.AirySpringBootApplication; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; @@ -36,6 +39,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import static co.airy.model.metadata.MetadataRepository.getSubject; import static co.airy.test.Timing.retryOnException; import static org.apache.kafka.streams.KafkaStreams.State.RUNNING; import static org.hamcrest.MatcherAssert.assertThat; @@ -89,17 +93,21 @@ void beforeEach() throws InterruptedException { } @Test - void canSendMessageViaTheFacebookApi() throws Exception { + void canSendMessage() throws Exception { final String conversationId = "conversationId"; final String messageId = "message-id"; + final String failingMessageId = "message-id-failing"; final String sourceConversationId = "source-conversation-id"; final String channelId = "channel-id"; final String token = "token"; final String text = "Hello World"; + final String errorMessage = "message delivery failed"; ArgumentCaptor payloadCaptor = ArgumentCaptor.forClass(SendMessagePayload.class); ArgumentCaptor tokenCaptor = ArgumentCaptor.forClass(String.class); - when(api.sendMessage(tokenCaptor.capture(), payloadCaptor.capture())).thenReturn(new SendMessageResponse("recipient id", "message id")); + when(api.sendMessage(tokenCaptor.capture(), payloadCaptor.capture())) + .thenReturn(new SendMessageResponse("recipient id", "message id")) + .thenThrow(new ApiException(errorMessage)); kafkaTestHelper.produceRecords(List.of( new ProducerRecord<>(applicationCommunicationChannels.name(), channelId, Channel.newBuilder() @@ -129,7 +137,7 @@ void canSendMessageViaTheFacebookApi() throws Exception { final ObjectMapper objectMapper = new ObjectMapper(); final JsonNode messagePayload = objectMapper.readTree("{\"text\":\"Hello Facebook\"}"); - kafkaTestHelper.produceRecord(new ProducerRecord<>(applicationCommunicationMessages.name(), messageId, + kafkaTestHelper.produceRecords(List.of(new ProducerRecord<>(applicationCommunicationMessages.name(), messageId, Message.newBuilder() .setId(messageId) .setSentAt(Instant.now().toEpochMilli()) @@ -140,8 +148,21 @@ void canSendMessageViaTheFacebookApi() throws Exception { .setSource("facebook") .setContent(objectMapper.writeValueAsString(messagePayload)) .setIsFromContact(false) - .build()) - ); + .build()), + // This message should fail + new ProducerRecord<>(applicationCommunicationMessages.name(), messageId, + Message.newBuilder() + .setId(failingMessageId) + .setSentAt(Instant.now().toEpochMilli()) + .setSenderId("user-id") + .setDeliveryState(DeliveryState.PENDING) + .setConversationId(conversationId) + .setChannelId(channelId) + .setSource("facebook") + .setContent(objectMapper.writeValueAsString(messagePayload)) + .setIsFromContact(false) + .build()) + )); retryOnException(() -> { final SendMessagePayload sendMessagePayload = payloadCaptor.getValue(); @@ -150,5 +171,13 @@ void canSendMessageViaTheFacebookApi() throws Exception { assertThat(tokenCaptor.getValue(), equalTo(token)); }, "Facebook API was not called"); + + final List metadataList = kafkaTestHelper.consumeValues(3, applicationCommunicationMetadata.name()); + + assertThat(metadataList.size(), equalTo(3)); + assertThat(metadataList.stream().anyMatch((metadata) -> + metadata.getKey().equals(MetadataKeys.MessageKeys.ERROR) + && metadata.getValue().equals(errorMessage) + && getSubject(metadata).getIdentifier().equals(failingMessageId)), equalTo(true)); } } diff --git a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/ApiException.java b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/ApiException.java index d112f46a0c..cd1a361a30 100644 --- a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/ApiException.java +++ b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/ApiException.java @@ -1,7 +1,15 @@ package co.airy.core.sources.google; +import lombok.Getter; + public class ApiException extends RuntimeException { - public ApiException(String msg) { - super(msg); + @Getter + private String errorPayload; + public ApiException(String message) { + super(message); + } + public ApiException(String message, String errorPayload) { + super(message); + this.errorPayload = errorPayload; } } diff --git a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Connector.java b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Connector.java index c1fe9459a6..bc4d98c100 100644 --- a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Connector.java +++ b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Connector.java @@ -2,14 +2,18 @@ import co.airy.avro.communication.DeliveryState; import co.airy.avro.communication.Message; +import co.airy.avro.communication.Metadata; import co.airy.core.sources.google.model.SendMessageRequest; import co.airy.core.sources.google.services.Api; import co.airy.core.sources.google.services.Mapper; import co.airy.log.AiryLoggerFactory; +import co.airy.model.metadata.MetadataKeys; import co.airy.spring.auth.IgnoreAuthPattern; import co.airy.spring.web.filters.RequestLoggingIgnorePatterns; import co.airy.tracking.RouteTracking; import com.fasterxml.jackson.databind.JsonNode; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.streams.KeyValue; import org.slf4j.Logger; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; @@ -22,6 +26,8 @@ import java.util.regex.Pattern; import static co.airy.model.message.MessageRepository.updateDeliveryState; +import static co.airy.model.metadata.MetadataRepository.getId; +import static co.airy.model.metadata.MetadataRepository.newMessageMetadata; @Component public class Connector { @@ -36,18 +42,18 @@ public class Connector { this.mapper = mapper; } - public Message sendMessage(SendMessageRequest sendMessageRequest) { + public List> sendMessage(SendMessageRequest sendMessageRequest) { final Message message = sendMessageRequest.getMessage(); if (isMessageStale(message)) { updateDeliveryState(message, DeliveryState.FAILED); - return message; + return List.of(KeyValue.pair(message.getId(), message)); } if (sendMessageRequest.getSourceConversationId() == null) { // Cannot start conversation for Google updateDeliveryState(message, DeliveryState.FAILED); - return message; + return List.of(KeyValue.pair(message.getId(), message)); } try { @@ -55,15 +61,22 @@ public Message sendMessage(SendMessageRequest sendMessageRequest) { api.sendMessage(sendMessageRequest.getSourceConversationId(), sendMessagePayload); updateDeliveryState(message, DeliveryState.DELIVERED); - return message; + return List.of(KeyValue.pair(message.getId(), message)); } catch (ApiException e) { - log.error(String.format("Google Api Exception for SendMessageRequest:\n%s", sendMessageRequest), e); + log.error(String.format("Failed to send a message to Facebook \n SendMessageRequest: %s \n Api Exception: %s \n", sendMessageRequest, e.getMessage()), e); + final Metadata error = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.ERROR, e.getMessage()); + final Metadata errorPayload = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.Source.ERROR, e.getErrorPayload()); + updateDeliveryState(message, DeliveryState.FAILED); + return List.of(KeyValue.pair(message.getId(), message), + KeyValue.pair(getId(error).toString(), errorPayload), + KeyValue.pair(getId(errorPayload).toString(), errorPayload) + ); } catch (Exception e) { - log.error(String.format("Failed to send a message to Google \nSendMessageRequest: %s", sendMessageRequest), e); + log.error(String.format("Failed to send a message to Facebook \n SendMessageRequest: %s", sendMessageRequest), e); + final Metadata metadata = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.ERROR, e.getMessage()); + updateDeliveryState(message, DeliveryState.FAILED); + return List.of(KeyValue.pair(message.getId(), message), KeyValue.pair(getId(metadata).toString(), metadata)); } - - updateDeliveryState(message, DeliveryState.FAILED); - return message; } private boolean isMessageStale(Message message) { diff --git a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Stores.java b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Stores.java index 0054ee1b51..da2b28fc53 100644 --- a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Stores.java +++ b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/Stores.java @@ -14,7 +14,6 @@ import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.KeyValue; import org.apache.kafka.streams.StreamsBuilder; import org.apache.kafka.streams.kstream.KStream; import org.apache.kafka.streams.kstream.KTable; @@ -37,6 +36,7 @@ public class Stores implements ApplicationListener, Dispo private final String channelsStore = "channels-store"; private static final String applicationCommunicationChannels = new ApplicationCommunicationChannels().name(); private static final String applicationCommunicationMetadata = new ApplicationCommunicationMetadata().name(); + private static final String applicationCommunicationMessages = new ApplicationCommunicationMessages().name(); private final KafkaStreamsWrapper streams; private final KafkaProducer producer; @@ -70,11 +70,17 @@ public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { messageStream.filter((conversationId, message) -> DeliveryState.PENDING.equals(message.getDeliveryState())) .join(contextTable, (message, sendMessageRequest) -> sendMessageRequest.toBuilder().message(message).build()) - .map((conversationId, sendMessageRequest) -> { - final Message message = connector.sendMessage(sendMessageRequest); - return KeyValue.pair(message.getId(), message); - }) - .to(new ApplicationCommunicationMessages().name()); + .flatMap((conversationId, sendMessageRequest) -> connector.sendMessage(sendMessageRequest)) + .to((recordId, record, context) -> { + if (record instanceof Metadata) { + return applicationCommunicationMetadata; + } + if (record instanceof Message) { + return applicationCommunicationMessages; + } + + throw new IllegalStateException("Unknown type for record " + record); + }); streams.start(builder.build(), appId); } diff --git a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/services/Api.java b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/services/Api.java index 86a462184d..85cfe73b0e 100644 --- a/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/services/Api.java +++ b/backend/sources/google/connector/src/main/java/co/airy/core/sources/google/services/Api.java @@ -2,10 +2,12 @@ import co.airy.core.sources.google.ApiException; import co.airy.core.sources.google.model.GoogleServiceAccount; +import co.airy.log.AiryLoggerFactory; import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.google.auth.oauth2.AccessToken; import com.google.auth.oauth2.GoogleCredentials; +import org.slf4j.Logger; import org.springframework.boot.context.event.ApplicationReadyEvent; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.ApplicationListener; @@ -22,19 +24,17 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.util.List; +import java.util.Optional; @Service public class Api implements ApplicationListener { + private static final Logger log = AiryLoggerFactory.getLogger(Api.class); final RestTemplateBuilder restTemplateBuilder; final ObjectMapper objectMapper; final GoogleServiceAccount serviceAccount; private RestTemplate restTemplate; private static final String requestTemplate = "https://businessmessages.googleapis.com/v1/conversations/%s/messages"; - private static final String errorMessageTemplate = - "Exception while sending a message to Google: \n" + - "Http Status Code: %s \n" + - "Error Message: %s \n"; public Api(RestTemplateBuilder restTemplateBuilder, ObjectMapper objectMapper, GoogleServiceAccount serviceAccount) { this.restTemplateBuilder = restTemplateBuilder; @@ -67,7 +67,18 @@ public boolean hasError(ClientHttpResponse response) throws IOException { @Override public void handleError(ClientHttpResponse response) throws IOException { - throw new ApiException(String.format(errorMessageTemplate, response.getRawStatusCode(), new String(response.getBody().readAllBytes()))); + final String errorPayload = new String(response.getBody().readAllBytes()); + final int statusCode = response.getRawStatusCode(); + + final JsonNode jsonNode = objectMapper.readTree(errorPayload); + final String errorMessage = Optional.of(jsonNode.get("error")) + .map((node) -> node.get("message")) + .map(JsonNode::textValue) + .orElseGet(() -> { + log.warn("Could not parse error message from response: {}", errorPayload); + return String.format("Api replied with status code %s and payload %s", statusCode, errorPayload); + }); + throw new ApiException(errorMessage, errorPayload); } }) .additionalMessageConverters(new MappingJackson2HttpMessageConverter(objectMapper)) diff --git a/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Connector.java b/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Connector.java index 80bbfebf66..40b3a48e55 100644 --- a/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Connector.java +++ b/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Connector.java @@ -2,25 +2,32 @@ import co.airy.avro.communication.DeliveryState; import co.airy.avro.communication.Message; +import co.airy.avro.communication.Metadata; import co.airy.core.sources.twilio.dto.SendMessageRequest; import co.airy.core.sources.twilio.services.Api; +import co.airy.core.sources.twilio.services.ApiException; import co.airy.log.AiryLoggerFactory; +import co.airy.model.metadata.MetadataKeys; import co.airy.spring.auth.IgnoreAuthPattern; import co.airy.spring.web.filters.RequestLoggingIgnorePatterns; import co.airy.tracking.RouteTracking; -import com.twilio.exception.ApiException; +import org.apache.avro.specific.SpecificRecordBase; +import org.apache.kafka.streams.KeyValue; import org.slf4j.Logger; import org.springframework.context.annotation.Bean; import org.springframework.stereotype.Component; import java.time.Instant; import java.time.temporal.ChronoUnit; +import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.regex.Pattern; import static co.airy.model.message.MessageRepository.updateDeliveryState; +import static co.airy.model.metadata.MetadataRepository.getId; +import static co.airy.model.metadata.MetadataRepository.newMessageMetadata; @Component public class Connector { @@ -33,34 +40,44 @@ public class Connector { this.api = api; } - public Message sendMessage(SendMessageRequest sendMessageRequest) { + public List> sendMessage(SendMessageRequest sendMessageRequest) { final Message message = sendMessageRequest.getMessage(); final String from = sendMessageRequest.getChannel().getSourceChannelId(); final String to = sendMessageRequest.getSourceRecipientId(); if (isMessageStale(message)) { updateDeliveryState(message, DeliveryState.FAILED); - return message; + return List.of(KeyValue.pair(message.getId(), message)); } if (to == null) { // Tried to create a new conversation without providing source recipient id updateDeliveryState(message, DeliveryState.FAILED); - return message; + return List.of(KeyValue.pair(message.getId(), message)); } try { api.sendMessage(from, to, message.getContent()); updateDeliveryState(message, DeliveryState.DELIVERED); - return message; + return List.of(KeyValue.pair(message.getId(), message)); } catch (ApiException e) { - log.error(String.format("Twilio Api Exception for SendMessageRequest:\n%s", sendMessageRequest), e); + log.error(String.format("Failed to send a message to Facebook \n SendMessageRequest: %s \n Api Exception: %s \n", sendMessageRequest, e.getMessage()), e); + final ArrayList> results = new ArrayList<>(); + final Metadata error = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.ERROR, e.getMessage()); + results.add(KeyValue.pair(getId(error).toString(), error)); + + if (e.getErrorPayload() != null) { + final Metadata errorPayload = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.Source.ERROR, e.getErrorPayload()); + results.add(KeyValue.pair(getId(errorPayload).toString(), errorPayload)); + } + updateDeliveryState(message, DeliveryState.FAILED); + return results; } catch (Exception e) { - log.error(String.format("Failed to send a message to Twilio \n SendMessageRequest: %s", sendMessageRequest), e); + log.error(String.format("Failed to send a message to Facebook \n SendMessageRequest: %s", sendMessageRequest), e); + final Metadata metadata = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.ERROR, e.getMessage()); + updateDeliveryState(message, DeliveryState.FAILED); + return List.of(KeyValue.pair(message.getId(), message), KeyValue.pair(getId(metadata).toString(), metadata)); } - - updateDeliveryState(message, DeliveryState.FAILED); - return message; } private boolean isMessageStale(Message message) { diff --git a/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Stores.java b/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Stores.java index 6c62adcf28..b6f6ea1002 100644 --- a/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Stores.java +++ b/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/Stores.java @@ -15,7 +15,6 @@ import org.apache.kafka.clients.producer.KafkaProducer; import org.apache.kafka.clients.producer.ProducerRecord; import org.apache.kafka.streams.KafkaStreams; -import org.apache.kafka.streams.KeyValue; import org.apache.kafka.streams.StreamsBuilder; import org.apache.kafka.streams.kstream.KStream; import org.apache.kafka.streams.kstream.KTable; @@ -37,6 +36,7 @@ public class Stores implements ApplicationListener, Dispo private static final String applicationCommunicationChannels = new ApplicationCommunicationChannels().name(); private static final String applicationCommunicationMetadata = new ApplicationCommunicationMetadata().name(); + private static final String applicationCommunicationMessages = new ApplicationCommunicationMessages().name(); private static final String appId = "sources.twilio.ConnectorStores"; private final String channelsStore = "channels-store"; @@ -89,11 +89,17 @@ public void onApplicationEvent(ApplicationReadyEvent applicationReadyEvent) { }) .selectKey((conversationId, sendMessageRequest) -> sendMessageRequest.getChannelId()) .join(channelsTable, (sendMessageRequest, channel) -> sendMessageRequest.toBuilder().channel(channel).build()) - .map((channelId, sendMessageRequest) -> { - final Message message = connector.sendMessage(sendMessageRequest); - return KeyValue.pair(message.getId(), message); - }) - .to(new ApplicationCommunicationMessages().name()); + .flatMap((channelId, sendMessageRequest) -> connector.sendMessage(sendMessageRequest)) + .to((recordId, record, context) -> { + if (record instanceof Metadata) { + return applicationCommunicationMetadata; + } + if (record instanceof Message) { + return applicationCommunicationMessages; + } + + throw new IllegalStateException("Unknown type for record " + record); + }); streams.start(builder.build(), appId); } diff --git a/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/services/ApiException.java b/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/services/ApiException.java new file mode 100644 index 0000000000..21db62eb6d --- /dev/null +++ b/backend/sources/twilio/connector/src/main/java/co/airy/core/sources/twilio/services/ApiException.java @@ -0,0 +1,15 @@ +package co.airy.core.sources.twilio.services; + +import lombok.Getter; + +public class ApiException extends RuntimeException { + @Getter + private String errorPayload; + public ApiException(String message) { + super(message); + } + public ApiException(String message, String errorPayload) { + super(message); + this.errorPayload = errorPayload; + } +} diff --git a/backend/sources/twilio/connector/src/test/java/co/airy/core/sources/twilio/SendMessageTest.java b/backend/sources/twilio/connector/src/test/java/co/airy/core/sources/twilio/SendMessageTest.java index 1deece342e..a3e9a1cae0 100644 --- a/backend/sources/twilio/connector/src/test/java/co/airy/core/sources/twilio/SendMessageTest.java +++ b/backend/sources/twilio/connector/src/test/java/co/airy/core/sources/twilio/SendMessageTest.java @@ -2,12 +2,16 @@ import co.airy.avro.communication.DeliveryState; import co.airy.avro.communication.Message; +import co.airy.avro.communication.Metadata; import co.airy.core.sources.twilio.services.Api; +import co.airy.core.sources.twilio.services.ApiException; import co.airy.kafka.schema.Topic; import co.airy.kafka.schema.application.ApplicationCommunicationChannels; import co.airy.kafka.schema.application.ApplicationCommunicationMessages; +import co.airy.kafka.schema.application.ApplicationCommunicationMetadata; import co.airy.kafka.test.KafkaTestHelper; import co.airy.kafka.test.junit.SharedKafkaTestResource; +import co.airy.model.metadata.MetadataKeys; import co.airy.spring.core.AirySpringBootApplication; import co.airy.spring.test.WebTestHelper; import com.fasterxml.jackson.databind.JsonNode; @@ -32,11 +36,12 @@ import java.time.Instant; import java.util.List; import java.util.UUID; -import java.util.concurrent.TimeUnit; import static co.airy.test.Timing.retryOnException; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; import static org.junit.jupiter.api.Assertions.assertEquals; -import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; @SpringBootTest(classes = AirySpringBootApplication.class) @@ -51,6 +56,7 @@ class SendMessageTest { private static final Topic applicationCommunicationChannels = new ApplicationCommunicationChannels(); private static final Topic applicationCommunicationMessages = new ApplicationCommunicationMessages(); + private static final Topic applicationCommunicationMetadata = new ApplicationCommunicationMetadata(); @MockBean Api api; @@ -69,7 +75,8 @@ class SendMessageTest { static void beforeAll() throws Exception { kafkaTestHelper = new KafkaTestHelper(sharedKafkaTestResource, applicationCommunicationChannels, - applicationCommunicationMessages + applicationCommunicationMessages, + applicationCommunicationMetadata ); kafkaTestHelper.beforeAll(); @@ -93,12 +100,13 @@ void canSendMessages() throws Exception { final String sourceConversationId = "+491234567"; final String sourceChannelId = "+497654321"; final String payload = "{\"Body\":\"Hello World\"}"; + final String errorMessage = "message delivery failed"; ArgumentCaptor payloadCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor fromCaptor = ArgumentCaptor.forClass(String.class); ArgumentCaptor toCaptor = ArgumentCaptor.forClass(String.class); - doNothing().when(api).sendMessage(fromCaptor.capture(), toCaptor.capture(), payloadCaptor.capture()); + doThrow(new ApiException(errorMessage)).doNothing().when(api).sendMessage(fromCaptor.capture(), toCaptor.capture(), payloadCaptor.capture()); // Test that phone number input gets cleaned up final String channelPayload = "{\"phone_number\":\"+49 765 4321 \",\"name\":\"Blips and Chitz\"}"; @@ -123,10 +131,9 @@ void canSendMessages() throws Exception { .build()) )); - TimeUnit.SECONDS.sleep(5); - - kafkaTestHelper.produceRecord(new ProducerRecord<>(applicationCommunicationMessages.name(), messageId, - Message.newBuilder() + kafkaTestHelper.produceRecords(List.of( + // This message should fail + new ProducerRecord<>(applicationCommunicationMessages.name(), messageId, Message.newBuilder() .setId(messageId) .setSentAt(Instant.now().toEpochMilli()) .setSenderId("user-id") @@ -136,13 +143,32 @@ void canSendMessages() throws Exception { .setChannelId(channelId) .setSource("twilio.sms") .setContent(payload) - .build()) - ); + .build()), + new ProducerRecord<>(applicationCommunicationMessages.name(), messageId, + Message.newBuilder() + .setId(messageId) + .setSentAt(Instant.now().toEpochMilli()) + .setSenderId("user-id") + .setIsFromContact(false) + .setDeliveryState(DeliveryState.PENDING) + .setConversationId(conversationId) + .setChannelId(channelId) + .setSource("twilio.sms") + .setContent(payload) + .build()) + )); retryOnException(() -> { assertEquals(payload, payloadCaptor.getValue()); assertEquals(sourceConversationId, toCaptor.getValue()); assertEquals(sourceChannelId, fromCaptor.getValue()); }, "Twilio API was not called"); + + final List metadataList = kafkaTestHelper.consumeValues(2, applicationCommunicationMetadata.name()); + + assertThat(metadataList.size(), equalTo(2)); + assertThat(metadataList.stream().anyMatch((metadata) -> + metadata.getKey().equals(MetadataKeys.MessageKeys.ERROR) + && metadata.getValue().equals(errorMessage)), equalTo(true)); } } diff --git a/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/Connector.java b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/Connector.java index 3277c26bd7..ddadd5a1e4 100644 --- a/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/Connector.java +++ b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/Connector.java @@ -60,10 +60,10 @@ public List> sendMessage(SendMessageRequest return List.of(KeyValue.pair(message.getId(), message), KeyValue.pair(getId(metadata).toString(), metadata)); } catch (Exception e) { log.error(String.format("Failed to send a message to viber \n SendMessageRequest: %s", sendMessageRequest), e); + final Metadata metadata = newMessageMetadata(message.getId(), MetadataKeys.MessageKeys.ERROR, e.getMessage()); + updateDeliveryState(message, DeliveryState.FAILED); + return List.of(KeyValue.pair(message.getId(), message), KeyValue.pair(getId(metadata).toString(), metadata)); } - - updateDeliveryState(message, DeliveryState.FAILED); - return List.of(KeyValue.pair(message.getId(), message)); } private boolean isMessageStale(Message message) { diff --git a/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/EventsRouter.java b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/EventsRouter.java index 9207d7e762..76206a2c1a 100644 --- a/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/EventsRouter.java +++ b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/EventsRouter.java @@ -8,6 +8,7 @@ import com.viber.bot.Request; import com.viber.bot.event.incoming.IncomingConversationStartedEvent; import com.viber.bot.event.incoming.IncomingDeliveredEvent; +import com.viber.bot.event.incoming.IncomingErrorEvent; import com.viber.bot.event.incoming.IncomingMessageEvent; import com.viber.bot.event.incoming.IncomingSeenEvent; import com.viber.bot.profile.UserProfile; @@ -93,6 +94,13 @@ public List> onEvent(String key, String payload return List.of(KeyValue.pair(getId(metadata).toString(), metadata)); } + case ERROR: { + final IncomingErrorEvent event = (IncomingErrorEvent) request.getEvent(); + final String messageId = getMessageId(event.getToken()); + final Metadata metadata = newMessageMetadata(messageId, MetadataKeys.MessageKeys.ERROR, event.getDescription()); + return List.of(KeyValue.pair(getId(metadata).toString(), metadata)); + } + default: return List.of(); } } diff --git a/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/Api.java b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/Api.java index a0436b645e..39a63b0439 100644 --- a/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/Api.java +++ b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/Api.java @@ -4,6 +4,7 @@ import co.airy.core.sources.viber.dto.SendMessageResponse; import co.airy.log.AiryLoggerFactory; import com.fasterxml.jackson.core.JsonProcessingException; +import com.fasterxml.jackson.databind.JsonNode; import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.node.JsonNodeFactory; import com.fasterxml.jackson.databind.node.ObjectNode; @@ -11,27 +12,37 @@ import org.slf4j.Logger; import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.annotation.Value; +import org.springframework.boot.context.event.ApplicationReadyEvent; +import org.springframework.boot.web.client.RestTemplateBuilder; +import org.springframework.context.ApplicationListener; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpEntity; import org.springframework.http.HttpHeaders; +import org.springframework.http.HttpStatus; +import org.springframework.http.client.ClientHttpResponse; import org.springframework.lang.Nullable; import org.springframework.stereotype.Component; +import org.springframework.web.client.ResponseErrorHandler; import org.springframework.web.client.RestTemplate; +import java.io.IOException; import java.util.HashMap; import java.util.Map; +import java.util.Optional; @Component -public class Api { +public class Api implements ApplicationListener { private final Logger log = AiryLoggerFactory.getLogger(Api.class); private static final String API_URL = "https://chatapi.viber.com/pa"; - private final RestTemplate restTemplate = new RestTemplate(); + private RestTemplate restTemplate; + private final RestTemplateBuilder restTemplateBuilder; private final ObjectMapper objectMapper; private final HttpHeaders authHeaders; - public Api(@Value("${authToken}") String authToken, @Qualifier("viberObjectMapper") ObjectMapper objectMapper) { + public Api(RestTemplateBuilder restTemplateBuilder, @Value("${authToken}") String authToken, @Qualifier("viberObjectMapper") ObjectMapper objectMapper) { this.objectMapper = objectMapper; + this.restTemplateBuilder = restTemplateBuilder; authHeaders = new HttpHeaders(); authHeaders.set("X-Viber-Auth-Token", authToken); } @@ -81,4 +92,33 @@ public void setWebhook(String webhookUrl) throws Exception { public void removeWebhook() throws Exception { getApiResponse("/set_webhook", objectMapper.writeValueAsString(Map.of("url", ""))); } + + + @Override + public void onApplicationEvent(ApplicationReadyEvent event) { + restTemplate = restTemplateBuilder + .errorHandler(new ResponseErrorHandler() { + @Override + public boolean hasError(ClientHttpResponse response) throws IOException { + return response.getRawStatusCode() != HttpStatus.OK.value(); + } + + @Override + public void handleError(ClientHttpResponse response) throws IOException { + final String errorPayload = new String(response.getBody().readAllBytes()); + final int statusCode = response.getRawStatusCode(); + + final JsonNode jsonNode = objectMapper.readTree(errorPayload); + final String errorMessage = Optional.of(jsonNode.get("status_message")) + .map(JsonNode::textValue) + .orElseGet(() -> { + log.warn("Could not parse error message from response: {}", errorPayload); + return String.format("Api replied with status code %s and payload %s", statusCode, errorPayload); + }); + throw new ApiException(errorMessage, errorPayload); + } + }) + .build(); + } + } diff --git a/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/ApiException.java b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/ApiException.java new file mode 100644 index 0000000000..4737df81ec --- /dev/null +++ b/backend/sources/viber/connector/src/main/java/co/airy/core/sources/viber/services/ApiException.java @@ -0,0 +1,15 @@ +package co.airy.core.sources.viber.services; + +import lombok.Getter; + +public class ApiException extends RuntimeException { + @Getter + private String errorPayload; + public ApiException(String message) { + super(message); + } + public ApiException(String message, String errorPayload) { + super(message); + this.errorPayload = errorPayload; + } +} diff --git a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/ChannelsTest.java b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/ChannelsTest.java index 808d764ef5..cde64917bc 100644 --- a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/ChannelsTest.java +++ b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/ChannelsTest.java @@ -73,7 +73,6 @@ class ChannelsTest { @BeforeAll static void beforeAll() throws Exception { kafkaTestHelper = new KafkaTestHelper(sharedKafkaTestResource, Topics.getTopics()); - kafkaTestHelper.beforeAll(); } @@ -93,7 +92,7 @@ void canConnectChannels() throws Exception { ArgumentCaptor webhookCaptor = ArgumentCaptor.forClass(String.class); doNothing().when(api).setWebhook(webhookCaptor.capture()); doNothing().when(api).removeWebhook(); - Thread.sleep(5000); + final String content = webTestHelper.post("/channels.viber.connect") .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); final JsonNode jsonNode = new ObjectMapper().readTree(content); diff --git a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/EventsRouterTest.java b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/EventsRouterTest.java index 07ac8fa3b4..692843c5fa 100644 --- a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/EventsRouterTest.java +++ b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/EventsRouterTest.java @@ -5,6 +5,7 @@ import co.airy.core.sources.viber.dto.AccountInfo; import co.airy.core.sources.viber.lib.MockAccountInfo; import co.airy.core.sources.viber.lib.Topics; +import co.airy.core.sources.viber.services.Api; import co.airy.kafka.test.KafkaTestHelper; import co.airy.kafka.test.junit.SharedKafkaTestResource; import co.airy.model.metadata.MetadataRepository; @@ -18,6 +19,7 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.test.context.TestPropertySource; import org.springframework.test.context.junit.jupiter.SpringExtension; @@ -47,6 +49,9 @@ class EventsRouterTest { @Autowired private AccountInfo accountInfo; + @MockBean + private Api api; + @BeforeAll static void beforeAll() throws Exception { testHelper = new KafkaTestHelper(sharedKafkaTestResource, Topics.getTopics()); diff --git a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/SendMessageTest.java b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/SendMessageTest.java index 7ac5359cba..b3b16ad2c9 100644 --- a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/SendMessageTest.java +++ b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/SendMessageTest.java @@ -2,12 +2,15 @@ import co.airy.avro.communication.DeliveryState; import co.airy.avro.communication.Message; +import co.airy.avro.communication.Metadata; import co.airy.core.sources.viber.dto.SendMessageResponse; import co.airy.core.sources.viber.lib.MockAccountInfo; import co.airy.core.sources.viber.lib.Topics; import co.airy.core.sources.viber.services.Api; +import co.airy.core.sources.viber.services.ApiException; import co.airy.kafka.test.KafkaTestHelper; import co.airy.kafka.test.junit.SharedKafkaTestResource; +import co.airy.model.metadata.MetadataKeys; import co.airy.spring.core.AirySpringBootApplication; import org.apache.kafka.clients.producer.ProducerRecord; import org.junit.jupiter.api.AfterAll; @@ -30,6 +33,7 @@ import java.util.List; import java.util.concurrent.TimeUnit; +import static co.airy.model.metadata.MetadataRepository.getSubject; import static co.airy.test.Timing.retryOnException; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.core.IsEqual.equalTo; @@ -68,13 +72,16 @@ static void afterAll() throws Exception { void sendsMessage() throws Exception { final String conversationId = "conversationId"; final String messageId = "message-id"; + final String failingMessageId = "message-id-failing"; final Long messageToken = 123L; final String sourceConversationId = "9MVsH/2gRPr6pP72Eb6aXw=="; final String content = "{\"type\":\"text\",\"text\":\"Hello\"}"; + final String errorMessage = "failed to deliver message"; ArgumentCaptor receiverCaptor = ArgumentCaptor.forClass(String.class); when(api.sendMessage(receiverCaptor.capture(), Mockito.any(), eq(content))) - .thenReturn(new SendMessageResponse(0, "ok", messageToken)); + .thenReturn(new SendMessageResponse(0, "ok", messageToken)) + .thenThrow(new ApiException(errorMessage)); testHelper.produceRecords(List.of( new ProducerRecord<>(Topics.applicationCommunicationMessages.name(), "other-message-id", @@ -107,8 +114,31 @@ void sendsMessage() throws Exception { .build()) ); + // This message should fail + testHelper.produceRecord(new ProducerRecord<>(Topics.applicationCommunicationMessages.name(), messageId, + Message.newBuilder() + .setId(failingMessageId) + .setSentAt(Instant.now().toEpochMilli()) + .setSenderId("user-id") + .setDeliveryState(DeliveryState.PENDING) + .setConversationId(conversationId) + .setChannelId("channelId") + .setSource("viber") + .setContent(content) + .setIsFromContact(false) + .build()) + ); + retryOnException(() -> { assertThat(receiverCaptor.getValue(), equalTo(sourceConversationId)); }, "Viber API was not called"); + + final List metadataList = testHelper.consumeValues(2, Topics.applicationCommunicationMetadata.name()); + + assertThat(metadataList.size(), equalTo(2)); + assertThat(metadataList.stream().anyMatch((metadata) -> + metadata.getKey().equals(MetadataKeys.MessageKeys.ERROR) + && metadata.getValue().equals(errorMessage) + && getSubject(metadata).getIdentifier().equals(failingMessageId)), equalTo(true)); } } diff --git a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/WebhookControllerTest.java b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/WebhookControllerTest.java index ce4dbc2fd7..83a22c0914 100644 --- a/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/WebhookControllerTest.java +++ b/backend/sources/viber/connector/src/test/java/co/airy/core/sources/viber/WebhookControllerTest.java @@ -3,6 +3,7 @@ import co.airy.core.sources.viber.dto.AccountInfo; import co.airy.core.sources.viber.lib.MockAccountInfo; import co.airy.core.sources.viber.lib.Topics; +import co.airy.core.sources.viber.services.Api; import co.airy.kafka.test.KafkaTestHelper; import co.airy.kafka.test.junit.SharedKafkaTestResource; import co.airy.spring.core.AirySpringBootApplication; @@ -15,6 +16,7 @@ import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; import org.springframework.context.annotation.Import; import org.springframework.http.MediaType; import org.springframework.test.context.TestPropertySource; @@ -48,6 +50,9 @@ class WebhookControllerTest { @Autowired private AccountInfo accountInfo; + @MockBean + private Api api; + @Value("${authToken}") private String authToken; diff --git a/docs/docs/api/endpoints/google-messages-send.mdx b/docs/docs/api/endpoints/google-messages-send.mdx deleted file mode 100644 index 1ddfa30ca7..0000000000 --- a/docs/docs/api/endpoints/google-messages-send.mdx +++ /dev/null @@ -1,46 +0,0 @@ -`POST /messages.send` - -Sends a message to a conversation from Google's Business Messages source and returns a payload. - -Note that when you send a message from this source, you must specify a representative, the individual or automation that composed the message. -Google's Business Messages supports "BOT" and "HUMAN" as the `representativeType`. Find more information on [Google's Business Messages guide](https://developers.google.com/business-communications/business-messages/guides/build/send). - -Whatever is put on the `message` field will be forwarded "as-is" to the source's message endpoint. - -**Sending a text message** - -```json5 -{ - conversation_id: 'a688d36c-a85e-44af-bc02-4248c2c97622', - message: { - text: 'Hello!', - representative: { - representativeType: 'HUMAN', - }, - }, -} -``` - -**Sample response** - -```json5 -{ - "id": '{UUID}', - "content": { - "text": 'Hello!', - "representative": { - "representativeType": 'HUMAN', - }, - }, - "delivery_state": 'pending|failed|delivered', - "from_contact": 'true|false', - // See glossary - "sent_at": '{string}', - //'yyyy-MM-dd'T'HH:mm:ss.SSSZ' date in UTC form, to be localized by clients - "source": 'google', - "metadata": { - "sentFrom": 'iPhone', - }, - // metadata object of the message -} -``` diff --git a/docs/docs/api/endpoints/messages.md b/docs/docs/api/endpoints/messages.md index 4df7925b72..21bf373a87 100644 --- a/docs/docs/api/endpoints/messages.md +++ b/docs/docs/api/endpoints/messages.md @@ -93,7 +93,7 @@ to see learn how to send text, media, and many more message types. } ``` -**Starting a conversation** +### Starting a conversation The previous flow covers the use cases of most messaging sources. However, some sources such as SMS or Whatsapp also allow you to send messages to contacts that did not previously message you first. This means that you can create new conversations with them if you know their `source recipient id`. @@ -116,7 +116,7 @@ allow you to send messages to contacts that did not previously message you first { "id": "{UUID}", "content": "{\"text\":\"Hello world\"}", // Source specific body - "state": "pending|failed|delivered", + "state": "pending", "from_contact": true, "sent_at": "{string}", "source": "{String}", @@ -124,11 +124,50 @@ allow you to send messages to contacts that did not previously message you first } ``` -## Send from Google's Business Messages source +### Error handling + +Since outbound messages are delegated to the source apps we don't implement synchronous error replies. Instead, errors are sent +asynchronously as updates to the message's metadata. Those updates can be consumed with either the [webhook](/api/webhook) or the [websocket](/api/websocket). + +The message's state will also change to `failed`. Both changes will be visible in the conversation and messages query endpoints. -import GoogleMessagesSend from './google-messages-send.mdx' +**Sample metadata websocket update** + +```json5 +{ + "type": "metadata.updated", + "payload": { + "subject": "message", + "identifier": "failed message id", + "metadata": { + "error": "Some error message" + } + } +} +``` - +**Sample message webhook update** + +```json5 +{ + "type": "message.updated", + "payload": { + "conversation_id": "conversation id", + "channel_id": "channel id", + "message": { + "id": "failed message id", + "content": {"text": "Hello World"}, // source message payload + "delivery_state": "failed", + "from_contact": false, + "sent_at": "2020-10-25T21:24:54.560Z", // ISO 8601 date string + "source": "facebook", // messaging source + "metadata": { + "error": "Some error message" + } + } + } +} +``` ## Suggest replies diff --git a/docs/docs/sources/google.md b/docs/docs/sources/google.md index 5b061dc048..84d1812424 100644 --- a/docs/docs/sources/google.md +++ b/docs/docs/sources/google.md @@ -116,6 +116,45 @@ import ConnectGoogle from '../api/endpoints/connect-google.mdx' After connecting the source to your instance, you will be able to send messages through the [Messages endpoint](/api/endpoints/messages#send). -import GoogleMessagesSend from '../api/endpoints/google-messages-send.mdx' +Note that when you send a message from this source, you must specify a representative, the individual or automation that composed the message. +Google's Business Messages supports "BOT" and "HUMAN" as the `representativeType`. Find more information on [Google's Business Messages guide](https://developers.google.com/business-communications/business-messages/guides/build/send). + +Whatever is put on the `message` field will be forwarded "as-is" to the source's message endpoint. + +**Sending a text message** + +```json5 +{ + conversation_id: "a688d36c-a85e-44af-bc02-4248c2c97622", + message: { + text: "Hello!", + representative: { + representativeType: "HUMAN" + } + } +} +``` - +**Sample response** + +```json5 +{ + "id": "{UUID}", + "content": { + "text": "Hello!", + "representative": { + "representativeType": "HUMAN" + } + }, + "delivery_state": "pending|failed|delivered", + "from_contact": "true|false", + // See glossary + "sent_at": "{string}", + //'yyyy-MM-dd'T'HH:mm:ss.SSSZ' date in UTC form, to be localized by clients + "source": "google", + "metadata": { + "sentFrom": "iPhone" + } + // metadata object of the message +} +``` From 75fb5f3d7b0258348bab4c15a2c125d84245a57f Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Thu, 16 Dec 2021 17:10:04 +0100 Subject: [PATCH 18/24] Bump @babel/plugin-proposal-class-properties from 7.14.5 to 7.16.5 (#2656) Bumps [@babel/plugin-proposal-class-properties](https://github.com/babel/babel/tree/HEAD/packages/babel-plugin-proposal-class-properties) from 7.14.5 to 7.16.5. - [Release notes](https://github.com/babel/babel/releases) - [Changelog](https://github.com/babel/babel/blob/main/CHANGELOG.md) - [Commits](https://github.com/babel/babel/commits/v7.16.5/packages/babel-plugin-proposal-class-properties) --- updated-dependencies: - dependency-name: "@babel/plugin-proposal-class-properties" dependency-type: direct:development update-type: version-update:semver-minor ... Signed-off-by: dependabot[bot] Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com> --- package.json | 2 +- yarn.lock | 100 ++++++++++++++++++++++++++++++++++++--------------- 2 files changed, 73 insertions(+), 29 deletions(-) diff --git a/package.json b/package.json index 1946087e8a..2e3e2d6a84 100644 --- a/package.json +++ b/package.json @@ -37,7 +37,7 @@ }, "devDependencies": { "@babel/core": "7.16.0", - "@babel/plugin-proposal-class-properties": "^7.14.5", + "@babel/plugin-proposal-class-properties": "^7.16.5", "@babel/plugin-proposal-object-rest-spread": "^7.14.5", "@babel/plugin-transform-spread": "^7.16.0", "@babel/preset-env": "^7.15.8", diff --git a/yarn.lock b/yarn.lock index 80be088efa..cce60fa8b8 100644 --- a/yarn.lock +++ b/yarn.lock @@ -56,6 +56,15 @@ jsesc "^2.5.1" source-map "^0.5.0" +"@babel/generator@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/generator/-/generator-7.16.5.tgz#26e1192eb8f78e0a3acaf3eede3c6fc96d22bedf" + integrity sha512-kIvCdjZqcdKqoDbVVdt5R99icaRtrtYhYK/xux5qiWCBmfdvEYMFZ68QCrpE5cbFM1JsuArUNs1ZkuKtTtUcZA== + dependencies: + "@babel/types" "^7.16.0" + jsesc "^2.5.1" + source-map "^0.5.0" + "@babel/helper-annotate-as-pure@^7.14.5", "@babel/helper-annotate-as-pure@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.15.4.tgz" @@ -88,28 +97,17 @@ browserslist "^4.17.5" semver "^6.3.0" -"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4": - version "7.15.4" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.15.4.tgz" - integrity sha512-7ZmzFi+DwJx6A7mHRwbuucEYpyBwmh2Ca0RvI6z2+WLZYCqV0JOaLb+u0zbtmDicebgKBZgqbYfLaKNqSgv5Pw== - dependencies: - "@babel/helper-annotate-as-pure" "^7.15.4" - "@babel/helper-function-name" "^7.15.4" - "@babel/helper-member-expression-to-functions" "^7.15.4" - "@babel/helper-optimise-call-expression" "^7.15.4" - "@babel/helper-replace-supers" "^7.15.4" - "@babel/helper-split-export-declaration" "^7.15.4" - -"@babel/helper-create-class-features-plugin@^7.16.0": - version "7.16.0" - resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.0.tgz#090d4d166b342a03a9fec37ef4fd5aeb9c7c6a4b" - integrity sha512-XLwWvqEaq19zFlF5PTgOod4bUA+XbkR4WLQBct1bkzmxJGB0ZEJaoKF4c8cgH9oBtCDuYJ8BP5NB9uFiEgO5QA== +"@babel/helper-create-class-features-plugin@^7.14.5", "@babel/helper-create-class-features-plugin@^7.15.4", "@babel/helper-create-class-features-plugin@^7.16.0", "@babel/helper-create-class-features-plugin@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.16.5.tgz#5d1bcd096792c1ebec6249eebc6358eec55d0cad" + integrity sha512-NEohnYA7mkB8L5JhU7BLwcBdU3j83IziR9aseMueWGeAjblbul3zzb8UvJ3a1zuBiqCMObzCJHFqKIQE6hTVmg== dependencies: "@babel/helper-annotate-as-pure" "^7.16.0" + "@babel/helper-environment-visitor" "^7.16.5" "@babel/helper-function-name" "^7.16.0" - "@babel/helper-member-expression-to-functions" "^7.16.0" + "@babel/helper-member-expression-to-functions" "^7.16.5" "@babel/helper-optimise-call-expression" "^7.16.0" - "@babel/helper-replace-supers" "^7.16.0" + "@babel/helper-replace-supers" "^7.16.5" "@babel/helper-split-export-declaration" "^7.16.0" "@babel/helper-create-regexp-features-plugin@^7.14.5": @@ -134,6 +132,13 @@ resolve "^1.14.2" semver "^6.1.2" +"@babel/helper-environment-visitor@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-environment-visitor/-/helper-environment-visitor-7.16.5.tgz#f6a7f38b3c6d8b07c88faea083c46c09ef5451b8" + integrity sha512-ODQyc5AnxmZWm/R2W7fzhamOk1ey8gSguo5SGvF0zcB3uUzRpTRmM/jmLSm9bDMyPlvbyJ+PwPEK0BWIoZ9wjg== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-explode-assignable-expression@^7.14.5": version "7.14.5" resolved "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.14.5.tgz" @@ -201,6 +206,13 @@ dependencies: "@babel/types" "^7.16.0" +"@babel/helper-member-expression-to-functions@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.16.5.tgz#1bc9f7e87354e86f8879c67b316cb03d3dc2caab" + integrity sha512-7fecSXq7ZrLE+TWshbGT+HyCLkxloWNhTbU2QM1NTI/tDqyf0oZiMcEfYtDuUDCo528EOlt39G1rftea4bRZIw== + dependencies: + "@babel/types" "^7.16.0" + "@babel/helper-module-imports@^7.12.13", "@babel/helper-module-imports@^7.14.5": version "7.15.4" resolved "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.15.4.tgz" @@ -243,10 +255,10 @@ dependencies: "@babel/types" "^7.16.0" -"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.14.5.tgz" - integrity sha512-/37qQCE3K0vvZKwoK4XU/irIJQdIfCJuhU5eKnNxpFDsOkgFaUAwbv+RYw6eYgsC0E4hS7r5KqGULUogqui0fQ== +"@babel/helper-plugin-utils@^7.0.0", "@babel/helper-plugin-utils@^7.10.4", "@babel/helper-plugin-utils@^7.12.13", "@babel/helper-plugin-utils@^7.13.0", "@babel/helper-plugin-utils@^7.14.5", "@babel/helper-plugin-utils@^7.16.5", "@babel/helper-plugin-utils@^7.8.0", "@babel/helper-plugin-utils@^7.8.3": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.16.5.tgz#afe37a45f39fce44a3d50a7958129ea5b1a5c074" + integrity sha512-59KHWHXxVA9K4HNF4sbHCf+eJeFe0Te/ZFGqBT4OjXhrwvA04sGfaEGsVTdsjoszq0YTP49RC9UKe5g8uN2RwQ== "@babel/helper-remap-async-to-generator@^7.14.5", "@babel/helper-remap-async-to-generator@^7.15.4": version "7.15.4" @@ -277,6 +289,17 @@ "@babel/traverse" "^7.16.0" "@babel/types" "^7.16.0" +"@babel/helper-replace-supers@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.16.5.tgz#96d3988bd0ab0a2d22c88c6198c3d3234ca25326" + integrity sha512-ao3seGVa/FZCMCCNDuBcqnBFSbdr8N2EW35mzojx3TwfIbdPmNK+JV6+2d5bR0Z71W5ocLnQp9en/cTF7pBJiQ== + dependencies: + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-member-expression-to-functions" "^7.16.5" + "@babel/helper-optimise-call-expression" "^7.16.0" + "@babel/traverse" "^7.16.5" + "@babel/types" "^7.16.0" + "@babel/helper-simple-access@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.15.4.tgz" @@ -364,6 +387,11 @@ resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.4.tgz#d5f92f57cf2c74ffe9b37981c0e72fee7311372e" integrity sha512-6V0qdPUaiVHH3RtZeLIsc+6pDhbYzHR8ogA8w+f+Wc77DuXto19g2QUwveINoS34Uw+W8/hQDGJCx+i4n7xcng== +"@babel/parser@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/parser/-/parser-7.16.5.tgz#beb3af702e54d24796341ab9420fb329131ad658" + integrity sha512-+Ce7T5iPNWzfu9C1aB5tN3Lyafs5xb3Ic7vBWyZL2KXT3QSdD1dD3CvgOzPmQKoNNRt6uauc0XwNJTQtXC2/Mw== + "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining@^7.15.4": version "7.15.4" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining/-/plugin-bugfix-v8-spread-parameters-in-optional-chaining-7.15.4.tgz" @@ -382,13 +410,13 @@ "@babel/helper-remap-async-to-generator" "^7.15.4" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-proposal-class-properties@^7.14.5": - version "7.14.5" - resolved "https://registry.npmjs.org/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.14.5.tgz" - integrity sha512-q/PLpv5Ko4dVc1LYMpCY7RVAAO4uk55qPwrIuJ5QJ8c6cVuAmhu7I/49JOppXL6gXf7ZHzpRVEUZdYoPLM04Gg== +"@babel/plugin-proposal-class-properties@^7.14.5", "@babel/plugin-proposal-class-properties@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.16.5.tgz#3269f44b89122110f6339806e05d43d84106468a" + integrity sha512-pJD3HjgRv83s5dv1sTnDbZOaTjghKEz8KUn1Kbh2eAIRhGuyQ1XSeI4xVXU3UlIEVA3DAyIdxqT1eRn7Wcn55A== dependencies: - "@babel/helper-create-class-features-plugin" "^7.14.5" - "@babel/helper-plugin-utils" "^7.14.5" + "@babel/helper-create-class-features-plugin" "^7.16.5" + "@babel/helper-plugin-utils" "^7.16.5" "@babel/plugin-proposal-class-static-block@^7.15.4": version "7.15.4" @@ -1052,6 +1080,22 @@ debug "^4.1.0" globals "^11.1.0" +"@babel/traverse@^7.16.5": + version "7.16.5" + resolved "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.16.5.tgz#d7d400a8229c714a59b87624fc67b0f1fbd4b2b3" + integrity sha512-FOCODAzqUMROikDYLYxl4nmwiLlu85rNqBML/A5hKRVXG2LV8d0iMqgPzdYTcIpjZEBB7D6UDU9vxRZiriASdQ== + dependencies: + "@babel/code-frame" "^7.16.0" + "@babel/generator" "^7.16.5" + "@babel/helper-environment-visitor" "^7.16.5" + "@babel/helper-function-name" "^7.16.0" + "@babel/helper-hoist-variables" "^7.16.0" + "@babel/helper-split-export-declaration" "^7.16.0" + "@babel/parser" "^7.16.5" + "@babel/types" "^7.16.0" + debug "^4.1.0" + globals "^11.1.0" + "@babel/types@^7.12.6", "@babel/types@^7.14.5", "@babel/types@^7.15.4", "@babel/types@^7.15.6", "@babel/types@^7.16.0", "@babel/types@^7.4.4": version "7.16.0" resolved "https://registry.yarnpkg.com/@babel/types/-/types-7.16.0.tgz#db3b313804f96aadd0b776c4823e127ad67289ba" From 8febe37c515d77ac2d663dc5a3e4e001ac029c7c Mon Sep 17 00:00:00 2001 From: Juan Sebastian Pena Rodriguez Date: Fri, 17 Dec 2021 10:15:27 +0100 Subject: [PATCH 19/24] [#2622] api expose facebook page tokens via channels api (#2658) --- backend/sources/facebook/connector/BUILD | 1 + .../sources/facebook/ChannelsController.java | 10 +- .../api/model/FaceBookMetadataKeys.java | 10 + .../facebook/ChannelsControllerTest.java | 256 ++++++++++++++++++ .../sources/facebook/FetchMetadataTest.java | 9 +- .../facebook/WebhookControllerTest.java | 10 + .../co/airy/spring/test/WebTestHelper.java | 5 +- .../airy/spring/test/WebTestHelperConfig.java | 17 ++ 8 files changed, 311 insertions(+), 7 deletions(-) create mode 100644 backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/model/FaceBookMetadataKeys.java create mode 100644 backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/ChannelsControllerTest.java create mode 100644 lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelperConfig.java diff --git a/backend/sources/facebook/connector/BUILD b/backend/sources/facebook/connector/BUILD index 98eaab38c2..081f5e65ca 100644 --- a/backend/sources/facebook/connector/BUILD +++ b/backend/sources/facebook/connector/BUILD @@ -35,6 +35,7 @@ springboot( ":app", "//backend:base_test", "//lib/java/kafka/test:kafka-test", + "//lib/java/spring/test:spring-test", ] + app_deps, ) for file in glob(["src/test/java/**/*Test.java"]) diff --git a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/ChannelsController.java b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/ChannelsController.java index 2ea23ea60a..3a2941326d 100644 --- a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/ChannelsController.java +++ b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/ChannelsController.java @@ -5,6 +5,7 @@ import co.airy.avro.communication.Metadata; import co.airy.core.sources.facebook.api.Api; import co.airy.core.sources.facebook.api.ApiException; +import co.airy.core.sources.facebook.api.model.FaceBookMetadataKeys; import co.airy.core.sources.facebook.api.model.PageWithConnectInfo; import co.airy.core.sources.facebook.payload.ConnectInstagramRequestPayload; import co.airy.core.sources.facebook.payload.ConnectPageRequestPayload; @@ -104,7 +105,9 @@ ResponseEntity connectFacebook(@RequestBody @Valid ConnectPageRequestPayload ) .metadataMap(MetadataMap.from(List.of( newChannelMetadata(channelId, MetadataKeys.ChannelKeys.NAME, Optional.ofNullable(payload.getName()).orElse(pageWithConnectInfo.getNameWithLocationDescriptor())), - newChannelMetadata(channelId, MetadataKeys.ChannelKeys.IMAGE_URL, Optional.ofNullable(payload.getImageUrl()).orElse(pageWithConnectInfo.getPicture().getData().getUrl())) + newChannelMetadata(channelId, MetadataKeys.ChannelKeys.IMAGE_URL, Optional.ofNullable(payload.getImageUrl()).orElse(pageWithConnectInfo.getPicture().getData().getUrl())), + newChannelMetadata(channelId, FaceBookMetadataKeys.ChannelKeys.PAGE_ID, payload.getPageId()), + newChannelMetadata(channelId, FaceBookMetadataKeys.ChannelKeys.PAGE_TOKEN, payload.getPageToken()) ))).build(); stores.storeChannelContainer(container); @@ -132,7 +135,10 @@ ResponseEntity connectInstagram(@RequestBody @Valid ConnectInstagramRequestPa api.connectPageToApp(pageWithConnectInfo.getAccessToken()); final MetadataMap metadataMap = MetadataMap.from(List.of( - newChannelMetadata(channelId, MetadataKeys.ChannelKeys.NAME, Optional.ofNullable(payload.getName()).orElse(String.format("%s Instagram account", pageWithConnectInfo.getNameWithLocationDescriptor()))) + newChannelMetadata(channelId, MetadataKeys.ChannelKeys.NAME, Optional.ofNullable(payload.getName()).orElse(String.format("%s Instagram account", pageWithConnectInfo.getNameWithLocationDescriptor()))), + newChannelMetadata(channelId, FaceBookMetadataKeys.ChannelKeys.PAGE_ID, payload.getPageId()), + newChannelMetadata(channelId, FaceBookMetadataKeys.ChannelKeys.PAGE_TOKEN, payload.getPageToken()), + newChannelMetadata(channelId, FaceBookMetadataKeys.ChannelKeys.ACCOUNT_ID, payload.getAccountId()) )); Optional.ofNullable(payload.getImageUrl()) diff --git a/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/model/FaceBookMetadataKeys.java b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/model/FaceBookMetadataKeys.java new file mode 100644 index 0000000000..e3f18ee6a9 --- /dev/null +++ b/backend/sources/facebook/connector/src/main/java/co/airy/core/sources/facebook/api/model/FaceBookMetadataKeys.java @@ -0,0 +1,10 @@ +package co.airy.core.sources.facebook.api.model; + + +public class FaceBookMetadataKeys { + public static class ChannelKeys { + public static final String PAGE_ID = "page_id"; + public static final String PAGE_TOKEN = "page_token"; + public static final String ACCOUNT_ID = "account_id"; + } +} diff --git a/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/ChannelsControllerTest.java b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/ChannelsControllerTest.java new file mode 100644 index 0000000000..b36c2a3173 --- /dev/null +++ b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/ChannelsControllerTest.java @@ -0,0 +1,256 @@ +package co.airy.core.sources.facebook; + +import co.airy.avro.communication.Channel; +import co.airy.avro.communication.ChannelConnectionState; +import co.airy.avro.communication.Metadata; +import co.airy.core.sources.facebook.api.Api; +import co.airy.core.sources.facebook.api.model.FaceBookMetadataKeys; +import co.airy.core.sources.facebook.api.model.PageWithConnectInfo; +import co.airy.core.sources.facebook.payload.ConnectInstagramRequestPayload; +import co.airy.core.sources.facebook.payload.ConnectPageRequestPayload; +import co.airy.core.sources.facebook.payload.ExploreRequestPayload; +import co.airy.kafka.schema.Topic; +import co.airy.kafka.schema.application.ApplicationCommunicationChannels; +import co.airy.kafka.schema.application.ApplicationCommunicationMessages; +import co.airy.kafka.schema.application.ApplicationCommunicationMetadata; +import co.airy.kafka.test.KafkaTestHelper; +import co.airy.kafka.test.junit.SharedKafkaTestResource; +import co.airy.model.metadata.MetadataKeys; +import co.airy.spring.core.AirySpringBootApplication; +import co.airy.spring.test.WebTestHelper; +import com.fasterxml.jackson.databind.ObjectMapper; +import org.junit.jupiter.api.AfterAll; +import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.junit.jupiter.api.extension.RegisterExtension; +import org.mockito.InjectMocks; +import org.mockito.MockitoAnnotations; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.boot.test.mock.mockito.MockBean; +import org.springframework.test.context.TestPropertySource; +import org.springframework.test.context.junit.jupiter.SpringExtension; + +import java.util.Arrays; +import java.util.List; +import java.util.UUID; + +import static co.airy.test.Timing.retryOnException; +import static org.apache.kafka.streams.KafkaStreams.State.RUNNING; +import static org.hamcrest.MatcherAssert.assertThat; +import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; + +@SpringBootTest(classes = AirySpringBootApplication.class) +@TestPropertySource(value = "classpath:test.properties") +@AutoConfigureMockMvc +@ExtendWith(SpringExtension.class) +class ChannelsControllerTest { + + @Autowired + private ObjectMapper objectMapper; + + @Autowired + private WebTestHelper webTestHelper; + + @RegisterExtension + public static final SharedKafkaTestResource sharedKafkaTestResource = new SharedKafkaTestResource(); + private static KafkaTestHelper kafkaTestHelper; + + private static final Topic applicationCommunicationChannels = new ApplicationCommunicationChannels(); + private static final Topic applicationCommunicationMessages = new ApplicationCommunicationMessages(); + private static final Topic applicationCommunicationMetadata = new ApplicationCommunicationMetadata(); + + @MockBean + private Api api; + + @Autowired + @InjectMocks + private Connector worker; + + @Autowired + private Stores stores; + + @BeforeAll + static void beforeAll() throws Exception { + kafkaTestHelper = new KafkaTestHelper(sharedKafkaTestResource, + applicationCommunicationChannels, + applicationCommunicationMessages, + applicationCommunicationMetadata + ); + + kafkaTestHelper.beforeAll(); + } + + @AfterAll + static void afterAll() throws Exception { + kafkaTestHelper.afterAll(); + } + + @BeforeEach + void beforeEach() throws Exception { + MockitoAnnotations.openMocks(this); + retryOnException(() -> assertEquals(stores.getStreamState(), RUNNING), "Failed to reach RUNNING state."); + } + + @Test + void canConnect() throws Exception { + canFacebookConnect(); + canInstagramConnect(); + } + + private void canFacebookConnect() throws Exception { + // Connect to facebook channel + final ConnectPageRequestPayload connectPayload = this.mockConnectPageRequestPayload(); + final PageWithConnectInfo pageWithConnectInfo = this.mockPageWithConnectInfo(); + + doReturn("new-long-live-token-string").when(api).exchangeToLongLivingUserAccessToken(connectPayload.getPageToken()); + doReturn(pageWithConnectInfo).when(api).getPageForUser(connectPayload.getPageId(), "new-long-live-token-string"); + doNothing().when(api).connectPageToApp(pageWithConnectInfo.getAccessToken()); + + + String content = webTestHelper.post( + "/channels.facebook.connect", + objectMapper.writeValueAsString(connectPayload)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + final String channelId = new ObjectMapper().readTree(content).get("id").textValue(); + + List channels = kafkaTestHelper.consumeValues(1, applicationCommunicationChannels.name()); + final Channel channel = channels.get(0); + + assertThat("facebook", equalTo(channel.getSource())); + assertThat(pageWithConnectInfo.getId(), equalTo(channel.getSourceChannelId())); + assertThat(ChannelConnectionState.CONNECTED, equalTo(channel.getConnectionState())); + + final List metadataList = kafkaTestHelper.consumeValues(4, applicationCommunicationMetadata.name()); + metadataList.stream().forEach((metadata) -> { + final String key = metadata.getKey(); + switch (key) { + case MetadataKeys.ChannelKeys.NAME: + assertThat(pageWithConnectInfo.getNameWithLocationDescriptor(), equalTo(metadata.getValue())); + break; + case MetadataKeys.ChannelKeys.IMAGE_URL: + assertThat(pageWithConnectInfo.getPicture().getData().getUrl(), equalTo(metadata.getValue())); + break; + case FaceBookMetadataKeys.ChannelKeys.PAGE_ID: + assertThat(connectPayload.getPageId(), equalTo(metadata.getValue())); + break; + case FaceBookMetadataKeys.ChannelKeys.PAGE_TOKEN: + assertThat(connectPayload.getPageToken(), equalTo(metadata.getValue())); + break; + default: + assertThat(String.format("unexpected key: %s", key), false); + } + }); + + // Explore facebook connected channels + final ExploreRequestPayload explorePayload = new ExploreRequestPayload("explore-token-string"); + + doReturn(Arrays.asList(pageWithConnectInfo)).when(api).getPagesInfo(explorePayload.getAuthToken()); + content = webTestHelper.post( + "/channels.facebook.explore", + objectMapper.writeValueAsString(explorePayload)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + + assertThat(content, equalTo("{\"data\":[{\"page_id\":\"7562107744668308\",\"name\":\"facebook app\",\"image_url\":\"facebook app image\",\"connected\":true}]}")); + + + // Disconnect from facebook channel + webTestHelper.post( + "/channels.facebook.disconnect", + String.format("{\"channel_id\":\"%s\"}", channelId)) + .andExpect(status().isNoContent()); + + channels = kafkaTestHelper.consumeValues(1, applicationCommunicationChannels.name()); + assertThat(ChannelConnectionState.DISCONNECTED, equalTo(channels.get(0).getConnectionState())); + } + + private void canInstagramConnect() throws Exception { + // Connect to instagram channel + final ConnectInstagramRequestPayload connectPayload = this.mockConnectInstagramRequestPayload(); + final PageWithConnectInfo pageWithConnectInfo = this.mockPageWithConnectInfo(); + + doReturn("new-long-live-token-string").when(api).exchangeToLongLivingUserAccessToken(connectPayload.getPageToken()); + doReturn(pageWithConnectInfo).when(api).getPageForUser(connectPayload.getPageId(), "new-long-live-token-string"); + doNothing().when(api).connectPageToApp(pageWithConnectInfo.getAccessToken()); + + + final String content = webTestHelper.post( + "/channels.instagram.connect", + objectMapper.writeValueAsString(connectPayload)) + .andExpect(status().isOk()).andReturn().getResponse().getContentAsString(); + final String channelId = new ObjectMapper().readTree(content).get("id").textValue(); + + List channels = kafkaTestHelper.consumeValues(1, applicationCommunicationChannels.name()); + final Channel channel = channels.get(0); + + assertThat("instagram", equalTo(channel.getSource())); + assertThat(connectPayload.getAccountId(), equalTo(channel.getSourceChannelId())); + assertThat(ChannelConnectionState.CONNECTED, equalTo(channel.getConnectionState())); + + final List metadataList = kafkaTestHelper.consumeValues(5, applicationCommunicationMetadata.name()); + metadataList.stream().forEach((metadata) -> { + final String key = metadata.getKey(); + switch (key) { + case MetadataKeys.ChannelKeys.NAME: + assertThat(pageWithConnectInfo.getNameWithLocationDescriptor(), equalTo(metadata.getValue())); + break; + case FaceBookMetadataKeys.ChannelKeys.ACCOUNT_ID: + assertThat(connectPayload.getAccountId(), equalTo(metadata.getValue())); + break; + case FaceBookMetadataKeys.ChannelKeys.PAGE_ID: + assertThat(connectPayload.getPageId(), equalTo(metadata.getValue())); + break; + case FaceBookMetadataKeys.ChannelKeys.PAGE_TOKEN: + assertThat(connectPayload.getPageToken(), equalTo(metadata.getValue())); + break; + case MetadataKeys.ChannelKeys.IMAGE_URL: + assertThat(connectPayload.getImageUrl(), equalTo(metadata.getValue())); + break; + default: + assertThat(String.format("unexpected key: %s", key), false); + } + }); + + // Disconnect from instagram channel + webTestHelper.post( + "/channels.instagram.disconnect", + String.format("{\"channel_id\":\"%s\"}", channelId)) + .andExpect(status().isNoContent()); + + channels = kafkaTestHelper.consumeValues(1, applicationCommunicationChannels.name()); + assertThat(ChannelConnectionState.DISCONNECTED, equalTo(channels.get(0).getConnectionState())); + } + + private ConnectPageRequestPayload mockConnectPageRequestPayload() { + return new ConnectPageRequestPayload( + "7562107744668308", + "token-string", + "facebook app", + "facebook app image"); + } + + private PageWithConnectInfo mockPageWithConnectInfo() { + return new PageWithConnectInfo( + "7562107744668308", + "facebook app", + "some-access-token", + new PageWithConnectInfo.PagePic(new PageWithConnectInfo.PagePic.PicData("facebook app image")), + true); + } + + private ConnectInstagramRequestPayload mockConnectInstagramRequestPayload() { + return new ConnectInstagramRequestPayload( + "7562107744668308", + "1847583685763736", + "some-access-token", + "facebook app", + "instagram-image-url"); + } +} diff --git a/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/FetchMetadataTest.java b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/FetchMetadataTest.java index b39da7f3e2..77f40ef6d3 100644 --- a/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/FetchMetadataTest.java +++ b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/FetchMetadataTest.java @@ -35,10 +35,13 @@ import java.util.List; import static co.airy.model.metadata.MetadataKeys.ConversationKeys; +import static org.apache.kafka.streams.KafkaStreams.State.RUNNING; import static org.hamcrest.MatcherAssert.assertThat; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.hamcrest.core.IsEqual.equalTo; +import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertTrue; +import static co.airy.test.Timing.retryOnException; @SpringBootTest(classes = AirySpringBootApplication.class) @TestPropertySource(value = "classpath:test.properties") @@ -56,6 +59,9 @@ class FetchMetadataTest { @MockBean private Api api; + @Autowired + private Stores stores; + @Autowired @InjectMocks private Connector worker; @@ -77,8 +83,9 @@ static void afterAll() throws Exception { } @BeforeEach - void beforeEach() { + void beforeEach() throws Exception { MockitoAnnotations.openMocks(this); + retryOnException(() -> assertEquals(stores.getStreamState(), RUNNING), "Failed to reach RUNNING state."); } @Test diff --git a/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/WebhookControllerTest.java b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/WebhookControllerTest.java index 44b65987f9..abf2bd4fae 100644 --- a/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/WebhookControllerTest.java +++ b/backend/sources/facebook/connector/src/test/java/co/airy/core/sources/facebook/WebhookControllerTest.java @@ -7,9 +7,11 @@ import co.airy.spring.core.AirySpringBootApplication; import org.junit.jupiter.api.AfterAll; import org.junit.jupiter.api.BeforeAll; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.junit.jupiter.api.extension.RegisterExtension; +import org.mockito.MockitoAnnotations; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.test.autoconfigure.web.servlet.AutoConfigureMockMvc; import org.springframework.boot.test.context.SpringBootTest; @@ -40,6 +42,9 @@ class WebhookControllerTest { @Autowired private MockMvc mvc; + @Autowired + private Stores stores; + @BeforeAll static void beforeAll() throws Exception { kafkaTestHelper = new KafkaTestHelper(sharedKafkaTestResource, sourceFacebookEvents); @@ -52,6 +57,11 @@ static void afterAll() throws Exception { kafkaTestHelper.afterAll(); } + @BeforeEach + void beforeEach() { + MockitoAnnotations.openMocks(this); + } + @Test void canAcceptAnything() throws Exception { mvc.perform(post("/facebook").content("whatever")).andExpect(status().isOk()); diff --git a/lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelper.java b/lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelper.java index 1f4e9ff59e..e0b5759276 100644 --- a/lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelper.java +++ b/lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelper.java @@ -1,9 +1,7 @@ package co.airy.spring.test; -import org.springframework.beans.factory.annotation.Value; import org.springframework.http.HttpHeaders; -import org.springframework.stereotype.Component; import org.springframework.test.web.servlet.MockMvc; import org.springframework.test.web.servlet.ResultActions; import org.springframework.test.web.servlet.request.MockMvcRequestBuilders; @@ -13,12 +11,11 @@ import static org.springframework.http.MediaType.APPLICATION_JSON; import static org.springframework.test.web.servlet.result.MockMvcResultMatchers.status; -@Component public class WebTestHelper { private final MockMvc mvc; private final String systemToken; - WebTestHelper(MockMvc mvc, @Value("${systemToken:#{null}}") String systemToken) { + WebTestHelper(MockMvc mvc, String systemToken) { this.mvc = mvc; this.systemToken = systemToken; } diff --git a/lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelperConfig.java b/lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelperConfig.java new file mode 100644 index 0000000000..0ffa33ac7c --- /dev/null +++ b/lib/java/spring/test/src/main/java/co/airy/spring/test/WebTestHelperConfig.java @@ -0,0 +1,17 @@ +package co.airy.spring.test; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Lazy; +import org.springframework.test.web.servlet.MockMvc; + +@Configuration +public class WebTestHelperConfig { + + @Bean + @Lazy + public WebTestHelper webTestHelper(MockMvc mvc, @Value("${systemToken:#{null}}") String systemToken) { + return new WebTestHelper(mvc, systemToken); + } +} From e3abec464fd3c49d1030ffc312b11c01d8fd6467 Mon Sep 17 00:00:00 2001 From: Ljupco Vangelski Date: Fri, 17 Dec 2021 10:23:26 +0100 Subject: [PATCH 20/24] [#2663] Pull busybox from Github packages (#2664) --- .../templates/communication/deployment.yaml | 2 +- .../api-communication/templates/websocket/deployment.yaml | 2 +- .../integration/charts/source-api/templates/deployment.yaml | 2 +- .../integration/charts/webhook/templates/deployments.yaml | 4 ++-- .../charts/media/charts/resolver/templates/deployment.yaml | 2 +- .../charts/chatplugin/templates/backend/deployment.yaml | 2 +- .../charts/chatplugin/templates/frontend/deployment.yaml | 2 +- .../sources/charts/facebook/templates/deployments.yaml | 4 ++-- .../charts/sources/charts/google/templates/deployments.yaml | 4 ++-- .../charts/sources/charts/twilio/templates/deployments.yaml | 4 ++-- .../charts/sources/charts/viber/templates/deployments.yaml | 4 ++-- .../charts/components/templates/api/admin/deployment.yaml | 2 +- .../charts/kafka/charts/kafka/templates/statefulset.yaml | 4 ++-- .../kafka/charts/schema-registry/templates/deployment.yaml | 2 +- .../kafka/charts/zookeeper/templates/statefulset.yaml | 2 +- .../helm-chart/templates/provisioning/job-kafka.yaml | 2 +- .../helm-chart/templates/provisioning/job-wait.yaml | 4 ++-- infrastructure/helm-chart/templates/upgrading/0.29.0.yaml | 4 ++-- infrastructure/helm-chart/values.yaml | 1 + infrastructure/images/busybox/Dockerfile | 3 +++ infrastructure/images/busybox/Makefile | 6 ++++++ 21 files changed, 36 insertions(+), 26 deletions(-) create mode 100644 infrastructure/images/busybox/Dockerfile create mode 100644 infrastructure/images/busybox/Makefile diff --git a/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/communication/deployment.yaml b/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/communication/deployment.yaml index 86c0987e94..3013b66487 100644 --- a/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/communication/deployment.yaml +++ b/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/communication/deployment.yaml @@ -61,7 +61,7 @@ spec: {{ toYaml .Values.communication.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/websocket/deployment.yaml b/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/websocket/deployment.yaml index 57120161a5..8ec1ad0cae 100644 --- a/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/websocket/deployment.yaml +++ b/infrastructure/helm-chart/charts/components/charts/api/charts/api-communication/templates/websocket/deployment.yaml @@ -61,7 +61,7 @@ spec: {{ toYaml .Values.websocket.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/integration/charts/source-api/templates/deployment.yaml b/infrastructure/helm-chart/charts/components/charts/integration/charts/source-api/templates/deployment.yaml index 33e6e3b398..259796ccd1 100644 --- a/infrastructure/helm-chart/charts/components/charts/integration/charts/source-api/templates/deployment.yaml +++ b/infrastructure/helm-chart/charts/components/charts/integration/charts/source-api/templates/deployment.yaml @@ -69,7 +69,7 @@ spec: {{ toYaml .Values.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/integration/charts/webhook/templates/deployments.yaml b/infrastructure/helm-chart/charts/components/charts/integration/charts/webhook/templates/deployments.yaml index 94e58389d9..1cf0333a4c 100644 --- a/infrastructure/helm-chart/charts/components/charts/integration/charts/webhook/templates/deployments.yaml +++ b/infrastructure/helm-chart/charts/components/charts/integration/charts/webhook/templates/deployments.yaml @@ -71,7 +71,7 @@ spec: {{ toYaml .Values.consumer.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-service.sh"] env: @@ -168,7 +168,7 @@ spec: {{ toYaml .Values.publisher.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/media/charts/resolver/templates/deployment.yaml b/infrastructure/helm-chart/charts/components/charts/media/charts/resolver/templates/deployment.yaml index 861a34ea58..e27369daa6 100644 --- a/infrastructure/helm-chart/charts/components/charts/media/charts/resolver/templates/deployment.yaml +++ b/infrastructure/helm-chart/charts/components/charts/media/charts/resolver/templates/deployment.yaml @@ -63,7 +63,7 @@ spec: {{ toYaml .Values.resources | indent 12 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/backend/deployment.yaml b/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/backend/deployment.yaml index 43579183e7..a43ca3fdcb 100644 --- a/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/backend/deployment.yaml +++ b/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/backend/deployment.yaml @@ -71,7 +71,7 @@ spec: {{ toYaml .Values.backend.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/frontend/deployment.yaml b/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/frontend/deployment.yaml index 556b9a7c88..bc39f9b92a 100644 --- a/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/frontend/deployment.yaml +++ b/infrastructure/helm-chart/charts/components/charts/sources/charts/chatplugin/templates/frontend/deployment.yaml @@ -48,7 +48,7 @@ spec: {{ toYaml .Values.frontend.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-service.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/sources/charts/facebook/templates/deployments.yaml b/infrastructure/helm-chart/charts/components/charts/sources/charts/facebook/templates/deployments.yaml index 5e673e5888..7fb5613eb2 100644 --- a/infrastructure/helm-chart/charts/components/charts/sources/charts/facebook/templates/deployments.yaml +++ b/infrastructure/helm-chart/charts/components/charts/sources/charts/facebook/templates/deployments.yaml @@ -76,7 +76,7 @@ spec: {{ toYaml .Values.connector.resources | indent 12 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: @@ -161,7 +161,7 @@ spec: {{ toYaml .Values.eventsRouter.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/sources/charts/google/templates/deployments.yaml b/infrastructure/helm-chart/charts/components/charts/sources/charts/google/templates/deployments.yaml index 0fed5e8048..9316f06877 100644 --- a/infrastructure/helm-chart/charts/components/charts/sources/charts/google/templates/deployments.yaml +++ b/infrastructure/helm-chart/charts/components/charts/sources/charts/google/templates/deployments.yaml @@ -71,7 +71,7 @@ spec: {{ toYaml .Values.connector.resources | indent 12 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: @@ -159,7 +159,7 @@ spec: {{ toYaml .Values.eventsRouter.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/sources/charts/twilio/templates/deployments.yaml b/infrastructure/helm-chart/charts/components/charts/sources/charts/twilio/templates/deployments.yaml index f3a998f91b..b6f86cf3b9 100644 --- a/infrastructure/helm-chart/charts/components/charts/sources/charts/twilio/templates/deployments.yaml +++ b/infrastructure/helm-chart/charts/components/charts/sources/charts/twilio/templates/deployments.yaml @@ -71,7 +71,7 @@ spec: {{ toYaml .Values.connector.resources | indent 12 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: @@ -161,7 +161,7 @@ spec: {{ toYaml .Values.eventsRouter.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/components/charts/sources/charts/viber/templates/deployments.yaml b/infrastructure/helm-chart/charts/components/charts/sources/charts/viber/templates/deployments.yaml index cd9c59ee8e..bc94277f3b 100644 --- a/infrastructure/helm-chart/charts/components/charts/sources/charts/viber/templates/deployments.yaml +++ b/infrastructure/helm-chart/charts/components/charts/sources/charts/viber/templates/deployments.yaml @@ -66,7 +66,7 @@ spec: {{ toYaml .Values.connector.resources | indent 12 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: [ "/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh" ] env: @@ -156,7 +156,7 @@ spec: {{ toYaml .Values.eventsRouter.resources | indent 12 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: [ "/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh" ] env: diff --git a/infrastructure/helm-chart/charts/components/templates/api/admin/deployment.yaml b/infrastructure/helm-chart/charts/components/templates/api/admin/deployment.yaml index b962f53dd5..a857d872e7 100644 --- a/infrastructure/helm-chart/charts/components/templates/api/admin/deployment.yaml +++ b/infrastructure/helm-chart/charts/components/templates/api/admin/deployment.yaml @@ -77,7 +77,7 @@ spec: {{ toYaml .Values.api.admin.resources | indent 10 }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/kafka/templates/statefulset.yaml b/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/kafka/templates/statefulset.yaml index 9623730be7..1521c11565 100644 --- a/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/kafka/templates/statefulset.yaml +++ b/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/kafka/templates/statefulset.yaml @@ -108,7 +108,7 @@ spec: {{- end }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-service-url.sh"] env: @@ -118,7 +118,7 @@ spec: - name: kafka-helper-scripts mountPath: /opt/provisioning - name: fix-permissions - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: - sh diff --git a/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/schema-registry/templates/deployment.yaml b/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/schema-registry/templates/deployment.yaml index 8489e443be..82fd26fae2 100644 --- a/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/schema-registry/templates/deployment.yaml +++ b/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/schema-registry/templates/deployment.yaml @@ -41,7 +41,7 @@ spec: value: {{ .Values.kafka.bootstrapServers }} initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/zookeeper/templates/statefulset.yaml b/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/zookeeper/templates/statefulset.yaml index e3e0fa887e..2356f50d97 100644 --- a/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/zookeeper/templates/statefulset.yaml +++ b/infrastructure/helm-chart/charts/prerequisites/charts/kafka/charts/zookeeper/templates/statefulset.yaml @@ -47,7 +47,7 @@ spec: topologyKey: "kubernetes.io/hostname" initContainers: - name: fix-permissions - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: - sh diff --git a/infrastructure/helm-chart/templates/provisioning/job-kafka.yaml b/infrastructure/helm-chart/templates/provisioning/job-kafka.yaml index 702c24be21..e7470ee1e2 100644 --- a/infrastructure/helm-chart/templates/provisioning/job-kafka.yaml +++ b/infrastructure/helm-chart/templates/provisioning/job-kafka.yaml @@ -31,7 +31,7 @@ spec: mountPath: /opt/provisioning initContainers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-minimum-kafkas.sh"] env: diff --git a/infrastructure/helm-chart/templates/provisioning/job-wait.yaml b/infrastructure/helm-chart/templates/provisioning/job-wait.yaml index 63ed7410fd..ea75c1c012 100644 --- a/infrastructure/helm-chart/templates/provisioning/job-wait.yaml +++ b/infrastructure/helm-chart/templates/provisioning/job-wait.yaml @@ -14,7 +14,7 @@ spec: spec: containers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-service-url.sh"] env: @@ -46,7 +46,7 @@ spec: spec: containers: - name: wait - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-service-url.sh"] env: diff --git a/infrastructure/helm-chart/templates/upgrading/0.29.0.yaml b/infrastructure/helm-chart/templates/upgrading/0.29.0.yaml index e678ba5c79..3ae0798aea 100644 --- a/infrastructure/helm-chart/templates/upgrading/0.29.0.yaml +++ b/infrastructure/helm-chart/templates/upgrading/0.29.0.yaml @@ -126,7 +126,7 @@ spec: spec: initContainers: - name: wait-api-admin - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-service.sh"] env: @@ -269,7 +269,7 @@ spec: spec: initContainers: - name: wait-api-admin - image: busybox + image: "{{ .Values.global.busyboxImage }}" imagePullPolicy: IfNotPresent command: ["/bin/sh", "/opt/provisioning/wait-for-service.sh"] env: diff --git a/infrastructure/helm-chart/values.yaml b/infrastructure/helm-chart/values.yaml index 5730dcbfe2..4ec647a456 100644 --- a/infrastructure/helm-chart/values.yaml +++ b/infrastructure/helm-chart/values.yaml @@ -1,5 +1,6 @@ global: containerRegistry: ghcr.io/airyhq + busyboxImage: ghcr.io/airyhq/infrastructure/busybox:latest security: systemToken: "" allowedOrigins: "*" diff --git a/infrastructure/images/busybox/Dockerfile b/infrastructure/images/busybox/Dockerfile new file mode 100644 index 0000000000..19c21f98a7 --- /dev/null +++ b/infrastructure/images/busybox/Dockerfile @@ -0,0 +1,3 @@ +FROM busybox + +LABEL maintainer "https://github.com/airyhq" diff --git a/infrastructure/images/busybox/Makefile b/infrastructure/images/busybox/Makefile new file mode 100644 index 0000000000..0942ee4758 --- /dev/null +++ b/infrastructure/images/busybox/Makefile @@ -0,0 +1,6 @@ +build: + docker build -t busybox . + +release: build + docker tag busybox ghcr.io/airyhq/infrastructure/busybox + docker push ghcr.io/airyhq/infrastructure/busybox From 045165651320f51cb1c35d5ef7e3348c7558170a Mon Sep 17 00:00:00 2001 From: Thorsten Date: Fri, 17 Dec 2021 17:31:38 +0100 Subject: [PATCH 21/24] Fixes #2666 --- VERSION | 2 +- docs/docs/changelog.md | 279 ++++++++++++++++++++--------------------- 2 files changed, 136 insertions(+), 145 deletions(-) diff --git a/VERSION b/VERSION index ed68852ec0..0f1a7dfc7c 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.37.1-alpha +0.37.0 diff --git a/docs/docs/changelog.md b/docs/docs/changelog.md index ab4751d5ea..87d132973a 100644 --- a/docs/docs/changelog.md +++ b/docs/docs/changelog.md @@ -1,14 +1,58 @@ ---- -title: Changelog -sidebar_label: 📝 Changelog ---- - -## 0.36.1 +--- +title: Changelog +sidebar_label: 📝 Changelog +--- + +## 0.37.0 + +#### Changes + +- [[#2653](https://github.com/airyhq/airy/issues/2653)] upgrade slf4j and underlying log4j libraries [[#2654](https://github.com/airyhq/airy/pull/2654)] + +#### 🚀 Features + +- [[#2586](https://github.com/airyhq/airy/issues/2586)] Set min and max size for EKS node group [[#2648](https://github.com/airyhq/airy/pull/2648)] +- [[#2586](https://github.com/airyhq/airy/issues/2586)] Fix terraform [[#2643](https://github.com/airyhq/airy/pull/2643)] +- [[#2611](https://github.com/airyhq/airy/issues/2611)] Session timeout [[#2630](https://github.com/airyhq/airy/pull/2630)] + +#### 🐛 Bug Fixes + +- [[#2660](https://github.com/airyhq/airy/issues/2660)] Refactor fargate\_profiles in AWS EKS [[#2661](https://github.com/airyhq/airy/pull/2661)] +- [[#2649](https://github.com/airyhq/airy/issues/2649)] ui fix instagram messages [[#2650](https://github.com/airyhq/airy/pull/2650)] +- [[#2637](https://github.com/airyhq/airy/issues/2637)] Fix channel prefill [[#2639](https://github.com/airyhq/airy/pull/2639)] + +#### 📚 Documentation + +- [[#2550](https://github.com/airyhq/airy/issues/2550)] Docs for multiple providers using helm [[#2597](https://github.com/airyhq/airy/pull/2597)] + +#### 🧰 Maintenance + +- Bump terser-webpack-plugin from 5.2.4 to 5.2.5 [[#2655](https://github.com/airyhq/airy/pull/2655)] +- Bump prettier from 2.4.1 to 2.5.1 [[#2635](https://github.com/airyhq/airy/pull/2635)] +- Bump algoliasearch-helper from 3.4.4 to 3.6.2 in /docs [[#2614](https://github.com/airyhq/airy/pull/2614)] +- Bump @babel/preset-typescript from 7.15.0 to 7.16.0 [[#2599](https://github.com/airyhq/airy/pull/2599)] +- Bump webpack from 5.59.1 to 5.64.4 [[#2620](https://github.com/airyhq/airy/pull/2620)] + +#### Airy CLI + +You can download the Airy CLI for your operating system from the following links: + +[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.36.2/darwin/amd64/airy) +[Linux](https://airy-core-binaries.s3.amazonaws.com/0.36.2/linux/amd64/airy) +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.36.2/windows/amd64/airy.exe) + +## 0.36.1 + +#### Changes #### 🐛 Bug Fixes - [[#2434](https://github.com/airyhq/airy/issues/2434)] Fix instagram ingestion race condition [[#2625](https://github.com/airyhq/airy/pull/2625)] +#### 🧰 Maintenance + +- Bump webpack from 5.59.1 to 5.64.4 [[#2620](https://github.com/airyhq/airy/pull/2620)] + #### Airy CLI You can download the Airy CLI for your operating system from the following links: @@ -16,9 +60,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.36.1/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.36.1/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.36.1/windows/amd64/airy.exe) - -## 0.36.0 - + +## 0.36.0 + #### 🚀 Features - [[#2604](https://github.com/airyhq/airy/issues/2604)] Added attachment toggle for chatplugin [[#2609](https://github.com/airyhq/airy/pull/2609)] @@ -39,9 +83,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.36.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.36.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.36.0/windows/amd64/airy.exe) - -## 0.35.1 - + +## 0.35.1 + #### 🚀 Features - [[#2586](https://github.com/airyhq/airy/issues/2586)] Terraform core module has wrong Helm link [[#2587](https://github.com/airyhq/airy/pull/2587)] @@ -71,9 +115,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.35.1/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.35.1/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.35.1/windows/amd64/airy.exe) - -## 0.35.0 - + +## 0.35.0 + #### 🚀 Features - [[#2455](https://github.com/airyhq/airy/issues/2455)] Custom message colors chatplugin [[#2585](https://github.com/airyhq/airy/pull/2585)] @@ -117,9 +161,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.35.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.35.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.35.0/windows/amd64/airy.exe) - -## 0.34.0 - + +## 0.34.0 + #### Changes #### 🚀 Features @@ -152,9 +196,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.34.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.34.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.34.0/windows/amd64/airy.exe) - -## 0.33.0 - + +## 0.33.0 + #### 🚀 Features - [[#2294](https://github.com/airyhq/airy/issues/2294)] Allow creating conversations with Twilio [[#2500](https://github.com/airyhq/airy/pull/2500)] @@ -223,9 +267,9 @@ This release has breaking changes in the structure of the airy.yaml file. When u from the version of the CLI and the - namespace is used from the workspace file cli.yaml - Rename the `ingress:` section to `ingress-controller:` - -## 0.32.0 - + +## 0.32.0 + #### Changes #### 🚀 Features @@ -251,9 +295,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.32.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.32.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.32.0/windows/amd64/airy.exe) - -## 0.31.1 - + +## 0.31.1 + #### 🚀 Features - [[#2432](https://github.com/airyhq/airy/issues/2432)] Added more options to the UI [[#2433](https://github.com/airyhq/airy/pull/2433)] @@ -275,9 +319,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.31.1/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.31.1/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.31.1/windows/amd64/airy.exe) - -## 0.31.0 - + +## 0.31.0 + #### 🚀 Features - [[#628](https://github.com/airyhq/airy/issues/628)] Make library compatible with node.js [[#2426](https://github.com/airyhq/airy/pull/2426)] @@ -317,9 +361,9 @@ You can download the Airy CLI for your operating system from the following links #### Upgrade notes In the `airy.yaml` file, `host` is moved from the `kubernetes` section, into the `ingress` section. - -## 0.29.0 - + +## 0.29.0 + #### Changes - [[#2304](https://github.com/airyhq/airy/issues/2304)] Fixed broken link from Messages Send Section to Sources. [[#2307](https://github.com/airyhq/airy/pull/2307)] @@ -367,9 +411,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.29.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.29.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.29.0/windows/amd64/airy.exe) - -## 0.30.0 - + +## 0.30.0 + #### 🚀 Features - [[#2274](https://github.com/airyhq/airy/issues/2274)] Introduce the source API [[#2327](https://github.com/airyhq/airy/pull/2327)] @@ -418,9 +462,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.30.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.30.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.30.0/windows/amd64/airy.exe) - -## 0.28.0 - + +## 0.28.0 + #### 🚀 Features - [[#1911](https://github.com/airyhq/airy/issues/1911)] Reorganize the helm charts [[#2241](https://github.com/airyhq/airy/pull/2241)] @@ -458,21 +502,21 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.28.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.28.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.28.0/windows/amd64/airy.exe) - -## Hotfix 0.27.1 - -[[#2219](https://github.com/airyhq/airy/issues/2219)] fixed inbox ui overflow bug [[#2220](https://github.com/airyhq/airy/pull/2220)] -## Hotfix 0.26.3 - -[[#2192](https://github.com/airyhq/airy/issues/2192)] Inbox crashing when selecting conversations in filtered view [[#2193](https://github.com/airyhq/airy/pull/2193)] -## Hotfix 0.26.2 - -[[#2187](https://github.com/airyhq/airy/issues/2187)] Hotfix chat plugin async bundle loading failed on installed websites -## Hotfix 0.26.1 - -[[#2181](https://github.com/airyhq/airy/issues/2181)] Fixes chat plugin integration crashing with empty config -## 0.27.0 - + +## Hotfix 0.27.1 + +[[#2219](https://github.com/airyhq/airy/issues/2219)] fixed inbox ui overflow bug [[#2220](https://github.com/airyhq/airy/pull/2220)] +## Hotfix 0.26.3 + +[[#2192](https://github.com/airyhq/airy/issues/2192)] Inbox crashing when selecting conversations in filtered view [[#2193](https://github.com/airyhq/airy/pull/2193)] +## Hotfix 0.26.2 + +[[#2187](https://github.com/airyhq/airy/issues/2187)] Hotfix chat plugin async bundle loading failed on installed websites +## Hotfix 0.26.1 + +[[#2181](https://github.com/airyhq/airy/issues/2181)] Fixes chat plugin integration crashing with empty config +## 0.27.0 + #### Changes #### 🚀 Features @@ -515,9 +559,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.27.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.27.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.27.0/windows/amd64/airy.exe) - -## 0.26.0 - + +## 0.26.0 + #### Changes - Change endpoint for webhook to /twilio [[#2123](https://github.com/airyhq/airy/pull/2123)] @@ -585,9 +629,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.25.1/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.25.1/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.25.1/windows/amd64/airy.exe) - -## 0.25.0 - + +## 0.25.0 + #### 🚀 Features - [[#1752](https://github.com/airyhq/airy/issues/1752)] Add connect cluster chart [[#1961](https://github.com/airyhq/airy/pull/1961)] @@ -629,13 +673,13 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.24.1/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.24.1/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.24.1/windows/amd64/airy.exe) - -## 0.23.1 Hotfix - + +## 0.23.1 Hotfix + [[#1921](https://github.com/airyhq/airy/issues/1921)] Hotfix: Facebook echo ingestion [[#1922](https://github.com/airyhq/airy/issues/1922)] - -## 0.24.0 - + +## 0.24.0 + #### Changes - [[#1956](https://github.com/airyhq/airy/issues/1956)] Fix link to installation page [[#1957](https://github.com/airyhq/airy/pull/1957)] @@ -688,9 +732,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.24.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.24.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.24.0/windows/amd64/airy.exe) - -## 0.23.0 - + +## 0.23.0 + #### 🚀 Features - [[#1815](https://github.com/airyhq/airy/issues/1815)] Added emptyState for filtered items [[#1874](https://github.com/airyhq/airy/pull/1874)] @@ -762,9 +806,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.23.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.23.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.23.0/windows/amd64/airy.exe) - -## 0.22.0 - + +## 0.22.0 + #### 🚀 Features - [[#1743](https://github.com/airyhq/airy/issues/1743)] Return proper status code for unauthorized access [[#1785](https://github.com/airyhq/airy/pull/1785)] @@ -804,9 +848,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.22.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.22.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.22.0/windows/amd64/airy.exe) - -## 0.21.0 - + +## 0.21.0 + #### Changes - [[#1750](https://github.com/airyhq/airy/issues/1750)] Fix tags filter [[#1765](https://github.com/airyhq/airy/pull/1765)] @@ -861,9 +905,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.21.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.21.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.21.0/windows/amd64/airy.exe) - -## 0.20.0 - + +## 0.20.0 + #### Changes - Bump @types/react from 16.9.34 to 17.0.4 [[#1658](https://github.com/airyhq/airy/pull/1658)] @@ -914,9 +958,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.20.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.20.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.20.0/windows/amd64/airy.exe) - -## 0.19.0 - + +## 0.19.0 + #### Changes #### 🚀 Features @@ -969,9 +1013,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.19.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.19.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.19.0/windows/amd64/airy.exe) - -## 0.18.0 - + +## 0.18.0 + #### 🚀 Features - [[#1524](https://github.com/airyhq/airy/issues/1524)] Added conversationState to conversationList [[#1560](https://github.com/airyhq/airy/pull/1560)] - [[#1515](https://github.com/airyhq/airy/issues/1515)] Create airy chat plugin library + use it in UI [[#1550](https://github.com/airyhq/airy/pull/1550)] @@ -1020,9 +1064,9 @@ You can download the Airy CLI for your operating system from the following links You can download the Airy CLI for your operating system from the following links: [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.18.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.18.0/linux/amd64/airy) -[Windows](https://airy-core-binaries.s3.amazonaws.com/0.18.0/windows/amd64/airy.exe) -## 0.17.0 - +[Windows](https://airy-core-binaries.s3.amazonaws.com/0.18.0/windows/amd64/airy.exe) +## 0.17.0 + #### 🚀 Features - [[#929](https://github.com/airyhq/airy/issues/929)] Implement the option to end chat [[#1508](https://github.com/airyhq/airy/pull/1508)] @@ -1072,9 +1116,9 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.17.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.17.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.17.0/windows/amd64/airy.exe) - -## 0.16.0 - + +## 0.16.0 + #### 🚀 Features - [[#1111](https://github.com/airyhq/airy/issues/1111)] Customize Chat Plugin [[#1456](https://github.com/airyhq/airy/pull/1456)] @@ -1126,57 +1170,4 @@ You can download the Airy CLI for your operating system from the following links [MacOS](https://airy-core-binaries.s3.amazonaws.com/0.16.0/darwin/amd64/airy) [Linux](https://airy-core-binaries.s3.amazonaws.com/0.16.0/linux/amd64/airy) [Windows](https://airy-core-binaries.s3.amazonaws.com/0.16.0/windows/amd64/airy.exe) - -## 0.15.1 Hotfix - -- [[#1427](https://github.com/airyhq/airy/issues/1427)] Fix broken UI pod config for AWS deployment - -## 0.15.0 - -#### 🚀 Features - -- [[#1299](https://github.com/airyhq/airy/issues/1299)] Video Fallback for the render library [[#1412](https://github.com/airyhq/airy/pull/1412)] -- [[#1357](https://github.com/airyhq/airy/issues/1357)] Rename the draft release with release.sh [[#1394](https://github.com/airyhq/airy/pull/1394)] -- [[#1018](https://github.com/airyhq/airy/issues/1018)] Introduce aws provider for airy create [[#1240](https://github.com/airyhq/airy/pull/1240)] -- [[#1182](https://github.com/airyhq/airy/issues/1182)] Added gifs and image to supported message types chat plugin [[#1365](https://github.com/airyhq/airy/pull/1365)] -- [[#1326](https://github.com/airyhq/airy/issues/1326)] Move Carousel to components lib [[#1364](https://github.com/airyhq/airy/pull/1364)] -- [[#1097](https://github.com/airyhq/airy/issues/1097)] Allow users to fetch a chat plugin resume token [[#1350](https://github.com/airyhq/airy/pull/1350)] -- [[#1325](https://github.com/airyhq/airy/issues/1325)] Move ListenOutsideClick to component lib [[#1345](https://github.com/airyhq/airy/pull/1345)] - -#### 🐛 Bug Fixes - -- [[#1392](https://github.com/airyhq/airy/issues/1392)] Cypress testing for filtering is false positive [[#1402](https://github.com/airyhq/airy/pull/1402)] -- [[#1097](https://github.com/airyhq/airy/issues/1097)] Fix CORS issue introduced by PR #1350 [[#1371](https://github.com/airyhq/airy/pull/1371)] -- [[#1369](https://github.com/airyhq/airy/issues/1369)] Improved filtering for channels [[#1375](https://github.com/airyhq/airy/pull/1375)] - -#### 📚 Documentation - -- [[#1363](https://github.com/airyhq/airy/issues/1363)] Added suggested replies doc [[#1381](https://github.com/airyhq/airy/pull/1381)] -- [[#1355](https://github.com/airyhq/airy/issues/1355)] Add debugging advices to all sources [[#1368](https://github.com/airyhq/airy/pull/1368)] -- [[#1318](https://github.com/airyhq/airy/issues/1318)] Improve components page [[#1360](https://github.com/airyhq/airy/pull/1360)] - -#### 🧰 Maintenance - -- [[#1045](https://github.com/airyhq/airy/issues/1045)] Automated testing of the web socket [[#1382](https://github.com/airyhq/airy/pull/1382)] -- Move CLI to root [[#1401](https://github.com/airyhq/airy/pull/1401)] -- Bump @babel/core from 7.8.4 to 7.13.10 [[#1186](https://github.com/airyhq/airy/pull/1186)] -- Bump webpack from 4.46.0 to 5.27.2 [[#1352](https://github.com/airyhq/airy/pull/1352)] -- Minor tweaks to titles and paragraphs [[#1379](https://github.com/airyhq/airy/pull/1379)] -- Bump @typescript-eslint/eslint-plugin from 4.18.0 to 4.19.0 [[#1376](https://github.com/airyhq/airy/pull/1376)] -- Bump css-loader from 5.1.3 to 5.2.0 [[#1378](https://github.com/airyhq/airy/pull/1378)] -- Bump html-webpack-plugin from 4.5.2 to 5.3.1 [[#1372](https://github.com/airyhq/airy/pull/1372)] -- Bump @bazel/typescript from 3.2.2 to 3.2.3 [[#1374](https://github.com/airyhq/airy/pull/1374)] -- Bump sass-loader from 10.1.1 to 11.0.1 [[#1373](https://github.com/airyhq/airy/pull/1373)] -- Bump copy-webpack-plugin from 6.4.1 to 8.1.0 [[#1366](https://github.com/airyhq/airy/pull/1366)] -- Bump eslint-plugin-react from 7.22.0 to 7.23.0 [[#1339](https://github.com/airyhq/airy/pull/1339)] -- Bump webpack from 5.27.2 to 5.28.0 [[#1361](https://github.com/airyhq/airy/pull/1361)] -- Update the release process [[#1358](https://github.com/airyhq/airy/pull/1358)] - -#### Airy CLI - -You can download the Airy CLI for your operating system from the following links: - -[MacOS](https://airy-core-binaries.s3.amazonaws.com/0.15.0/darwin/amd64/airy) -[Linux](https://airy-core-binaries.s3.amazonaws.com/0.15.0/linux/amd64/airy) -[Windows](https://airy-core-binaries.s3.amazonaws.com/0.15.0/windows/amd64/airy.exe) - + From 8f7eab243007232241e1d57c4b553202892dc3b5 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Mon, 20 Dec 2021 16:48:28 +0100 Subject: [PATCH 22/24] fixed install and customize crash UI --- .../chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx b/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx index c7a96a58b1..4a90050e96 100644 --- a/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx +++ b/frontend/chat-plugin/lib/src/airyRenderProps/AiryBubble/index.tsx @@ -40,7 +40,7 @@ const AiryBubble = (props: Props) => { return (
props.toggleHideChat()} data-cy={props.dataCyId} > From f00f8503567547f593759cbdefe476e3987be6d7 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Tue, 21 Dec 2021 11:01:15 +0100 Subject: [PATCH 23/24] prevent spam messages --- .../ui/src/pages/Inbox/MessageInput/index.tsx | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/frontend/ui/src/pages/Inbox/MessageInput/index.tsx b/frontend/ui/src/pages/Inbox/MessageInput/index.tsx index 30eab89e4f..f82baff0e7 100644 --- a/frontend/ui/src/pages/Inbox/MessageInput/index.tsx +++ b/frontend/ui/src/pages/Inbox/MessageInput/index.tsx @@ -81,6 +81,7 @@ const MessageInput = (props: Props) => { const [uploadedFileUrl, setUploadedFileUrl] = useState(null); const [fileUploadErrorPopUp, setFileUploadErrorPopUp] = useState(''); const [loadingSelector, setLoadingSelector] = useState(false); + const [blockSpam, setBlockSpam] = useState(false); const prevConversationId = usePrevious(conversation.id); const textAreaRef = useRef(null); @@ -237,6 +238,7 @@ const MessageInput = (props: Props) => { if (canSendMessage()) { setSelectedSuggestedReply(null); setSelectedTemplate(null); + setBlockSpam(true); sendMessages( selectedTemplate || selectedSuggestedReply @@ -255,6 +257,7 @@ const MessageInput = (props: Props) => { } ).then(() => { setInput(''); + setBlockSpam(false); removeElementFromInput(); }); } @@ -267,7 +270,7 @@ const MessageInput = (props: Props) => { (event.ctrlKey && event.key === 'Enter') ) { event.preventDefault(); - if (input.trim().length > 0) { + if (input.trim().length > 0 && !blockSpam) { sendMessage(); } } @@ -371,8 +374,7 @@ const MessageInput = (props: Props) => { type="button" styleVariant="outline-big" onClick={toggleSuggestedReplies} - dataCy={cySuggestionsButton} - > + dataCy={cySuggestionsButton}>
Suggestions @@ -453,9 +455,8 @@ const MessageInput = (props: Props) => { (input.trim().length != 0 || canSendMessage()) && styles.sendButtonActive }`} onClick={sendMessage} - disabled={input.trim().length == 0 && !canSendMessage()} - data-cy={cyMessageSendButton} - > + disabled={(input.trim().length == 0 && !canSendMessage()) || blockSpam} + data-cy={cyMessageSendButton}>
@@ -464,8 +465,7 @@ const MessageInput = (props: Props) => {
0 ? {visibility: 'visible'} : {visibility: 'hidden'}} - > + style={textAreaRef?.current?.value?.length > 0 ? {visibility: 'visible'} : {visibility: 'hidden'}}> {'Shift + Enter to add line'}
From 7a128148ca06f94293e8e4b4f8940e783aec7334 Mon Sep 17 00:00:00 2001 From: Thorsten Date: Tue, 21 Dec 2021 11:07:10 +0100 Subject: [PATCH 24/24] fixed lint error --- frontend/ui/src/pages/Inbox/MessageInput/index.tsx | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/frontend/ui/src/pages/Inbox/MessageInput/index.tsx b/frontend/ui/src/pages/Inbox/MessageInput/index.tsx index f82baff0e7..9fabd7b607 100644 --- a/frontend/ui/src/pages/Inbox/MessageInput/index.tsx +++ b/frontend/ui/src/pages/Inbox/MessageInput/index.tsx @@ -374,7 +374,8 @@ const MessageInput = (props: Props) => { type="button" styleVariant="outline-big" onClick={toggleSuggestedReplies} - dataCy={cySuggestionsButton}> + dataCy={cySuggestionsButton} + >
Suggestions @@ -456,7 +457,8 @@ const MessageInput = (props: Props) => { }`} onClick={sendMessage} disabled={(input.trim().length == 0 && !canSendMessage()) || blockSpam} - data-cy={cyMessageSendButton}> + data-cy={cyMessageSendButton} + >
@@ -465,7 +467,8 @@ const MessageInput = (props: Props) => {
0 ? {visibility: 'visible'} : {visibility: 'hidden'}}> + style={textAreaRef?.current?.value?.length > 0 ? {visibility: 'visible'} : {visibility: 'hidden'}} + > {'Shift + Enter to add line'}