diff --git a/docsfera.json b/docsfera.json index 9113578..572609f 100644 --- a/docsfera.json +++ b/docsfera.json @@ -1321,9 +1321,6 @@ "Users" ], "security": [ - { - "access-token": [] - }, { "access-token": [] } @@ -4483,6 +4480,14 @@ "schema": { "type": "string" } + }, + { + "name": "asset_type", + "required": true, + "in": "query", + "schema": { + "type": "string" + } } ], "responses": { @@ -5456,6 +5461,66 @@ ] } }, + "/customers/{id}/organization-info": { + "get": { + "operationId": "CustomersController_getOrganizationInfo", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Organization information" + } + }, + "tags": [ + "Customers" + ], + "security": [ + { + "access-token": [] + }, + { + "access-token": [] + } + ] + }, + "put": { + "operationId": "CustomersController_updateOrganizationInfo", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Organization information updated" + } + }, + "tags": [ + "Customers" + ], + "security": [ + { + "access-token": [] + }, + { + "access-token": [] + } + ] + } + }, "/catalog/data-asset/share/{id}": { "get": { "operationId": "ShareController_getShareDataAsset", @@ -7217,33 +7282,6 @@ ] } }, - "/platform/pipeline/pipeline_run": { - "post": { - "operationId": "PlatformApiController_createPipelineRun", - "summary": "Create a pipeline run", - "parameters": [], - "responses": { - "201": { - "description": "", - "content": { - "application/json": { - "schema": { - "type": "object" - } - } - } - } - }, - "tags": [ - "Platform API" - ], - "security": [ - { - "access-token": [] - } - ] - } - }, "/platform/pipeline/{pipelineId}/pipeline_run": { "get": { "operationId": "PlatformApiController_getPipelineRuns", @@ -8185,6 +8223,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "personalSite": { + "type": "string" + }, "mfaStatus": { "type": "string" }, @@ -8215,6 +8262,9 @@ "jobTitle", "department", "hierarchy", + "bio", + "companyName", + "personalSite", "mfaStatus", "createdAt", "updatedAt", @@ -8348,6 +8398,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "personalSite": { + "type": "string" + }, "customer": { "$ref": "#/components/schemas/Customer" }, @@ -8375,6 +8434,9 @@ "jobTitle", "department", "hierarchy", + "bio", + "companyName", + "personalSite", "mfaStatus", "createdAt", "updatedAt", @@ -8515,6 +8577,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "personalSite": { + "type": "string" + }, + "companyName": { + "type": "string" + }, "roleNames": { "type": "array", "items": { @@ -8555,6 +8626,15 @@ "hierarchy": { "type": "string" }, + "bio": { + "type": "string" + }, + "companyName": { + "type": "string" + }, + "personalSite": { + "type": "string" + }, "mfaStatus": { "type": "string" }, @@ -8578,6 +8658,9 @@ "jobTitle", "department", "hierarchy", + "bio", + "companyName", + "personalSite", "mfaStatus", "createdAt", "updatedAt", @@ -9626,6 +9709,9 @@ "public", "private" ] + }, + "docs": { + "type": "string" } }, "required": [ @@ -9880,6 +9966,9 @@ "public", "private" ] + }, + "docs": { + "type": "string" } }, "required": [ @@ -9919,6 +10008,9 @@ }, "embed": { "$ref": "#/components/schemas/EmbedObject" + }, + "docs": { + "type": "string" } }, "required": [ diff --git a/package-lock.json b/package-lock.json index 2e36e66..e0de21d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -17,7 +17,7 @@ "@aws-sdk/signature-v4": "^3.370.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.38.0-beta.16", + "@dadosfera/protospack-v2": "^3.38.0-beta.25", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -283,15 +283,15 @@ } }, "node_modules/@aws-sdk/client-dynamodb": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.957.0.tgz", - "integrity": "sha512-H/uHYgZTmFUq2qb4b/GTxT2F8Yyqyb3pMpI3mldGINZkPYQYN9pP246pqnf+OYOClPMxSMRchrbjZgZhADMi8Q==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-dynamodb/-/client-dynamodb-3.958.0.tgz", + "integrity": "sha512-R3G5cxf3fsL0CEcTbY1VkSwU1FJtImrhA5I9Eepd8nEO6isZ6C99qVKZtDG9eG7qVNK6zTzUigXac/GFrn6hYA==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", - "@aws-sdk/credential-provider-node": "3.957.0", + "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/dynamodb-codec": "3.957.0", "@aws-sdk/middleware-endpoint-discovery": "3.957.0", "@aws-sdk/middleware-host-header": "3.957.0", @@ -349,15 +349,15 @@ } }, "node_modules/@aws-sdk/client-secrets-manager": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.957.0.tgz", - "integrity": "sha512-6YjutprAfYSus+slJ0TTokzyF+eU41xRHYwDgsAlddrGQ82NVd1v9tIpEsXwiLCsebiYouqxR6qbRl6VCPEs9g==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-secrets-manager/-/client-secrets-manager-3.958.0.tgz", + "integrity": "sha512-bd1Eu4vgas9pLTfqFs0CrWwmrRSucDdVmsoD2bFHngx/Q9uqp/ypo0IsjgPYhZpdLYwJbgfjkn5cW9IjhPIVbw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", "@aws-crypto/sha256-js": "5.2.0", "@aws-sdk/core": "3.957.0", - "@aws-sdk/credential-provider-node": "3.957.0", + "@aws-sdk/credential-provider-node": "3.958.0", "@aws-sdk/middleware-host-header": "3.957.0", "@aws-sdk/middleware-logger": "3.957.0", "@aws-sdk/middleware-recursion-detection": "3.957.0", @@ -412,9 +412,9 @@ } }, "node_modules/@aws-sdk/client-sso": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.957.0.tgz", - "integrity": "sha512-iRdRjd+IpOogqRPt8iNRcg30J53z4rRfMviGwpKgsEa/fx3inCUPOuca3Ap7ZDES0atnEg3KGSJ3V/NQiEJ4BA==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.958.0.tgz", + "integrity": "sha512-6qNCIeaMzKzfqasy2nNRuYnMuaMebCcCPP4J2CVGkA8QYMbIVKPlkn9bpB20Vxe6H/r3jtCCLQaOJjVTx/6dXg==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -548,19 +548,19 @@ } }, "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.957.0.tgz", - "integrity": "sha512-YuoZmIeE91YIeUfihh8SiSu546KtTvU+4rG5SaL30U9+nGq6P11GRRgqF0ANUyRseLC9ONHt+utar4gbO3++og==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.958.0.tgz", + "integrity": "sha512-u7twvZa1/6GWmPBZs6DbjlegCoNzNjBsMS/6fvh5quByYrcJr/uLd8YEr7S3UIq4kR/gSnHqcae7y2nL2bqZdg==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", - "@aws-sdk/credential-provider-login": "3.957.0", + "@aws-sdk/credential-provider-login": "3.958.0", "@aws-sdk/credential-provider-process": "3.957.0", - "@aws-sdk/credential-provider-sso": "3.957.0", - "@aws-sdk/credential-provider-web-identity": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/credential-provider-sso": "3.958.0", + "@aws-sdk/credential-provider-web-identity": "3.958.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", @@ -573,13 +573,13 @@ } }, "node_modules/@aws-sdk/credential-provider-login": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.957.0.tgz", - "integrity": "sha512-XcD5NEQDWYk8B4gs89bkwf2d+DNF8oS2NR5RoHJEbX4l8KErVATUjpEYVn6/rAFEktungxlYTnQ5wh0cIQvP5w==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-login/-/credential-provider-login-3.958.0.tgz", + "integrity": "sha512-sDwtDnBSszUIbzbOORGh5gmXGl9aK25+BHb4gb1aVlqB+nNL2+IUEJA62+CE55lXSH8qXF90paivjK8tOHTwPA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/protocol-http": "^5.3.7", @@ -592,17 +592,17 @@ } }, "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.957.0.tgz", - "integrity": "sha512-b9FT/7BQcJ001w+3JbTiJXfxHrWvPb7zDvvC1i1FKcNOvyCt3BGu04n4nO/b71a3iBnbfBXI89hCIZQsuLcEgw==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.958.0.tgz", + "integrity": "sha512-vdoZbNG2dt66I7EpN3fKCzi6fp9xjIiwEA/vVVgqO4wXCGw8rKPIdDUus4e13VvTr330uQs2W0UNg/7AgtquEQ==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/credential-provider-env": "3.957.0", "@aws-sdk/credential-provider-http": "3.957.0", - "@aws-sdk/credential-provider-ini": "3.957.0", + "@aws-sdk/credential-provider-ini": "3.958.0", "@aws-sdk/credential-provider-process": "3.957.0", - "@aws-sdk/credential-provider-sso": "3.957.0", - "@aws-sdk/credential-provider-web-identity": "3.957.0", + "@aws-sdk/credential-provider-sso": "3.958.0", + "@aws-sdk/credential-provider-web-identity": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/credential-provider-imds": "^4.2.7", "@smithy/property-provider": "^4.2.7", @@ -632,14 +632,14 @@ } }, "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.957.0.tgz", - "integrity": "sha512-gTLPJFOkGtn3tVGglRhCar2oOobK1YctZRAT8nfJr17uaSRoAP46zIIHNYBZZUMqImb0qAHD9Ugm+Zd9sIqxyA==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.958.0.tgz", + "integrity": "sha512-CBYHJ5ufp8HC4q+o7IJejCUctJXWaksgpmoFpXerbjAso7/Fg7LLUu9inXVOxlHKLlvYekDXjIUBXDJS2WYdgg==", "license": "Apache-2.0", "dependencies": { - "@aws-sdk/client-sso": "3.957.0", + "@aws-sdk/client-sso": "3.958.0", "@aws-sdk/core": "3.957.0", - "@aws-sdk/token-providers": "3.957.0", + "@aws-sdk/token-providers": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -651,13 +651,13 @@ } }, "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.957.0.tgz", - "integrity": "sha512-x17xMeD7c+rKEsWachGIMifACqkugskrETWz18QDWismFcrmUuOcZu5rUa8s9y1pnITLKUQ1xU/qDLPH52jLlA==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.958.0.tgz", + "integrity": "sha512-dgnvwjMq5Y66WozzUzxNkCFap+umHUtqMMKlr8z/vl9NYMLem/WUbWNpFFOVFWquXikc+ewtpBMR4KEDXfZ+KA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -751,13 +751,13 @@ } }, "node_modules/@aws-sdk/lib-dynamodb": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.957.0.tgz", - "integrity": "sha512-v/GnmDIFfqDQub4tEp/QtsWOMMvSilMbbhCv0l5rPV9sd1NUmCtrH8iBHqVKeEmwSsiCzEKNTakmxSUJszrEww==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/lib-dynamodb/-/lib-dynamodb-3.958.0.tgz", + "integrity": "sha512-ojqEe4ojhk/MINaaEzqFLcZ9abBGP+zwUxTJh9x2mM2Y7Y4Gvqmwvs5aT790pI8yiPKPDkeF/E+DNEmSCUPtlA==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/util-dynamodb": "3.957.0", + "@aws-sdk/util-dynamodb": "3.958.0", "@smithy/core": "^3.20.0", "@smithy/smithy-client": "^4.10.2", "@smithy/types": "^4.11.0", @@ -767,7 +767,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.957.0" + "@aws-sdk/client-dynamodb": "^3.958.0" } }, "node_modules/@aws-sdk/middleware-endpoint-discovery": { @@ -851,9 +851,9 @@ } }, "node_modules/@aws-sdk/nested-clients": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.957.0.tgz", - "integrity": "sha512-PZUFtaUTSZWO+mbgQGWSiwz3EqedsuKNb7Xoxjzh5rfJE352DD4/jScQEhVPxvdLw62IK9b5UDu5kZlxzBs9Ow==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.958.0.tgz", + "integrity": "sha512-/KuCcS8b5TpQXkYOrPLYytrgxBhv81+5pChkOlhegbeHttjM69pyUpQVJqyfDM/A7wPLnDrzCAnk4zaAOkY0Nw==", "license": "Apache-2.0", "dependencies": { "@aws-crypto/sha256-browser": "5.2.0", @@ -973,13 +973,13 @@ } }, "node_modules/@aws-sdk/token-providers": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.957.0.tgz", - "integrity": "sha512-oSwo3BZ6gcvhjTg036V0UQmtENUeNwfCU35iDckX961CdI1alQ3TKRWLzKrwvXCbrOx+bZsuA1PHsTbNhI/+Fw==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.958.0.tgz", + "integrity": "sha512-UCj7lQXODduD1myNJQkV+LYcGYJ9iiMggR8ow8Hva1g3A/Na5imNXzz6O67k7DAee0TYpy+gkNw+SizC6min8Q==", "license": "Apache-2.0", "dependencies": { "@aws-sdk/core": "3.957.0", - "@aws-sdk/nested-clients": "3.957.0", + "@aws-sdk/nested-clients": "3.958.0", "@aws-sdk/types": "3.957.0", "@smithy/property-provider": "^4.2.7", "@smithy/shared-ini-file-loader": "^4.4.2", @@ -1017,9 +1017,9 @@ } }, "node_modules/@aws-sdk/util-dynamodb": { - "version": "3.957.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.957.0.tgz", - "integrity": "sha512-EqFfOkNZt4oJdyxFoP+PxO4JoEnAnTNOiwLKr57F0Hi+Qp5WYPJHdMFtHrzw6j2+atXQIfQUvtk1q6eQbcvMTw==", + "version": "3.958.0", + "resolved": "https://registry.npmjs.org/@aws-sdk/util-dynamodb/-/util-dynamodb-3.958.0.tgz", + "integrity": "sha512-wNGCmCBaj+Om4e93+zkiWv7L+sPGlJuDKHWpndCLdHp3EyHt46KxQpAC5QOMTzbRS0obxl2LqXilX8fbQZxU6A==", "license": "Apache-2.0", "dependencies": { "tslib": "^2.6.2" @@ -1028,7 +1028,7 @@ "node": ">=18.0.0" }, "peerDependencies": { - "@aws-sdk/client-dynamodb": "^3.957.0" + "@aws-sdk/client-dynamodb": "^3.958.0" } }, "node_modules/@aws-sdk/util-endpoints": { @@ -1744,10 +1744,9 @@ } }, "node_modules/@dadosfera/protospack-v2": { - "version": "3.38.0-beta.16", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.16.tgz", - "integrity": "sha512-ijURcmETXdgVgXhIPxapK7w0z6begXm4WDZ6EJtUGg+oYlJd9QOxbwaD7akRzW8XTdccmIo0Vov065KB812J0A==", - "license": "ISC", + "version": "3.38.0-beta.25", + "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com/npm/dadosfera-npm/@dadosfera/protospack-v2/-/protospack-v2-3.38.0-beta.25.tgz", + "integrity": "sha512-OsOl9hJezmtWlVy+2vl3qbWP5yHmLktJ01r5aL475lcfKJtzFPZieUT9ES87C1Emrqe21E6IM/BkJK2rm/aUiA==", "dependencies": { "@grpc/grpc-js": "^1.9.3", "rxjs": "^7.5.5" @@ -3036,6 +3035,22 @@ "node": ">= 0.6" } }, + "node_modules/@nestjs/platform-express/node_modules/http-errors": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", + "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "license": "MIT", + "dependencies": { + "depd": "2.0.0", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/@nestjs/platform-express/node_modules/merge-descriptors": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", @@ -3090,6 +3105,21 @@ "node": ">= 0.6" } }, + "node_modules/@nestjs/platform-express/node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/@nestjs/platform-express/node_modules/safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -5775,9 +5805,9 @@ } }, "node_modules/basic-ftp": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", - "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.1.0.tgz", + "integrity": "sha512-RkaJzeJKDbaDWTIPiJwubyljaEPwpVWkm9Rt5h9Nd6h7tEXTJ3VB4qxdZBioV7JO5yLUaOKwz7vDOzlncUsegw==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -5851,47 +5881,12 @@ "ms": "2.0.0" } }, - "node_modules/body-parser/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/body-parser/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", "license": "MIT" }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/bowser": { "version": "2.13.1", "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.13.1.tgz", @@ -6507,44 +6502,20 @@ "license": "MIT" }, "node_modules/concat-stream": { - "version": "1.6.2", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz", - "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==", + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", + "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", "engines": [ - "node >= 0.8" + "node >= 6.0" ], "license": "MIT", "dependencies": { "buffer-from": "^1.0.0", "inherits": "^2.0.3", - "readable-stream": "^2.2.2", + "readable-stream": "^3.0.2", "typedarray": "^0.0.6" } }, - "node_modules/concat-stream/node_modules/readable-stream": { - "version": "2.3.8", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.8.tgz", - "integrity": "sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.3", - "isarray": "~1.0.0", - "process-nextick-args": "~2.0.0", - "safe-buffer": "~5.1.1", - "string_decoder": "~1.1.1", - "util-deprecate": "~1.0.1" - } - }, - "node_modules/concat-stream/node_modules/string_decoder": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", - "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.1.0" - } - }, "node_modules/consola": { "version": "2.15.3", "resolved": "https://registry.npmjs.org/consola/-/consola-2.15.3.tgz", @@ -7748,6 +7719,13 @@ "url": "https://github.com/sindresorhus/execa?sponsor=1" } }, + "node_modules/execa/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/exit": { "version": "0.1.2", "resolved": "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz", @@ -7817,31 +7795,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express/node_modules/body-parser": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.1.tgz", - "integrity": "sha512-nfDwkulwiZYQIGwxdy0RUmowMhKcFVcYXUU7m4QlKYim1rUtg83xm2yjZ40QjDuc291AJjjeSc9b++AWHSgSHw==", - "license": "MIT", - "peer": true, - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/express/node_modules/cookie-signature": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", @@ -7852,44 +7805,6 @@ "node": ">=6.6.0" } }, - "node_modules/express/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/iconv-lite": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.1.tgz", - "integrity": "sha512-2Tth85cXwGFHfvRgZWszZSvdo+0Xsqmw8k8ZwxScfcBneNUraK+dxRxRm24nszx80Y0TVio8kKLt5sLE7ZCLlw==", - "license": "MIT", - "peer": true, - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/express/node_modules/media-typer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", @@ -7900,38 +7815,6 @@ "node": ">= 0.8" } }, - "node_modules/express/node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "peer": true, - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/express/node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "peer": true, - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, "node_modules/express/node_modules/type-is": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", @@ -8280,18 +8163,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/foreground-child/node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/fork-ts-checker-webpack-plugin": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/fork-ts-checker-webpack-plugin/-/fork-ts-checker-webpack-plugin-8.0.0.tgz", @@ -8605,15 +8476,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/glob/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -8817,28 +8679,23 @@ "license": "MIT" }, "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "license": "MIT", "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" }, "engines": { "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" } }, "node_modules/http-headers": { @@ -9270,12 +9127,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/isarray": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", - "integrity": "sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -10787,6 +10638,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/minipass": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", + "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", + "license": "ISC", + "engines": { + "node": ">=16 || 14 >=14.17" + } + }, "node_modules/mitt": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", @@ -10861,22 +10721,21 @@ } }, "node_modules/multer": { - "version": "1.4.5-lts.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-1.4.5-lts.1.tgz", - "integrity": "sha512-ywPWvcDMeH+z9gQq5qYHCCy+ethsk4goepZ45GLD63fOu0YcNecQxi64nDs3qluZB+murG3/D4dJ7+dGctcCQQ==", - "deprecated": "Multer 1.x is impacted by a number of vulnerabilities, which have been patched in 2.x. You should upgrade to the latest 2.x version.", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", - "busboy": "^1.0.0", - "concat-stream": "^1.5.2", - "mkdirp": "^0.5.4", + "busboy": "^1.6.0", + "concat-stream": "^2.0.0", + "mkdirp": "^0.5.6", "object-assign": "^4.1.1", - "type-is": "^1.6.4", - "xtend": "^4.0.0" + "type-is": "^1.6.18", + "xtend": "^4.0.2" }, "engines": { - "node": ">= 6.0.0" + "node": ">= 10.16.0" } }, "node_modules/mute-stream": { @@ -11637,15 +11496,6 @@ "url": "https://github.com/sponsors/isaacs" } }, - "node_modules/path-scurry/node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, "node_modules/path-to-regexp": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.3.0.tgz", @@ -11837,9 +11687,9 @@ } }, "node_modules/prettier-linter-helpers": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz", - "integrity": "sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/prettier-linter-helpers/-/prettier-linter-helpers-1.0.1.tgz", + "integrity": "sha512-SxToR7P8Y2lWmv/kTzVLC1t/GDI2WGjMwNhLLE9qtH8Q13C+aEmuRlzDst4Up4s0Wc8sF2M+J57iB3cMLqftfg==", "dev": true, "license": "MIT", "dependencies": { @@ -11877,12 +11727,6 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/process-nextick-args": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", - "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", - "license": "MIT" - }, "node_modules/process-warning": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", @@ -12162,12 +12006,12 @@ } }, "node_modules/qs": { - "version": "6.11.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", - "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "version": "6.14.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", + "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", "license": "BSD-3-Clause", "dependencies": { - "side-channel": "^1.0.4" + "side-channel": "^1.1.0" }, "engines": { "node": ">=0.6" @@ -12243,26 +12087,6 @@ "node": ">= 0.8" } }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/react-is": { "version": "17.0.2", "resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz", @@ -12471,6 +12295,12 @@ "node": ">=8" } }, + "node_modules/restore-cursor/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/reusify": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", @@ -12679,27 +12509,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/send/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "peer": true, - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/send/node_modules/ms": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", @@ -12876,10 +12685,16 @@ } }, "node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "license": "ISC" + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } }, "node_modules/sisteransi": { "version": "1.0.5", @@ -14329,6 +14144,7 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz", "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==", + "deprecated": "Use @exodus/bytes instead for a more spec-conformant and faster implementation", "dev": true, "license": "MIT", "dependencies": { @@ -14434,6 +14250,12 @@ "node": ">=8.12.0" } }, + "node_modules/windows-release/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "license": "ISC" + }, "node_modules/winston": { "version": "3.19.0", "resolved": "https://registry.npmjs.org/winston/-/winston-3.19.0.tgz", @@ -14559,6 +14381,13 @@ "typedarray-to-buffer": "^3.1.5" } }, + "node_modules/write-file-atomic/node_modules/signal-exit": { + "version": "3.0.7", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", + "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", + "dev": true, + "license": "ISC" + }, "node_modules/ws": { "version": "7.5.10", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.10.tgz", diff --git a/package.json b/package.json index 8ceeaac..fa47b52 100644 --- a/package.json +++ b/package.json @@ -30,12 +30,12 @@ "@aws-crypto/sha256-js": "^5.2.0", "@aws-sdk/client-dynamodb": "^3.414.0", "@aws-sdk/client-secrets-manager": "^3.414.0", - "@aws-sdk/lib-dynamodb": "^3.414.0", "@aws-sdk/credential-provider-node": "^3.940.0", + "@aws-sdk/lib-dynamodb": "^3.414.0", "@aws-sdk/signature-v4": "^3.370.0", "@dadosfera/dadosfera-logs": "^1.0.0-beta.4", "@dadosfera/protospack": "2.5.3", - "@dadosfera/protospack-v2": "3.38.0-beta.16", + "@dadosfera/protospack-v2": "^3.38.0-beta.25", "@grpc/grpc-js": "^1.9.3", "@grpc/proto-loader": "^0.7.9", "@nestjs/cli": "^9.5.0", @@ -80,7 +80,7 @@ "swagger-ui-express": "^4.6.3" }, "overrides": { - "multer": "1.4.5-lts.1", + "multer": "2.0.2", "form-data": "^4.0.4", "body-parser": "^1.20.3", "cross-spawn": "^7.0.5", diff --git a/src/modules/catalog/catalog.service.ts b/src/modules/catalog/catalog.service.ts index 5929849..89dcf84 100644 --- a/src/modules/catalog/catalog.service.ts +++ b/src/modules/catalog/catalog.service.ts @@ -41,7 +41,6 @@ import { import { TypeParser } from 'src/utils/FileParser/parser-types'; import { ParserBuilder } from 'src/utils/FileParser/parser.builder'; - class CatalogService implements OnModuleInit { catalogReadService: ReadService.CatalogReadServices; catalogWriteService: WriteService.CatalogWriteServices; @@ -58,7 +57,6 @@ class CatalogService implements OnModuleInit { this.logger = dadosferaLogger.logger; } - onModuleInit() { this.catalogReadService = this.grpcClient.getService( @@ -74,81 +72,65 @@ class CatalogService implements OnModuleInit { ); } - _getNimbusUrl(body) { this.logger.debug(`Body: ${JSON.stringify(body)}`); const customer = body.info.customer.toLowerCase(); - if (process.env.ENV === 'prd') { return `https://nimbus-${customer}.dadosfera.ai`; } - return `https://nimbus-${customer}.${process.env.ENV.replace( 'local', 'stg', )}.dadosfera.ai`; } - async getPiiReporter(metadata: Metadata, type: TypeParser) { - this.logger.info('getPiiReporter: ' + type) + this.logger.info('getPiiReporter: ' + type); try { - const { - data - } = await lastValueFrom( - this.catalogWriteService.GetPiiReporter({}, metadata) - ) - this.logger.info("Finish grpc call") - + const { data } = await lastValueFrom( + this.catalogWriteService.GetPiiReporter({}, metadata), + ); + this.logger.info('Finish grpc call'); const parser = ParserBuilder.build(type); - - this.logger.info('parser file to: ' + type) - const file = await parser.parse(data) - this.logger.info('finish parser') + this.logger.info('parser file to: ' + type); + const file = await parser.parse(data); + this.logger.info('finish parser'); const mimeTypes: Record = { - 'csv': 'text/csv', - 'html': 'text/html', - 'pdf': 'application/pdf' - } - + csv: 'text/csv', + html: 'text/html', + pdf: 'application/pdf', + }; const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const filename = `relatorio-pii-${timestamp}.${type}`; - return { file, filename: filename, - type: mimeTypes[type] - } + type: mimeTypes[type], + }; } catch (error) { this.logger.error(error.message); throw error; } - - } - async createDataAsset(data: Messages.CreateDataAssetRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); if (!data.embed) data.embed = undefined; - return lastValueFrom( this.catalogWriteService.CreateDataAsset(data, metadata), ); } - async managePermissions(data: Messages.ManagePermissionRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.ManagePermission(data, metadata), ).catch((err) => { @@ -159,11 +141,9 @@ class CatalogService implements OnModuleInit { }); } - async revokePermissions(data: Messages.RevokePermissionRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.RevokePermission(data, metadata), ).catch((err) => { @@ -174,11 +154,9 @@ class CatalogService implements OnModuleInit { }); } - async commentOnDataAsset(data: Messages.MakeACommentRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.MakeAComment(data, metadata), ).catch((err) => { @@ -189,11 +167,9 @@ class CatalogService implements OnModuleInit { }); } - async deleteComment(data: Messages.UpdateACommentRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.UpdateAComment(data, metadata), ).catch((err) => { @@ -204,11 +180,9 @@ class CatalogService implements OnModuleInit { }); } - async deleteDataAsset(data: Messages.DeleteDataAssetRequest, metadata) { this.logger.info('CatalogService - Manage Data assets permissions'); - return lastValueFrom( this.catalogWriteService.DeleteDataAsset(data, metadata), ).catch((err) => { @@ -219,30 +193,114 @@ class CatalogService implements OnModuleInit { }); } - async getUserRolesIds(userId: string) { const result = await this.userService.findOneById(userId).catch(() => null); - if (result) { return result.user.roles.map((role) => role.id); } - return []; } - async searchDataAssets( query: Record, metadata: Metadata, customer_id: string, ) { - this.logger.info('CatalogService - searchDataAssets'); - + this.logger.info('CatalogService - searchDataAssets', { query }); const { search, page, size, sort_by, order, ...filters } = query; + this.logger.debug('Extracted filters:', { filters }); + + console.log('MAESTRO VAI CHAMAR PI-FACTORY COM (ANTES AJUSTE):', { + search, + page, + size, + sort_by, + order, + filters, + }); + + if ( + filters.manually !== undefined && + filters.manually !== null && + filters.manually !== '' + ) { + filters.manually = Number(filters.manually); // 1 ou 0 + } else { + delete filters.manually; + } + + console.log('MAESTRO VAI CHAMAR PI-FACTORY COM (DEPOIS AJUSTE):', { + search, + page, + size, + sort_by, + order, + filters, + }); + + if (filters.owner) { + const { users: customer_users } = + await this.userService.findAllUsersByCustomerId(customer_id); + + this.logger.info('Available users in database count:', { + count: customer_users.length, + }); + this.logger.info('First 5 users:', { + users: customer_users + .slice(0, 5) + .map((u) => ({ id: u.id, email: u.email, name: u.name })), + }); + + const ownerValues = Array.isArray(filters.owner) + ? filters.owner + : typeof filters.owner === 'string' && filters.owner.includes(',') + ? filters.owner.split(',').map((o: string) => o.trim()) + : [filters.owner]; + + this.logger.info('Owner values to convert:', { + ownerValues, + ownerFiltersOriginal: filters.owner, + }); + + const ownerIds = ownerValues + .map((ownerValue: string) => { + const normalizedOwner = ownerValue.replace(/\s/g, '+'); + const user = customer_users.find((u) => { + const isIdMatch = u.id === ownerValue; + const isEmailMatch = + u.email === ownerValue || u.email === normalizedOwner; + const isNameMatch = + u.name === ownerValue || u.name === normalizedOwner; + this.logger.info('Comparing:', { + userId: u.id, + userEmail: u.email, + userName: u.name, + filterValue: ownerValue, + normalizedFilter: normalizedOwner, + idMatch: isIdMatch, + emailMatch: isEmailMatch, + nameMatch: isNameMatch, + }); + return isIdMatch || isEmailMatch || isNameMatch; + }); + this.logger.info('Looking for owner result:', { + ownerValue, + found: !!user, + userId: user?.id, + }); + return user?.id || ownerValue; + }) + .filter((id: string) => id); + + if (ownerIds.length > 0) { + filters.owner = ownerIds; + } + } + const { data_assets, total } = await lastValueFrom( this.catalogReadService.GetAllDataAssets( { @@ -257,20 +315,18 @@ class CatalogService implements OnModuleInit { ), ); + console.log('MAESTRO RECEBEU RESPOSTA DO PI-FACTORY'); const result = JSON.parse(data_assets); - const response = await this.getAssetsUsersAndRoles( result.data_assets, customer_id, ); - return { data_assets: response, total }; } - async downloadAssets( query: Record, metadata: Metadata, @@ -278,33 +334,27 @@ class CatalogService implements OnModuleInit { ) { const data = await this.searchDataAssets(query, metadata, customer_id); - - const formatData = data.data_assets.map(asset => ({ + const formatData = data.data_assets.map((asset) => ({ id: asset.id, display_name: asset.display_name, data_asset_type: asset.data_asset_type, created_at: asset.created_at, - tags: '[' + asset.tags.join(', ') + ']' - })) - + tags: '[' + asset.tags.join(', ') + ']', + })); const parser = ParserBuilder.build('csv'); - const file = await parser.parse(formatData); - const timestamp = new Date().toISOString().replace(/[:.]/g, '-'); const filename = `dadosfera_assets_${timestamp}.csv`; - return { file, - filename - } + filename, + }; } - async getOneDataAsset(data: { id: string; customer_id: string; @@ -325,11 +375,9 @@ class CatalogService implements OnModuleInit { }; asset = await this.getAssetsUsersAndRoles([asset], customer_id); - return { data_asset: asset[0] }; } - async getOneDataAssetByPipelineAndObject(data: { customer_id: string; pipeline: string; @@ -351,11 +399,9 @@ class CatalogService implements OnModuleInit { }; asset = await this.getAssetsUsersAndRoles([asset], customer_id); - return { data_asset: asset[0] }; } - async updateOneDataAsset(data: { data_asset_id: string; customer_id: string; @@ -364,7 +410,6 @@ class CatalogService implements OnModuleInit { }) { const { body, customer_id, data_asset_id, metadata } = data; - const { data_asset } = await lastValueFrom( this.catalogWriteService.UpdateDataAsset( { id: data_asset_id, changes: JSON.stringify(body) }, @@ -379,7 +424,6 @@ class CatalogService implements OnModuleInit { }; asset = await this.getAssetsUsersAndRoles([asset], customer_id); - return { data_asset: asset[0] }; } @@ -387,12 +431,11 @@ class CatalogService implements OnModuleInit { const { documentation } = await lastValueFrom( this.catalogReadService.GetDatasetDoc({ id }, metadata), ); - + const docs = JSON.parse(documentation); return docs; } - async getDatasetPreview(id: string, metadata: Metadata) { const { preview } = await lastValueFrom( this.catalogReadService.GetDatasetPreview( @@ -404,7 +447,6 @@ class CatalogService implements OnModuleInit { return result; } - async getDatasetColumnsMetadata(id: string, metadata: Metadata) { const { columns_metadata } = await lastValueFrom( this.catalogReadService.GetDatasetColumnsMetadata( @@ -420,7 +462,7 @@ class CatalogService implements OnModuleInit { if (body.asset_type === 'table' || body.asset_type === 'view') { return this.createDataDocsViaNimbus(body); } - + return this.createDataDocsViaGrpc(body, metadata); } @@ -434,7 +476,6 @@ class CatalogService implements OnModuleInit { return data; } - private async createDataDocsViaGrpc(body: CreateDataDocsDTO, metadata: Metadata) { this.logger.info('Creating data docs via gRPC for other asset types'); try { @@ -447,9 +488,8 @@ class CatalogService implements OnModuleInit { metadata, ), ); - + return response; - } catch (error) { this.logger.error('Error creating data asset docs:', error); throw new HttpException( @@ -462,7 +502,6 @@ class CatalogService implements OnModuleInit { async findAllTags(data, metadata) { this.logger.info('CatalogService - findAllCustomerTags'); - const response = await lastValueFrom( this.catalogReadService.GetCustomerTags(data, metadata), ) @@ -475,9 +514,9 @@ class CatalogService implements OnModuleInit { throw new Error(err); }); - return response; } + async getAssetsUsersAndRoles(data_assets: Array, customer_id: string) { const { users: customer_users } = await this.userService.findAllUsersByCustomerId(customer_id); @@ -490,17 +529,15 @@ class CatalogService implements OnModuleInit { (u) => u.id === data_asset.owner, )?.email; - const roles = []; const users = []; - const data_asset_roles = data_asset?.roles || [] + const data_asset_roles = data_asset?.roles || []; for (const role_id of data_asset_roles) { const role = customer_roles.find((r) => r.id === role_id); if (role) roles.push({ id: role.id, name: role.name }); } - - const data_asset_users = data_asset?.users || [] + const data_asset_users = data_asset?.users || []; for (const user_id of data_asset_users) { const user = customer_users.find((r) => r.id === user_id); if (user) users.push({ id: user.id, email: user.email }); @@ -514,7 +551,6 @@ class CatalogService implements OnModuleInit { }); } - async triggerCatalog(data: TriggerCatalogReq, metadata: Metadata) { const { session } = await lastValueFrom( this.catalogWriteService.TriggerDatasetCataloging(data, metadata), @@ -528,7 +564,6 @@ class CatalogService implements OnModuleInit { return res; } - async addRlsRule(data: AddRlsRuleRequest, metadata: Metadata) { const res = await lastValueFrom( this.catalogWriteService.AddRlsRule(data, metadata), @@ -536,7 +571,6 @@ class CatalogService implements OnModuleInit { return res; } - async removeRlsRule(id: number, metadata: Metadata) { const res = await lastValueFrom( this.catalogWriteService.RemoveRlsRule({ id }, metadata), @@ -544,14 +578,12 @@ class CatalogService implements OnModuleInit { return res; } - async batchRemoveRlsRule( query: BatchRemoveRlsRulesRequest, metadata: Metadata, ) { const { id_rls, nimbus_dashboard_id } = query; - if (id_rls && nimbus_dashboard_id) { throw new BadRequestException( "You can't delete using both parameters. Choose either 'id_rls' or 'nimbus_dashboard_id'", @@ -572,7 +604,6 @@ class CatalogService implements OnModuleInit { return 'OK'; } - async getRlsRules(data: GetRlsRulesRequest, metadata: Metadata) { const res = await lastValueFrom( this.catalogReadService.GetRlsRules(data, metadata), @@ -580,7 +611,6 @@ class CatalogService implements OnModuleInit { return res.rls_rules; } - async getOneRlsRule(id: number, metadata: Metadata) { const res = await lastValueFrom( this.catalogReadService.GetOneRlsRule({ id }, metadata), @@ -588,7 +618,6 @@ class CatalogService implements OnModuleInit { return res.rls_rule; } - async getNimbusDashboards( data: GetNimbusDashboardsRequest, metadata: Metadata, @@ -599,88 +628,99 @@ class CatalogService implements OnModuleInit { return res.dashboards; } - async createTableMetadata(body: any): Promise { const nimbusUrl = this._getNimbusUrl(body); - this.logger.info(`Nimbus URL: ${nimbusUrl}`, {...body.logMetadata}); - + this.logger.info(`Nimbus URL: ${nimbusUrl}`, { ...body.logMetadata }); const endpoint = `${nimbusUrl}/api/catalog/table-metadata/`; - - this.logger.info(`Creating table metadata for table ${body.table_metadata.table_name}`, {...body.logMetadata}); - this.logger.info(`Using endpoint: ${endpoint}`, {...body.logMetadata}); - this.logger.debug(`Payload: ${JSON.stringify(body.table_metadata)}`, {...body.logMetadata}); - + this.logger.info( + `Creating table metadata for table ${body.table_metadata.table_name}`, + { ...body.logMetadata }, + ); + this.logger.info(`Using endpoint: ${endpoint}`, { ...body.logMetadata }); + this.logger.debug(`Payload: ${JSON.stringify(body.table_metadata)}`, { + ...body.logMetadata, + }); try { - const { data, status } = await axios.post(endpoint, {...body.table_metadata}); - + const { data, status } = await axios.post(endpoint, { + ...body.table_metadata, + }); this.logger.info( `Table metadata created successfully with status ${status} for table ${body.table_metadata.table_name}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); return data.id; } catch (error) { this.logger.error( `Failed to create table metadata for table ${body.table_metadata.table_name} failed with status ${ error.response?.status - } because of ${JSON.stringify(error.response?.data) || error.message}`, {...body.logMetadata}); + } because of ${JSON.stringify(error.response?.data) || error.message}`, + { ...body.logMetadata }, + ); throw new Error(error.response?.data?.message || error.message); } } - async createColumnMetadata(body: any): Promise { const nimbusUrl = this._getNimbusUrl(body); this.logger.info(`Nimbus URL: ${nimbusUrl}`, body.logMetadata); const endpoint = `${nimbusUrl}/api/catalog/column-metadata/`; - - - - try { - this.logger.info(`Creating column metadata for table ${body.column_metadata.table_name}`, {...body.logMetadata}); - this.logger.info(`Using endpoint: ${endpoint}`, {...body.logMetadata}); - this.logger.debug(`Payload: ${JSON.stringify(body.column_metadata)}`, {...body.logMetadata}); - const { data, status } = await axios.post(endpoint, body.column_metadata); - + this.logger.info( + `Creating column metadata for table ${body.column_metadata.table_name}`, + { ...body.logMetadata }, + ); + this.logger.info(`Using endpoint: ${endpoint}`, { ...body.logMetadata }); + this.logger.debug( + `Payload: ${JSON.stringify(body.column_metadata)}`, + { ...body.logMetadata }, + ); + const { data, status } = await axios.post( + endpoint, + body.column_metadata, + ); this.logger.info( `Column metadata created successfully with status ${status} for table ${body.column_metadata.table_name}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); return data.map((column) => column.id); } catch (error) { this.logger.error( `Failed to create column metadata failed with status for table ${body.column_metadata.table_name} ${ error.response?.status - } because of ${error.response?.data || error.message}`, {...body.logMetadata}); + } because of ${error.response?.data || error.message}`, + { ...body.logMetadata }, + ); throw new Error(error.response?.data?.message || error.message); } } - async createDataPreview(body: any): Promise { const nimbusUrl = this._getNimbusUrl(body); - this.logger.info(`Nimbus URL: ${nimbusUrl}`, {...body.logMetadata}); + this.logger.info(`Nimbus URL: ${nimbusUrl}`, { ...body.logMetadata }); const endpoint = `${nimbusUrl}/api/catalog/data-preview/`; - - this.logger.info(`Creating data preview for table ${body.data_preview.table_name}`, {...body.logMetadata}); - this.logger.info(`Using endpoint: ${endpoint}`, {...body.logMetadata}); - this.logger.debug(`Payload: ${JSON.stringify(body.data_preview)}`, {...body.logMetadata}); - + this.logger.info( + `Creating data preview for table ${body.data_preview.table_name}`, + { ...body.logMetadata }, + ); + this.logger.info(`Using endpoint: ${endpoint}`, { ...body.logMetadata }); + this.logger.debug( + `Payload: ${JSON.stringify(body.data_preview)}`, + { ...body.logMetadata }, + ); try { const { data, status } = await axios.post(endpoint, body.data_preview); - this.logger.info( `Data preview created successfully with status ${status} for table ${body.data_preview.table_name}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); return data.id; } catch (error) { @@ -688,17 +728,15 @@ class CatalogService implements OnModuleInit { `Failed to create data preview for table ${body.data_preview.table_name} failed with status ${ error.response?.status } because of ${error.response?.data || error.message}`, - {...body.logMetadata}, + { ...body.logMetadata }, ); throw new Error(error.response?.data?.message || error.message); } } - async catalogDatasetItem(table_metadata_id: number, metadata: Metadata) { const customer_name_raw = metadata.get('customer_name'); - const customer_name = customer_name_raw?.[0]?.toString(); if (!customer_name) { throw new BadRequestException('Customer name not found in metadata'); @@ -721,5 +759,4 @@ class CatalogService implements OnModuleInit { } } - export { CatalogService }; diff --git a/src/modules/catalog/dtos/index.ts b/src/modules/catalog/dtos/index.ts index d8e3c2d..f35e6e0 100644 --- a/src/modules/catalog/dtos/index.ts +++ b/src/modules/catalog/dtos/index.ts @@ -98,6 +98,8 @@ export class IDataAsset { embed?: EmbedObject; @ApiPropertyOptional({ enum: DataAssetShareType }) share_type?: DataAssetShareType; + @ApiPropertyOptional() + docs?: string; } export class IOneDataAsset { @@ -200,6 +202,8 @@ export class IUpdateDataRequest { embed: EmbedObject; @ApiPropertyOptional({ enum: DataAssetShareType }) share_type?: DataAssetShareType; + @ApiPropertyOptional() + docs?: string; } export class ICreateDataAsset implements CreateDataAssetRequest { @ApiProperty() @@ -214,6 +218,8 @@ export class ICreateDataAsset implements CreateDataAssetRequest { location: string; @ApiPropertyOptional() embed: EmbedObject; + @ApiPropertyOptional() + docs: string; } export class IPreview { diff --git a/src/modules/customers/customers.controller.ts b/src/modules/customers/customers.controller.ts index 2606ebd..8ac5b3b 100644 --- a/src/modules/customers/customers.controller.ts +++ b/src/modules/customers/customers.controller.ts @@ -136,4 +136,32 @@ export class CustomersController { const result = await this.customersService.getAccessDashboardUrl(user.customer_name, metadata); return result; } + + @Get(':id/organization-info') + @Authenticated() + @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) + @ApiOkResponse({ description: 'Organization information' }) + async getOrganizationInfo(@Param('id') id: string) { + this.logger.info('getOrganizationInfo', { id }); + return this.customersService.getOrganizationInfo(id); + } + + @Put(':id/organization-info') + @Authenticated() + @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) + @HttpCode(HttpStatus.OK) + @ApiOkResponse({ description: 'Organization information updated' }) + async updateOrganizationInfo( + @Param('id') id: string, + @Body() body: { + companyName: string; + companySite: string; + domain: string; + cnpj: string; + description: string; + }, + ) { + return this.customersService.updateOrganizationInfo(id, body); + } + } diff --git a/src/modules/customers/customers.service.ts b/src/modules/customers/customers.service.ts index 8b28171..602943b 100644 --- a/src/modules/customers/customers.service.ts +++ b/src/modules/customers/customers.service.ts @@ -223,4 +223,57 @@ export class CustomersService implements OnModuleInit { }) ) } -} + + async updateOrganizationInfo( + customerId: string, + data: { + companyName: string; + companySite: string; + domain: string; + cnpj: string; + description: string; + }, + ) { + try { + const result = await lastValueFrom( + this.customerService.OrganizationUpdate({ + customerId, + companyName: data.companyName || '', + companySite: data.companySite || '', + domain: data.domain || '', + cnpj: data.cnpj || '', + description: data.description || '', + }), + ); + + return result; + } catch (err) { + if (err.details === ErrorCodes.CUSTOMER.NOT_FOUND) + throw new HttpException(err.details, HttpStatus.NOT_FOUND); + else throw err; + } + } + + async getOrganizationInfo(customerId: string) { + try { + const customerResponse = await lastValueFrom( + this.customerService.CustomerFindOneById({ id: customerId }) + ); + + const customer = customerResponse.customer; + + return { + companyName: customer.companyName || '', + companySite: customer.companySite || '', + domain: customer.domain || '', + cnpj: customer.cnpj || '', + description: customer.description || '' + }; + } catch (err) { + if (err.details === ErrorCodes.CUSTOMER.NOT_FOUND) + throw new HttpException(err.details, HttpStatus.NOT_FOUND); + else throw err; + } + } + +} \ No newline at end of file diff --git a/src/modules/customers/dtos/organization.ts b/src/modules/customers/dtos/organization.ts new file mode 100644 index 0000000..50c3df7 --- /dev/null +++ b/src/modules/customers/dtos/organization.ts @@ -0,0 +1,27 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; + +export class OrganizationUpdateRequest { + @ApiProperty() + name: string; + @ApiPropertyOptional() + companySite: string; + @ApiProperty() + domain: string; + @ApiPropertyOptional() + info: string; + @ApiPropertyOptional() + cnpj: string; +} + +export class OrganizationResponse { + @ApiProperty() + name: string; + @ApiPropertyOptional() + companySite: string; + @ApiProperty() + domain: string; + @ApiPropertyOptional() + info: string; + @ApiPropertyOptional() + cnpj: string; +} \ No newline at end of file diff --git a/src/modules/roles/roles.service.ts b/src/modules/roles/roles.service.ts index bd41ca5..d0045e5 100644 --- a/src/modules/roles/roles.service.ts +++ b/src/modules/roles/roles.service.ts @@ -229,27 +229,33 @@ export class RolesService { const [roleTreated] = this.getRolesPermissionsName([role.role]); return { role: roleTreated }; } + getRolesPermissionsName(roles: GetRolesPermissionsName[]): RoleDto[] { const newRoles: RoleDto[] = []; for (const role of roles) { - const allPermissions = this.permissionsService.getAllPermissions( - this.language, - ); - const newPermissions = role.permissions.map((p) => { - const permission = allPermissions.find((per) => per.seqid === p.seqid); - return { - ...p, - name: permission.name, - id: p.seqid, - }; - }); - const newRole: RoleDto = { - ...role, - permissions: newPermissions, - isPublic: role.isPublic, - }; + const newRole: RoleDto = this.formatRole(role); newRoles.push(newRole); } return newRoles; } + + private formatRole(role: GetRolesPermissionsName): RoleDto { + const allPermissions = this.permissionsService.getAllPermissions( + this.language + ); + const newPermissions = role.permissions.map((p) => { + const permission = allPermissions.find((per) => per.seqid === p.seqid); + return { + ...p, + name: permission.name, + id: p.seqid, + }; + }); + + return { + ...role, + permissions: newPermissions, + isPublic: role.isPublic, + };; + } } diff --git a/src/modules/users/dtos/entities.ts b/src/modules/users/dtos/entities.ts index 8e8b852..ab5e43c 100644 --- a/src/modules/users/dtos/entities.ts +++ b/src/modules/users/dtos/entities.ts @@ -38,6 +38,12 @@ export class User { department?: string; @ApiProperty() hierarchy?: string; + @ApiProperty() + bio?: string; + @ApiProperty() + companyName?: string; + @ApiProperty() + personalSite?: string; @ApiPropertyOptional() customer?: Customer; @ApiProperty() @@ -109,6 +115,12 @@ export class UpdateUserReq { @ApiPropertyOptional() hierarchy?: string; @ApiPropertyOptional() + bio?: string; + @ApiPropertyOptional() + personalSite?: string; + @ApiPropertyOptional() + companyName?: string; + @ApiPropertyOptional() roleNames?: string[]; } diff --git a/src/modules/users/users.controller.ts b/src/modules/users/users.controller.ts index e565f18..71ba19c 100644 --- a/src/modules/users/users.controller.ts +++ b/src/modules/users/users.controller.ts @@ -266,7 +266,6 @@ export class UsersController { } @Patch(':id') - @RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN) @ApiOkResponse({ type: UpdateUserRes }) async updateUser( @User() user: RequestUser, @@ -274,6 +273,18 @@ export class UsersController { @Param('id') id: string, @Language() language: LanguageEnum, ) { + + const isSameUser = user.user_id === id; + const isSuperAdmin = user.permissions.includes(PERMISSIONS_GROUPS.USERS.permissions.ADMIN.seqid) + if (!isSameUser && !isSuperAdmin) { + throw new ErrorBuilder(ErrorCodes.AUTH.FORBIDDEN); + } + + if (isSameUser && !isSuperAdmin && body.roleNames) { + // Prevent users from updating their own roles + delete body.roleNames; + } + this.logger.info('updateUser', { user }); this.userService.setLanguage(language); return await this.userService.updateUser(body, id, user.customer_id); diff --git a/src/modules/users/users.service.ts b/src/modules/users/users.service.ts index 3057010..d402ff1 100644 --- a/src/modules/users/users.service.ts +++ b/src/modules/users/users.service.ts @@ -148,20 +148,23 @@ export class UsersService implements OnModuleInit { } async updateUser(req: UpdateUserReq, id: string, customerId: string) { - const { department, hierarchy, jobTitle, name, roleNames, email } = req; - if (roleNames) { + const { roleNames, ...updateUserDTO } = req; + if (roleNames && roleNames.length > 0) { await this.setRoles({ roleNames, userId: id }, customerId); } const { user } = await lastValueFrom( this.usersClientService.UserUpdate({ - name, + department: updateUserDTO.department, + email: updateUserDTO.email, + hierarchy: updateUserDTO.hierarchy, + jobTitle: updateUserDTO.jobTitle, + name: updateUserDTO.name, + bio: updateUserDTO.bio, + companyName: updateUserDTO.companyName, + personalSite: updateUserDTO.personalSite, customerId, id, - department, - hierarchy, - jobTitle, - email, metabaseUserId: undefined, }), );