diff --git a/docsfera.json b/docsfera.json index a18dad5..ab3a2c1 100644 --- a/docsfera.json +++ b/docsfera.json @@ -42,6 +42,33 @@ ] } }, + "/auth/sign-out": { + "post": { + "operationId": "AuthController_signOut", + "parameters": [ + { + "name": "dadosfera-lang", + "in": "header", + "required": false, + "schema": { + "enum": [ + "pt-br", + "en-us" + ], + "type": "string" + } + } + ], + "responses": { + "204": { + "description": "" + } + }, + "tags": [ + "Auth" + ] + } + }, "/auth/refresh-access-token": { "post": { "operationId": "AuthController_refreshAccessToken", @@ -3415,9 +3442,6 @@ "PipelinesV2" ], "security": [ - { - "access-token": [] - }, { "access-token": [] } @@ -3467,9 +3491,6 @@ "PipelinesV2" ], "security": [ - { - "access-token": [] - }, { "access-token": [] } @@ -3519,9 +3540,6 @@ "PipelinesV2" ], "security": [ - { - "access-token": [] - }, { "access-token": [] } @@ -6251,6 +6269,39 @@ ] } }, + "/customers/{id}/theme/reset": { + "post": { + "operationId": "ThemeController_resetTheme", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "", + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CustomerThemeResponse" + } + } + } + }, + "201": { + "description": "" + } + }, + "tags": [ + "Theme" + ] + } + }, "/network-policy": { "get": { "operationId": "NetworkPolicyController_getNetworks", diff --git a/package-lock.json b/package-lock.json index b491a76..0a1aa0e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,7 +12,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.38.0-beta.10", + "@dadosfera/protospack-v2": "3.38.0-beta.14", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -57,8 +57,8 @@ "swagger-ui-express": "^4.6.3" }, "devDependencies": { - "@types/cookie-parser": "^1.4.9", "@types/cache-manager": "^4.0.6", + "@types/cookie-parser": "^1.4.9", "@types/express": "^4.17.17", "@types/express-session": "^1.18.1", "@types/jest": "27.0.2", @@ -850,6 +850,7 @@ "integrity": "sha512-vMqyb7XCDMPvJFFOaT9kxtiRh42GwlZEg1/uIgtZshS5a/8OaduUfCi7kynKgc3Tw/6Uo2D+db9qBttghhmxwQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", @@ -1408,9 +1409,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.10", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.10.tgz", - "integrity": "sha512-4miwovVFHtBY1VTHdW8BVmSB8m+LXfIA8uigHbeo8IwreMtTHuLpvfenT4MBSPkdVmlo9+0XBKKf+PaSqtdMAg==", + "version": "3.38.0-beta.14", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.14.tgz", + "integrity": "sha512-BiE1fUIHuam3cJjAGIknsRNIlf1Z0JHJOV/VZ2pyAp5mIkGOSoNFBAMXJZb+VMTnd2xsp+vPxNnWVu7OJ/CvMQ==", "license": "ISC", "dependencies": { "@grpc/grpc-js": "^1.9.3", @@ -2260,6 +2261,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/common/-/common-9.4.3.tgz", "integrity": "sha512-Gd6D4IaYj01o14Bwv81ukidn4w3bPHCblMUq+SmUmWLyosK+XQmInCS09SbDDZyL8jy86PngtBLTdhJ2bXSUig==", "license": "MIT", + "peer": true, "dependencies": { "iterare": "1.2.1", "tslib": "2.5.3", @@ -2338,6 +2340,7 @@ "integrity": "sha512-Qi63+wi55Jh4sDyaj5Hhx2jOpKqT386aeo+VOKsxnd+Ql9VvkO/FjmuwBGUyzkJt29ENYc+P0Sx/k5LtstNpPQ==", "hasInstallScript": true, "license": "MIT", + "peer": true, "dependencies": { "@nuxtjs/opencollective": "0.3.2", "fast-safe-stringify": "2.1.1", @@ -2475,6 +2478,7 @@ "resolved": "https://registry.npmjs.org/@nestjs/platform-express/-/platform-express-9.4.3.tgz", "integrity": "sha512-FpdczWoRSC0zz2dNL9u2AQLXKXRVtq4HgHklAhbL59X0uy+mcxhlSThG7DHzDMkoSnuuHY8ojDVf7mDxk+GtCw==", "license": "MIT", + "peer": true, "dependencies": { "body-parser": "1.20.2", "cors": "2.8.5", @@ -2838,6 +2842,7 @@ "resolved": "https://registry.npmjs.org/@opentelemetry/api/-/api-1.9.0.tgz", "integrity": "sha512-3giAOQvZiH5F9bMlMiv8+GSPMeqg0dbaeo58/0SlA9sxSqZhnUtxzX9/2FzyhS9sWQf5S0GJE0AKBrFqjpeYcg==", "license": "Apache-2.0", + "peer": true, "engines": { "node": ">=8.0.0" } @@ -2997,6 +3002,7 @@ "resolved": "https://registry.npmjs.org/@redis/client/-/client-1.6.1.tgz", "integrity": "sha512-/KCsg3xSlR+nCK8/8ZYSknYxvXHwubJrU82F3Lm1Fp6789VQ0/3RJKfsmRXjqfaTA++23CvC3hqmqe/2GEt6Kw==", "license": "MIT", + "peer": true, "dependencies": { "cluster-key-slot": "1.1.2", "generic-pool": "3.9.0", @@ -3793,6 +3799,7 @@ "integrity": "sha512-ejlPM315qwLpaQlQDTjPdsUFSc6ZsP4AN6AlWnogPjQ7CVi7PYF3YVz+CY3jE2pwYf7E/7HlDAN0rV2GxTG0HQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@types/body-parser": "*", "@types/express-serve-static-core": "^4.17.33", @@ -3873,6 +3880,7 @@ "integrity": "sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "jest-diff": "^27.0.0", "pretty-format": "^27.0.0" @@ -3936,7 +3944,8 @@ "version": "16.18.126", "resolved": "https://registry.npmjs.org/@types/node/-/node-16.18.126.tgz", "integrity": "sha512-OTcgaiwfGFBKacvfwuHzzn1KLxH/er8mluiy8/uM3sGXHaRe73RrSIj01jow9t4kJEW633Ov+cOexXeiApTyAw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/@types/oauth": { "version": "0.9.6", @@ -4166,6 +4175,7 @@ "integrity": "sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==", "dev": true, "license": "BSD-2-Clause", + "peer": true, "dependencies": { "@typescript-eslint/scope-manager": "5.62.0", "@typescript-eslint/types": "5.62.0", @@ -4512,6 +4522,7 @@ "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.14.1.tgz", "integrity": "sha512-OvQ/2pUDKmgfCg++xsTX1wGxfTaszcHVcTctW4UJB4hibJx2HXxxO5UmVgyjMa+ZDsiaf5wWLXYpRWMmBI0QHg==", "license": "MIT", + "peer": true, "bin": { "acorn": "bin/acorn" }, @@ -4608,6 +4619,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.12.0.tgz", "integrity": "sha512-sRu1kpcO9yLtYxBKvqfTeh9KzZEwO3STyX1HT+4CaDzC6HpTGYhIhPIzj9XuKU7KYDwnaeh5hcOwjy1QuJzBPA==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "json-schema-traverse": "^1.0.0", @@ -5236,6 +5248,7 @@ } ], "license": "MIT", + "peer": true, "dependencies": { "caniuse-lite": "^1.0.30001688", "electron-to-chromium": "^1.5.73", @@ -5342,6 +5355,7 @@ "resolved": "https://registry.npmjs.org/cache-manager/-/cache-manager-5.7.6.tgz", "integrity": "sha512-wBxnBHjDxF1RXpHCBD6HGvKER003Ts7IIm0CHpggliHzN1RZditb7rXoduE1rplc2DEFYKxhLKgFuchXMJje9w==", "license": "MIT", + "peer": true, "dependencies": { "eventemitter3": "^5.0.1", "lodash.clonedeep": "^4.5.0", @@ -5565,13 +5579,15 @@ "version": "0.5.1", "resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.5.1.tgz", "integrity": "sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==", - "license": "MIT" + "license": "MIT", + "peer": true }, "node_modules/class-validator": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/class-validator/-/class-validator-0.14.1.tgz", "integrity": "sha512-2VEG9JICxIqTpoK1eMzZqaV+u/EiwEJkMGzTrZf6sU/fwsnOITVgYJ8yojSy6CaXtO9V0Cc6ZQZ8h8m4UBuLwQ==", "license": "MIT", + "peer": true, "dependencies": { "@types/validator": "^13.11.8", "libphonenumber-js": "^1.10.53", @@ -6235,7 +6251,8 @@ "version": "0.0.1425554", "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1425554.tgz", "integrity": "sha512-uRfxR6Nlzdzt0ihVIkV+sLztKgs7rgquY/Mhcv1YNCWDh5IZgl5mnn2aeEnW5stYTE0wwiF4RYVz8eMEpV1SEw==", - "license": "BSD-3-Clause" + "license": "BSD-3-Clause", + "peer": true }, "node_modules/dezalgo": { "version": "1.0.4", @@ -6512,7 +6529,6 @@ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -6700,6 +6716,7 @@ "deprecated": "This version is no longer supported. Please see https://eslint.org/version-support for other options.", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -7046,7 +7063,6 @@ "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", "license": "MIT", - "peer": true, "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", @@ -7093,7 +7109,6 @@ "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", "license": "MIT", - "peer": true, "dependencies": { "bytes": "3.1.2", "content-type": "~1.0.5", @@ -7118,7 +7133,6 @@ "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.6" } @@ -7128,7 +7142,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -7137,22 +7150,19 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/express/node_modules/path-to-regexp": { "version": "0.1.12", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.12.tgz", "integrity": "sha512-RA1GjUVMnvYFxuqovrEqZoxxW5NUZqbwKtYz/Tt7nXerk0LbLblQmrsgdeOxV5SFHf0UDggjS/bSeOZwt1pmEQ==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/express/node_modules/qs": { "version": "6.13.0", "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", "license": "BSD-3-Clause", - "peer": true, "dependencies": { "side-channel": "^1.0.6" }, @@ -7181,8 +7191,7 @@ "url": "https://feross.org/support" } ], - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/external-editor": { "version": "3.1.0", @@ -7417,7 +7426,6 @@ "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.3.1.tgz", "integrity": "sha512-6BN9trH7bp3qvnrRyzsBz+g3lZxTNZTbVO2EV1CS0WIcDbawYVdYvGflME/9QP0h0pYlCDBCTjYa9nZzMDpyxQ==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "encodeurl": "~2.0.0", @@ -7436,7 +7444,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -7445,8 +7452,7 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/find-up": { "version": "5.0.0", @@ -8240,6 +8246,7 @@ "resolved": "https://registry.npmjs.org/ioredis/-/ioredis-5.6.1.tgz", "integrity": "sha512-UxC0Yv1Y4WRJiGQxQkP0hfdL0/5/6YvdfOOClRgJ0qppSarkhneSa6UvkMkms0AkdGimSH3Ikqm+6mkMmX7vGA==", "license": "MIT", + "peer": true, "dependencies": { "@ioredis/commands": "^1.1.1", "cluster-key-slot": "^1.1.0", @@ -8581,6 +8588,7 @@ "integrity": "sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@jest/core": "^27.5.1", "import-local": "^3.0.2", @@ -9870,7 +9878,6 @@ "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.3.tgz", "integrity": "sha512-gaNvAS7TZ897/rVaZ0nMtAyxNyi/pdbjbAwUpFQpN70GqnVfOiXpeUUMKRBmzXaSQ8DdTX4/0ms62r2K+hE6mQ==", "license": "MIT", - "peer": true, "funding": { "url": "https://github.com/sponsors/sindresorhus" } @@ -10628,6 +10635,7 @@ "resolved": "https://registry.npmjs.org/passport/-/passport-0.6.0.tgz", "integrity": "sha512-0fe+p3ZnrWRW74fe8+SvCyf4a3Pb2/h7gFkQ8yTJpAO50gDzlfjZUZTO1k5Eg9kUct22OxHLqDZoKUWRHOh9ug==", "license": "MIT", + "peer": true, "dependencies": { "passport-strategy": "1.x.x", "pause": "0.0.1", @@ -11017,6 +11025,7 @@ "integrity": "sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==", "dev": true, "license": "MIT", + "peer": true, "bin": { "prettier": "bin-prettier.js" }, @@ -11519,7 +11528,8 @@ "version": "0.1.14", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.14.tgz", "integrity": "sha512-ZhYeb6nRaXCfhnndflDK8qI6ZQ/YcWZCISRAWICW9XYqMUwjZM9Z0DveWX/ABN01oxSHwVxKQmxeYZSsm0jh5A==", - "license": "Apache-2.0" + "license": "Apache-2.0", + "peer": true }, "node_modules/relative-microtime": { "version": "2.0.0", @@ -11706,6 +11716,7 @@ "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz", "integrity": "sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA==", "license": "Apache-2.0", + "peer": true, "dependencies": { "tslib": "^2.1.0" } @@ -11767,6 +11778,7 @@ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", "license": "MIT", + "peer": true, "dependencies": { "fast-deep-equal": "^3.1.1", "fast-json-stable-stringify": "^2.0.0", @@ -11810,7 +11822,6 @@ "resolved": "https://registry.npmjs.org/send/-/send-0.19.0.tgz", "integrity": "sha512-dW41u5VfLXu8SJh5bwRmyYUbAoSB3c9uQh6L8h/KtsFREPWpbX1lrljJo186Jc4nmci/sGUZ9a0a0J2zgfq2hw==", "license": "MIT", - "peer": true, "dependencies": { "debug": "2.6.9", "depd": "2.0.0", @@ -11835,7 +11846,6 @@ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "license": "MIT", - "peer": true, "dependencies": { "ms": "2.0.0" } @@ -11844,15 +11854,13 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/send/node_modules/encodeurl": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", "license": "MIT", - "peer": true, "engines": { "node": ">= 0.8" } @@ -11861,8 +11869,7 @@ "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/serialize-javascript": { "version": "6.0.2", @@ -11878,7 +11885,6 @@ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.16.2.tgz", "integrity": "sha512-VqpjJZKadQB/PEbEwvFdO43Ax5dFBZ2UECszz8bQ7pi7wt//PWe1P6MN7eCnjsatYtBT6EuiClbjSWP2WrIoTw==", "license": "MIT", - "peer": true, "dependencies": { "encodeurl": "~2.0.0", "escape-html": "~1.0.3", @@ -12856,6 +12862,7 @@ "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", "dev": true, "license": "MIT", + "peer": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -13085,6 +13092,7 @@ "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13412,7 +13420,6 @@ "resolved": "https://registry.npmjs.org/schema-utils/-/schema-utils-4.3.0.tgz", "integrity": "sha512-Gf9qqc58SpCA/xdziiHz35F4GNIWYWZrEshUc/G/r5BnLph6xpKuLeoJoQuj5WfBIx/eQLf+hmVPYHaxJu7V2g==", "license": "MIT", - "peer": true, "dependencies": { "@types/json-schema": "^7.0.9", "ajv": "^8.9.0", diff --git a/package.json b/package.json index 755c52f..e58ffab 100644 --- a/package.json +++ b/package.json @@ -30,7 +30,7 @@ "@aws-sdk/client-secrets-manager": "^3.414.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.38.0-beta.10", + "@dadosfera/protospack-v2": "3.38.0-beta.14", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -78,8 +78,8 @@ "multer": "1.4.5-lts.1" }, "devDependencies": { - "@types/cookie-parser": "^1.4.9", "@types/cache-manager": "^4.0.6", + "@types/cookie-parser": "^1.4.9", "@types/express": "^4.17.17", "@types/express-session": "^1.18.1", "@types/jest": "27.0.2", diff --git a/src/authentication/extract-user.ts b/src/authentication/extract-user.ts new file mode 100644 index 0000000..96a3602 --- /dev/null +++ b/src/authentication/extract-user.ts @@ -0,0 +1,20 @@ +import jwt, { JwtPayload } from 'jsonwebtoken'; + +export function extractUserFrom(aRawJwt: string) { + const decodedToken = jwt.decode(aRawJwt, { + complete: true, + }); + + const payload = decodedToken.payload as JwtPayload; + + return { + user_id: payload.user_id, + username: payload.username, + permissions: payload.permissions, + customer_id: payload.customer_id, + customer_name: payload.customer_name, + customer_tier: payload.customer_tier, + customer_modules: payload.customer_modules, + access_token: aRawJwt, + } +} diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index 2426df7..3eeb2a7 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -390,6 +390,25 @@ export const PERMISSIONS_GROUPS = { }, }, }, + LINEAGE: { + title: { + 'pt-br': 'Explorar | Linhagem', + 'en-us': 'Explore | Lineage', + 'es-es': 'Explorar | Linaje', + }, + permissions: { + VIEW: { + seqid: 50, + claim: 'lineage:view', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Acessar ao módulo de Linhagem', + 'en-us': 'Access to Lineage module', + 'es-es': 'Acceda al módulo de Linaje', + }, + } + }, + }, EMBED: { title: { 'pt-br': 'Analisar | Incorporação', diff --git a/src/main.ts b/src/main.ts index 70161e2..1085fb3 100644 --- a/src/main.ts +++ b/src/main.ts @@ -18,25 +18,36 @@ async function bootstrap() { }); const logger = new DadosferaLogger(); + const corsOrigins = []; + + if (process.env.ENV === 'local') { + corsOrigins.push('http://localhost:4200'); + } else { + corsOrigins.push( + 'https://app.stg.dadosfera.ai', + 'https://app.dadosfera.ai', + 'https://private-frontend.stg.dadosfera.ai', + 'https://unimed.dadosfera.ai', + 'https://boston-scientific.dadosfera.ai', + 'https://plataforma.dadosfera.ai' + ); + } + const app = await NestFactory.create(AppModule, { logger, cors: { - origin: [ - 'https://app.stg.dadosfera.ai', - 'https://app.dadosfera.ai', - 'https://unimed.dadosfera.ai', - 'https://boston-scientific.dadosfera.ai', - 'https://plataforma.dadosfera.ai' - ], + origin: corsOrigins, methods: 'GET,HEAD,PUT,PATCH,POST,DELETE', preflightContinue: false, optionsSuccessStatus: 204, credentials: true, }, }); + app.use(helmet()); app.use(cookieParser(process.env.COOKIE_SECRET)); - if (process.env.ENV === 'prd') { + + if (process.env.ENV !== 'local') { app.use('/catalog/register-dataset', json({ limit: '10mb' })); app.use( '/catalog/register-dataset', diff --git a/src/modules/assign/assign.controller.ts b/src/modules/assign/assign.controller.ts index 81830b4..7e7c40e 100644 --- a/src/modules/assign/assign.controller.ts +++ b/src/modules/assign/assign.controller.ts @@ -1,4 +1,4 @@ -import { Controller, Post, Body, Put, Get} from '@nestjs/common'; +import { Controller, Body, Put, Get, NotFoundException} from '@nestjs/common'; import { AssignService } from './assign.service'; import { CreateAssignDto } from './dto/create-assign.dto'; import { Authenticated, RequireModule, RequireSomePermission } from 'src/decorators/authentication.decorator'; @@ -28,6 +28,10 @@ export class AssignController { @RequireModule(DADOSFERA_MODULES_KEYS.EMBED_ASSIGNED) async get(@User() user: RequestUser) { const metadata = PackTheMetadata(user); - return await this.assignService.get(metadata); + try { + return await this.assignService.get(metadata); + } catch (error) { + throw new NotFoundException(error.message) + } } } diff --git a/src/modules/auth/auth.controller.ts b/src/modules/auth/auth.controller.ts index 648a36f..9a4fb01 100644 --- a/src/modules/auth/auth.controller.ts +++ b/src/modules/auth/auth.controller.ts @@ -54,7 +54,6 @@ import jwt, { JwtPayload } from 'jsonwebtoken'; import { LanguageEnum } from 'src/utils/languages.enum'; import { Language } from 'src/decorators/language.decorator'; import { ApiInternalOnlyEndpoint } from 'src/decorators/swagger.decorator'; -import { Cookie } from 'express-session'; type CookiesValues = { accessToken?: string; @@ -498,29 +497,10 @@ export class AuthController { const userId = req.cookies['ddf-user-id']; this.logger.info('Has cookie: ' + Boolean(accessToken)) - let payload: any; - let userInfo: any = {}; try { // Decodifica e valida o JWT de acesso - const decoded: any = accessToken && jwt.decode(accessToken, { complete: true }); - if (!decoded) throw new Error('Invalid token') - const { kid } = decoded.header; - // Busca a chave pública - const { keys } = await this.authClient.getPublicKeys(); - const pemValue = keys.find((k) => k.kid === kid)?.pem; - if (!pemValue) throw new Error('Public key not found'); - jwt.verify(accessToken, pemValue); - payload = decoded.payload; - userInfo = { - id: payload.user_id, - name: payload.username, - customer: { - id: payload.customer_id, - name: payload.customer_name, - tier: payload.customer_tier, - } - }; - return res.status(200).json(userInfo); + const userDto = await this.authClient.extractUserFrom(accessToken); + return res.status(200).json(userDto); } catch (err) { this.logger.error(err.message); const refreshToken = req.cookies['ddf-refresh-auth']; @@ -545,18 +525,8 @@ export class AuthController { userId }); // Decodifica novo token - const decoded: any = jwt.decode(data.accessToken, { complete: true }); - const payload = decoded.payload; - userInfo = { - id: payload.user_id, - name: payload.username, - customer: { - id: payload.customer_id, - name: payload.customer_name, - tier: payload.customer_tier, - } - }; - return res.status(200).json(userInfo); + const userDto = await this.authClient.extractUserFrom(accessToken); + return res.status(200).json(userDto); } catch (refreshErr) { this.logger.error(refreshErr) return res.status(401).json({ error: 'Not authenticated' }); diff --git a/src/modules/auth/auth.service.ts b/src/modules/auth/auth.service.ts index c94a8d0..3a17327 100644 --- a/src/modules/auth/auth.service.ts +++ b/src/modules/auth/auth.service.ts @@ -4,7 +4,7 @@ import { DadosferaLogger } from '@dadosfera/dadosfera-logs'; import { lastValueFrom } from 'rxjs'; import { ProtoServices } from '@dadosfera/protospack-v2/dist/lib/Duc'; -import { AuthProtoService as AuthServiceInterface, IdentityProviderProtoService } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; +import { AuthProtoService as AuthServiceInterface, IdentityProviderProtoService, UsersProtoService } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/write-service'; import { AuthSnowflakeSignInRequest, AuthSignInRequest, @@ -21,18 +21,18 @@ import { } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/messages'; import { DucClient } from '../duc/client.config'; import { Metadata } from '@grpc/grpc-js'; -import { BulkEditResponse } from './dtos/login'; - +import { BulkEditResponse, UserDTO } from './dtos/login'; +import jwt from 'jsonwebtoken'; +import { PackTheMetadata } from 'src/utils/PackTheMetadata'; @Injectable() export class AuthClientService implements OnModuleInit { - logger: DadosferaLogger; - private authService: AuthServiceInterface; - private identityProviderService: IdentityProviderProtoService; + private userService: UsersProtoService; + constructor( @Inject(DadosferaLogger) dadosferaLogger: DadosferaLogger, @@ -46,8 +46,8 @@ export class AuthClientService implements OnModuleInit { ProtoServices.AuthProtoService, ); - this.identityProviderService = this.grpcClient.getService( - ProtoServices.IdentityProviderProtoService, + this.userService = this.grpcClient.getService( + ProtoServices.UsersProtoService, ); } @@ -283,4 +283,51 @@ export class AuthClientService implements OnModuleInit { throw error; } } + + private async getUser(id: string, metadata: Metadata) { + this.logger.info('getUser'); + return await lastValueFrom( + this.userService.UserFindOneById({ id }, metadata), + ); + } + + public async extractUserFrom(token: string) { + const decoded: any = token && jwt.decode(token, { complete: true }); + if (!decoded) throw new Error('Invalid token'); + + const { kid } = decoded.header; + // Busca a chave pública + const { keys } = await this.getPublicKeys(); + const pemValue = keys.find((k) => k.kid === kid)?.pem; + if (!pemValue) + throw new Error('Public key not found'); + jwt.verify(token, pemValue); + + const payload = decoded.payload; + const metadata = PackTheMetadata({ + customer_id: payload.customer_id + }) + + const { + user + } = await this.getUser( + payload.user_id, + metadata + ); + + const userDto: UserDTO = { + id: user.id, + name: user.username, + jobTitle: user?.jobTitle || null, + department: user?.department || null, + hierarchy: user?.hierarchy || null, + customer: { + id: payload.customer_id, + name: payload.customer_name, + tier: payload.customer_tier, + } + }; + + return userDto; + } } diff --git a/src/modules/auth/dtos/login.ts b/src/modules/auth/dtos/login.ts index dc57d54..3a484c8 100644 --- a/src/modules/auth/dtos/login.ts +++ b/src/modules/auth/dtos/login.ts @@ -140,3 +140,16 @@ export interface BulkEditResponse { successfulUsers: string[]; failedUsers: string[]; } + +export type UserDTO = { + id: string, + name: string, + jobTitle?: string, + department?: string, + hierarchy?: string, + customer: { + id: string, + name: string, + tier: string, + } +} diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index e08cd0b..1848dcd 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -197,9 +197,11 @@ class CatalogService implements OnModuleInit { async getUserRolesIds(userId: string) { const result = await this.userService.findOneById(userId).catch(() => null); - const roles_ids = result.user.roles.map((role) => role.id); + if (result) { + return result.user.roles.map((role) => role.id); + } - return roles_ids; + return []; } async searchDataAssets( diff --git a/src/modules/mixpanel/mixpanel.controller.ts b/src/modules/mixpanel/mixpanel.controller.ts index 477569b..2b2d314 100644 --- a/src/modules/mixpanel/mixpanel.controller.ts +++ b/src/modules/mixpanel/mixpanel.controller.ts @@ -1,29 +1,46 @@ import { Body, Controller, Inject, Param, Post, Req } from '@nestjs/common'; -import { init } from 'mixpanel'; -import { Authenticated } from 'src/decorators/authentication.decorator'; import { ApiInternalOnlyController } from 'src/decorators/swagger.decorator'; -import { RequestUser, User } from 'src/decorators/user.decorator'; +import { RequestUser } from 'src/decorators/user.decorator'; import { MixpanelService } from './mixpanel.service'; +import { extractUserFrom } from 'src/authentication/extract-user'; +import DadosferaLogger from '@dadosfera/dadosfera-logs'; @ApiInternalOnlyController() @Controller('trackEvent') export class MixpanelController { + logger: DadosferaLogger; + constructor( - private mixpanelService: MixpanelService - ) {} + @Inject(DadosferaLogger) + dadosferaLogger: DadosferaLogger, + private mixpanelService: MixpanelService, + ) { + this.logger = dadosferaLogger.logger; + } + @Post(':id') async trackEvent( @Param('id') id, @Body() body, - @User() user: RequestUser, @Req() request ) { + this.logger.info(`POST Track Event: ${id}`) delete body.info; + + const anonymousUser = { + username: "anonymous", + customer_name: "anonymous" + } as RequestUser + + const hasToken = request.headers['authorization']; + + const user = hasToken ? extractUserFrom(hasToken) : anonymousUser; + + this.logger.info(`Has user: ${typeof hasToken == "string"}`) await this.mixpanelService.track(id, user, request, body) + this.logger.info(`Event successful`) return { id, body, user: user.username }; } - - } diff --git a/src/modules/theme/theme.controller.ts b/src/modules/theme/theme.controller.ts index ed8e3a0..79186d7 100644 --- a/src/modules/theme/theme.controller.ts +++ b/src/modules/theme/theme.controller.ts @@ -124,4 +124,24 @@ export class ThemeController { } } + @Post('/:id/theme/reset') + @ApiOkResponse({ type: CustomerThemeResponse }) + async resetTheme(@Param('id') id: string) { + this.logger.info('getCustomerTheme with id' + id); + + try { + await this.themeService.resetTheme(id); + + return { theme: null }; + }catch (err) { + if (err.details === ErrorCodes.CUSTOMER.NOT_FOUND) { + this.logger.error('Error - getCustomerTheme - Expect CUSTOMER.NOT_FOUND'); + throw new HttpException(err.details, HttpStatus.NOT_FOUND); + } else { + this.logger.error('Error - getCustomerTheme Unknown Error:' + err?.message); + return { theme: null }; + }; + } + } + } diff --git a/src/modules/theme/theme.service.ts b/src/modules/theme/theme.service.ts index b62338b..8673788 100644 --- a/src/modules/theme/theme.service.ts +++ b/src/modules/theme/theme.service.ts @@ -44,6 +44,18 @@ export class ThemeService implements OnModuleInit { ); } + async resetTheme(id: string) { + const { theme } = await firstValueFrom( + this.themeService.ResetCustomerTheme({ + id + }), + ); + + return { + theme + } + } + async createThemeByCustomer(id: string, theme: CustomerThemeRequest & Files) { if (!id) { this.logger.error('Error - saveCustomertheme - not found id:' + id);