diff --git a/package-lock.json b/package-lock.json index 8e2c785..2373222 100644 --- a/package-lock.json +++ b/package-lock.json @@ -29,7 +29,6 @@ "helmet": "^5.1.0", "jsonwebtoken": "^8.5.1", "jwk-to-pem": "^2.0.5", - "nestjs-i18n": "^9.1.3", "passport": "^0.6.0", "passport-facebook": "^3.0.0", "passport-forcedotcom": "^0.1.5", @@ -3468,11 +3467,6 @@ "dev": true, "license": "BSD-3-Clause" }, - "node_modules/accept-language-parser": { - "version": "1.5.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/accept-language-parser/-/accept-language-parser-1.5.0.tgz", - "integrity": "sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==" - }, "node_modules/accepts": { "version": "1.3.8", "license": "MIT", @@ -3663,6 +3657,7 @@ }, "node_modules/anymatch": { "version": "3.1.2", + "dev": true, "license": "ISC", "dependencies": { "normalize-path": "^3.0.0", @@ -3683,6 +3678,7 @@ }, "node_modules/argparse": { "version": "2.0.1", + "dev": true, "license": "Python-2.0" }, "node_modules/array-flatten": { @@ -3924,6 +3920,7 @@ }, "node_modules/binary-extensions": { "version": "2.2.0", + "dev": true, "license": "MIT", "engines": { "node": ">=8" @@ -4009,6 +4006,7 @@ }, "node_modules/braces": { "version": "3.0.2", + "dev": true, "license": "MIT", "dependencies": { "fill-range": "^7.0.1" @@ -4197,6 +4195,7 @@ }, "node_modules/chokidar": { "version": "3.5.3", + "dev": true, "funding": [ { "type": "individual", @@ -4242,6 +4241,7 @@ "version": "0.13.2", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/class-validator/-/class-validator-0.13.2.tgz", "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "optional": true, "peer": true, "dependencies": { "libphonenumber-js": "^1.9.43", @@ -5718,6 +5718,7 @@ }, "node_modules/fill-range": { "version": "7.0.1", + "dev": true, "license": "MIT", "dependencies": { "to-regex-range": "^5.0.1" @@ -6051,6 +6052,7 @@ }, "node_modules/glob-parent": { "version": "5.1.2", + "dev": true, "license": "ISC", "dependencies": { "is-glob": "^4.0.1" @@ -6464,6 +6466,7 @@ }, "node_modules/is-binary-path": { "version": "2.1.0", + "dev": true, "license": "MIT", "dependencies": { "binary-extensions": "^2.0.0" @@ -6524,6 +6527,7 @@ }, "node_modules/is-extglob": { "version": "2.1.1", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -6557,6 +6561,7 @@ }, "node_modules/is-glob": { "version": "4.0.3", + "dev": true, "license": "MIT", "dependencies": { "is-extglob": "^2.1.1" @@ -6608,6 +6613,7 @@ }, "node_modules/is-number": { "version": "7.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=0.12.0" @@ -7630,6 +7636,7 @@ }, "node_modules/js-yaml": { "version": "4.1.0", + "dev": true, "license": "MIT", "dependencies": { "argparse": "^2.0.1" @@ -7831,6 +7838,7 @@ "version": "1.10.7", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/libphonenumber-js/-/libphonenumber-js-1.10.7.tgz", "integrity": "sha512-jZXLCCWMe1b/HXkjiLeYt2JsytZMcqH26jLFIdzFDFF0xvSUWrYKyvPlyPG+XJzEyKUFbcZxLdWGMwQsWaHDxQ==", + "optional": true, "peer": true }, "node_modules/lines-and-columns": { @@ -8249,33 +8257,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nestjs-i18n": { - "version": "9.1.3", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/nestjs-i18n/-/nestjs-i18n-9.1.3.tgz", - "integrity": "sha512-55hLPenqoHq7sNybxjHoe6Q+RjeZelmaCnCx/niT28GvCLPUteNO4jOe/4AWvLvLrnW0cj7l0sHHzgXlPTilfg==", - "dependencies": { - "accept-language-parser": "^1.5.0", - "chokidar": "^3.5.3", - "cookie": "^0.4.1", - "iterare": "^1.2.1", - "js-yaml": "^4.1.0", - "string-format": "^2.0.0" - }, - "peerDependencies": { - "@nestjs/common": "*", - "@nestjs/core": "*", - "class-validator": "~0.13", - "rxjs": "*" - } - }, - "node_modules/nestjs-i18n/node_modules/cookie": { - "version": "0.4.2", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/next-line": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-line/-/next-line-1.1.0.tgz", @@ -8350,6 +8331,7 @@ }, "node_modules/normalize-path": { "version": "3.0.0", + "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -8848,6 +8830,7 @@ }, "node_modules/picomatch": { "version": "2.3.1", + "dev": true, "license": "MIT", "engines": { "node": ">=8.6" @@ -9167,6 +9150,7 @@ }, "node_modules/readdirp": { "version": "3.6.0", + "dev": true, "license": "MIT", "dependencies": { "picomatch": "^2.2.1" @@ -9750,11 +9734,6 @@ "version": "5.1.2", "license": "MIT" }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" - }, "node_modules/string-length": { "version": "4.0.2", "dev": true, @@ -10126,6 +10105,7 @@ }, "node_modules/to-regex-range": { "version": "5.0.1", + "dev": true, "license": "MIT", "dependencies": { "is-number": "^7.0.0" @@ -10612,6 +10592,7 @@ "version": "13.7.0", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/validator/-/validator-13.7.0.tgz", "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "optional": true, "peer": true, "engines": { "node": ">= 0.10" @@ -13505,11 +13486,6 @@ "version": "2.0.6", "dev": true }, - "accept-language-parser": { - "version": "1.5.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/accept-language-parser/-/accept-language-parser-1.5.0.tgz", - "integrity": "sha512-QhyTbMLYo0BBGg1aWbeMG4ekWtds/31BrEU+DONOg/7ax23vxpL03Pb7/zBmha2v7vdD3AyzZVWBVGEZxKOXWw==" - }, "accepts": { "version": "1.3.8", "requires": { @@ -13625,6 +13601,7 @@ }, "anymatch": { "version": "3.1.2", + "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -13638,7 +13615,8 @@ "dev": true }, "argparse": { - "version": "2.0.1" + "version": "2.0.1", + "dev": true }, "array-flatten": { "version": "1.1.1" @@ -13817,7 +13795,8 @@ } }, "binary-extensions": { - "version": "2.2.0" + "version": "2.2.0", + "dev": true }, "binary-search": { "version": "1.3.6", @@ -13889,6 +13868,7 @@ }, "braces": { "version": "3.0.2", + "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -13993,6 +13973,7 @@ }, "chokidar": { "version": "3.5.3", + "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -14020,6 +14001,7 @@ "version": "0.13.2", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/class-validator/-/class-validator-0.13.2.tgz", "integrity": "sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==", + "optional": true, "peer": true, "requires": { "libphonenumber-js": "^1.9.43", @@ -15067,6 +15049,7 @@ }, "fill-range": { "version": "7.0.1", + "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -15274,6 +15257,7 @@ }, "glob-parent": { "version": "5.1.2", + "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -15535,6 +15519,7 @@ }, "is-binary-path": { "version": "2.1.0", + "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -15568,7 +15553,8 @@ } }, "is-extglob": { - "version": "2.1.1" + "version": "2.1.1", + "dev": true }, "is-finite": { "version": "1.1.0", @@ -15584,6 +15570,7 @@ }, "is-glob": { "version": "4.0.3", + "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -15620,7 +15607,8 @@ "integrity": "sha512-m2Rm8PhUFDNNhgvwZJjJG74a9h5CHU0fkA8WT+WGlCjyEbZ2jPwgb+ZxHu4np284EqNVyOsgppReK4qy/TwEwg==" }, "is-number": { - "version": "7.0.0" + "version": "7.0.0", + "dev": true }, "is-number-object": { "version": "1.0.7", @@ -16320,6 +16308,7 @@ }, "js-yaml": { "version": "4.1.0", + "dev": true, "requires": { "argparse": "^2.0.1" } @@ -16461,6 +16450,7 @@ "version": "1.10.7", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/libphonenumber-js/-/libphonenumber-js-1.10.7.tgz", "integrity": "sha512-jZXLCCWMe1b/HXkjiLeYt2JsytZMcqH26jLFIdzFDFF0xvSUWrYKyvPlyPG+XJzEyKUFbcZxLdWGMwQsWaHDxQ==", + "optional": true, "peer": true }, "lines-and-columns": { @@ -16744,26 +16734,6 @@ "version": "2.6.2", "dev": true }, - "nestjs-i18n": { - "version": "9.1.3", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/nestjs-i18n/-/nestjs-i18n-9.1.3.tgz", - "integrity": "sha512-55hLPenqoHq7sNybxjHoe6Q+RjeZelmaCnCx/niT28GvCLPUteNO4jOe/4AWvLvLrnW0cj7l0sHHzgXlPTilfg==", - "requires": { - "accept-language-parser": "^1.5.0", - "chokidar": "^3.5.3", - "cookie": "^0.4.1", - "iterare": "^1.2.1", - "js-yaml": "^4.1.0", - "string-format": "^2.0.0" - }, - "dependencies": { - "cookie": { - "version": "0.4.2", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/cookie/-/cookie-0.4.2.tgz", - "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" - } - } - }, "next-line": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/next-line/-/next-line-1.1.0.tgz", @@ -16818,7 +16788,8 @@ "dev": true }, "normalize-path": { - "version": "3.0.0" + "version": "3.0.0", + "dev": true }, "npm-run-path": { "version": "4.0.1", @@ -17153,7 +17124,8 @@ "dev": true }, "picomatch": { - "version": "2.3.1" + "version": "2.3.1", + "dev": true }, "pino": { "version": "6.14.0", @@ -17366,6 +17338,7 @@ }, "readdirp": { "version": "3.6.0", + "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -17762,11 +17735,6 @@ } } }, - "string-format": { - "version": "2.0.0", - "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" - }, "string-length": { "version": "4.0.2", "dev": true, @@ -18001,6 +17969,7 @@ }, "to-regex-range": { "version": "5.0.1", + "dev": true, "requires": { "is-number": "^7.0.0" } @@ -18322,6 +18291,7 @@ "version": "13.7.0", "resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/validator/-/validator-13.7.0.tgz", "integrity": "sha512-nYXQLCBkpJ8X6ltALua9dRrZDHVYxjJ1wgskNt1lH9fzGjs3tgojGSCBjmEPwkWS1y29+DrizMTW19Pr9uB2nw==", + "optional": true, "peer": true }, "vary": { diff --git a/package.json b/package.json index 4b3c251..c3e5c80 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,6 @@ "helmet": "^5.1.0", "jsonwebtoken": "^8.5.1", "jwk-to-pem": "^2.0.5", - "nestjs-i18n": "^9.1.3", "passport": "^0.6.0", "passport-facebook": "^3.0.0", "passport-forcedotcom": "^0.1.5", diff --git a/src/authentication/authentication.guard.spec.ts b/src/authentication/authentication.guard.spec.ts index 5400831..a2b9ac3 100644 --- a/src/authentication/authentication.guard.spec.ts +++ b/src/authentication/authentication.guard.spec.ts @@ -13,7 +13,7 @@ import { RequireSomePermission, } from './authentication.decorator'; import { AuthenticationGuard } from './authentication.guard'; -import { Permissions } from './permissions.enum'; +import { PERMISSIONS } from './permissions.enum'; import { AuthClientService } from '../modules/auth/auth.service'; import ErrorCodes from '../utils/errorCodes'; @@ -32,19 +32,19 @@ class NoClassAuthController { } @Get('required-permission') - @RequireSomePermission(Permissions.ZENDESK.OPEN) + @RequireSomePermission(PERMISSIONS.ZENDESK.OPEN) async requiredPermission(@Body() body) { return { body }; } @Get('has-all-permissions') - @RequireAllPermissions(Permissions.ZENDESK.OPEN, Permissions.METABASE.OPEN) + @RequireAllPermissions(PERMISSIONS.ZENDESK.OPEN, PERMISSIONS.METABASE.OPEN) async hasAllPermissions(@Body() body) { return { body }; } @Get('has-some-permission') - @RequireSomePermission(Permissions.ZENDESK.OPEN, Permissions.METABASE.OPEN) + @RequireSomePermission(PERMISSIONS.ZENDESK.OPEN, PERMISSIONS.METABASE.OPEN) async hasSomePermission(@Body() body) { return { body }; } @@ -52,7 +52,7 @@ class NoClassAuthController { @Controller('class-auth-condition') @AuthenticateCondition((req) => req.get('x-on-class') === 'ok') -@RequireSomePermission(Permissions.METABASE.OPEN) +@RequireSomePermission(PERMISSIONS.METABASE.OPEN) class ClassAuthConditionController { @Get('body') async getBody(@Body() body) { @@ -67,7 +67,7 @@ class ClassAuthConditionController { @Get('required-permission') @AuthenticateCondition((req) => req.get('x-on-route') === 'ok') - @RequireSomePermission(Permissions.ZENDESK.OPEN) + @RequireSomePermission(PERMISSIONS.ZENDESK.OPEN) async requiredPermission(@Body() body) { return { body }; } @@ -430,17 +430,17 @@ describe('authentication.guard', () => { NoClassAuthTest(null, null); ClassAuthConditionTest(null, null); - const tokenZ = CreateToken([Permissions.ZENDESK.OPEN]); + const tokenZ = CreateToken([PERMISSIONS.ZENDESK.OPEN]); NoClassAuthTest(tokenZ, ['zendesk']); ClassAuthConditionTest(tokenZ, ['zendesk']); - const tokenM = CreateToken([Permissions.METABASE.OPEN]); + const tokenM = CreateToken([PERMISSIONS.METABASE.OPEN]); NoClassAuthTest(tokenM, ['metabase']); ClassAuthConditionTest(tokenM, ['metabase']); const tokenZM = CreateToken([ - Permissions.ZENDESK.OPEN, - Permissions.METABASE.OPEN, + PERMISSIONS.ZENDESK.OPEN, + PERMISSIONS.METABASE.OPEN, ]); NoClassAuthTest(tokenZM, ['zendesk', 'metabase']); ClassAuthConditionTest(tokenZM, ['zendesk', 'metabase']); diff --git a/src/authentication/permissions.enum.ts b/src/authentication/permissions.enum.ts index 0dc0b2a..4589d3a 100644 --- a/src/authentication/permissions.enum.ts +++ b/src/authentication/permissions.enum.ts @@ -12,7 +12,17 @@ export interface Permission { seqid: number; claim: string; usage: PermissionUsages; - name?: string; + name?: { + 'pt-br': string; + 'en-us': string; + }; +} +export interface PermissionGroup { + title: { + 'pt-br': string; + 'en-us': string; + }; + permissions: Record; } /* @@ -23,224 +33,406 @@ export interface Permission { /*export const Permissions: { [P in keyof any]: { [Q in keyof any]: Permission }; } = {*/ -export const Permissions: Record> = { +export const PERMISSIONS = { AUTH: { - CREATE: { - seqid: 18, - claim: 'POST /auth', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Autenticação', + 'en-us': 'Authentication', + }, + permissions: { + CREATE: { + seqid: 18, + claim: 'POST /auth', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': '', + 'en-us': '', + }, + }, }, }, PIPELINE: { - CREATE: { - seqid: 23, - claim: 'pipeline:create', - usage: PermissionUsages.PUBLIC, - name: 'PERMISSIONS.NAMES.PIPELINE_CREATE', + title: { + 'pt-br': 'Pipelines', + 'en-us': 'Pipelines', }, - GET: { - seqid: 13, - claim: 'pipeline:get', - usage: PermissionUsages.PUBLIC, - name: 'PERMISSIONS.NAMES.PIPELINE_GET', - }, - UPDATE: { - seqid: 29, - claim: 'pipeline:update', - usage: PermissionUsages.PUBLIC, - name: 'PERMISSIONS.NAMES.PIPELINE_PUT', - }, - DELETE: { - seqid: 5, - claim: 'pipeline:delete', - usage: PermissionUsages.PUBLIC, - name: 'PERMISSIONS.NAMES.PIPELINE_DELETE', + permissions: { + CREATE: { + seqid: 23, + claim: 'POST /pipelines', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Criar pipelines', + 'en-us': 'Create pipelines', + }, + }, + GET: { + seqid: 13, + claim: 'GET /pipelines', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Buscar pipelines', + 'en-us': 'Get pipelines', + }, + }, + UPDATE: { + seqid: 29, + claim: 'PUT /pipelines', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Atualizar pipeline', + 'en-us': 'Update pipeline', + }, + }, + DELETE: { + seqid: 5, + claim: 'DELETE /pipelines', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Remover pipeline', + 'en-us': 'Delete pipeline', + }, + }, }, }, INPUT: { - CREATE: { - seqid: 21, - claim: 'POST /inputs', - usage: PermissionUsages.PUBLIC, - name: 'Criar conexões', + title: { + 'pt-br': 'Conexões', + 'en-us': 'Connections', }, - GET: { - seqid: 9, - claim: 'GET /inputs', - usage: PermissionUsages.PUBLIC, - name: 'Buscar conexões', - }, - UPDATE: { - seqid: 27, - claim: 'PUT /inputs', - usage: PermissionUsages.PUBLIC, - name: 'Atualizar conexões', - }, - UPDATE_PARTIAL: { - seqid: 17, - claim: 'PATCH /inputs', - usage: PermissionUsages.PUBLIC, - name: 'Atualizar conexões', - }, - DELETE: { - seqid: 3, - claim: 'DELETE /inputs', - usage: PermissionUsages.PUBLIC, - }, - GET_ENTITIES: { - seqid: 10, - claim: 'GET /inputs/available-entities', - usage: PermissionUsages.PUBLIC, + permissions: { + CREATE: { + seqid: 21, + claim: 'POST /inputs', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Criar conexões', + 'en-us': 'Create connections', + }, + }, + GET: { + seqid: 9, + claim: 'GET /inputs', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Buscar conexões', + 'en-us': 'Get connections', + }, + }, + UPDATE: { + seqid: 27, + claim: 'PUT /inputs', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Atualizar conexões', + 'en-us': 'Create connections', + }, + }, + DELETE: { + seqid: 3, + claim: 'DELETE /inputs', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Remover conexões', + 'en-us': 'Delete connections', + }, + }, + GET_ENTITIES: { + seqid: 10, + claim: 'GET /inputs/available-entities', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Remover conexões', + 'en-us': 'Delete connections', + }, + }, }, }, OUTPUT: { - CREATE: { - seqid: 22, - claim: 'POST /outputs', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Output', + 'en-us': 'Output', }, - GET: { - seqid: 12, - claim: 'GET /outputs', - usage: PermissionUsages.PUBLIC, - }, - UPDATE: { - seqid: 28, - claim: 'PUT /outputs', - usage: PermissionUsages.PUBLIC, - }, - DELETE: { - seqid: 4, - claim: 'DELETE /outputs', - usage: PermissionUsages.PUBLIC, + permissions: { + CREATE: { + seqid: 22, + claim: 'POST /outputs', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Criar outputs', + 'en-us': 'Create outputs', + }, + }, + GET: { + seqid: 12, + claim: 'GET /outputs', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Buscar outputs', + 'en-us': 'Get outputs', + }, + }, + UPDATE: { + seqid: 28, + claim: 'PUT /outputs', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Editar outputs', + 'en-us': 'Edit outputs', + }, + }, + DELETE: { + seqid: 4, + claim: 'DELETE /outputs', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Remover outputs', + 'en-us': 'Remove outputs', + }, + }, }, }, TRANSFORMATIONS: { - CREATE: { - seqid: 24, - claim: 'POST /transformations', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Micro-transformações', + 'en-us': 'Micro-transformations', }, - GET: { - seqid: 15, - claim: 'GET /transformations', - usage: PermissionUsages.PUBLIC, - }, - UPDATE: { - seqid: 30, - claim: 'PUT /transformations', - usage: PermissionUsages.PUBLIC, - }, - DELETE: { - seqid: 6, - claim: 'DELETE /transformations', - usage: PermissionUsages.PUBLIC, + permissions: { + CREATE: { + seqid: 24, + claim: 'POST /transformations', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Criar micro-transformações', + 'en-us': 'Create micro-transformations', + }, + }, + GET: { + seqid: 15, + claim: 'GET /transformations', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Buscar micro-transformações', + 'en-us': 'Get micro-transformations', + }, + }, + UPDATE: { + seqid: 30, + claim: 'PUT /transformations', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Editar micro-transformações', + 'en-us': 'Edit micro-transformations', + }, + }, + DELETE: { + seqid: 6, + claim: 'DELETE /transformations', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Remover micro-transformações', + 'en-us': 'Remove micro-transformations', + }, + }, }, }, CATALOG: { - CREATE: { - seqid: 19, - claim: 'POST /catalog', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Catálogo', + 'en-us': 'Catalog', }, - GET: { - seqid: 7, - claim: 'GET /catalog', - usage: PermissionUsages.PUBLIC, - }, - UPDATE: { - seqid: 25, - claim: 'PUT /catalog', - usage: PermissionUsages.PUBLIC, - }, - DELETE: { - seqid: 1, - claim: 'DELETE /catalog', - usage: PermissionUsages.PUBLIC, + permissions: { + CREATE: { + seqid: 19, + claim: 'POST /catalog', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Criar atributos no catálogo', + 'en-us': 'Create catalog attributes', + }, + }, + GET: { + seqid: 7, + claim: 'GET /catalog', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Buscar catálogos', + 'en-us': 'Get catalogs', + }, + }, + UPDATE: { + seqid: 25, + claim: 'PUT /catalog', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Editar catálogo', + 'en-us': 'Edit catalogs', + }, + }, + DELETE: { + seqid: 1, + claim: 'DELETE /catalog', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Remover catálogo', + 'en-us': 'Remove catalogs', + }, + }, }, }, CONNECTORS: { - CREATE: { - seqid: 20, - claim: 'POST /connectors', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Conectores', + 'en-us': 'Connectors', }, - GET: { - seqid: 8, - claim: 'GET /connectors', - usage: PermissionUsages.PUBLIC, - }, - UPDATE: { - seqid: 26, - claim: 'PUT /connectors', - usage: PermissionUsages.PUBLIC, - }, - DELETE: { - seqid: 2, - claim: 'DELETE /connectors', - usage: PermissionUsages.PUBLIC, + permissions: { + CREATE: { + seqid: 20, + claim: 'POST /connectors', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Criar conectores', + 'en-us': 'Create connectors', + }, + }, + GET: { + seqid: 8, + claim: 'GET /connectors', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Buscar conectores', + 'en-us': 'Get connectors', + }, + }, + UPDATE: { + seqid: 26, + claim: 'PUT /connectors', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Editar conectores', + 'en-us': 'Edit connectors', + }, + }, + DELETE: { + seqid: 2, + claim: 'DELETE /connectors', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Remover conectores', + 'en-us': 'Remove connectors', + }, + }, }, }, SNOWFLAKE: { - OPEN: { - seqid: 14, - claim: 'GET /snowflake', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Snowflake', + 'en-us': 'Snowflake', + }, + permissions: { + OPEN: { + seqid: 14, + claim: 'GET /snowflake', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Acessar Snowflake', + 'en-us': 'Access Snowflake', + }, + }, }, }, ZENDESK: { - OPEN: { - seqid: 16, - claim: 'GET /zendesk', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Zendesk', + 'en-us': 'Zendesk', + }, + permissions: { + OPEN: { + seqid: 16, + claim: 'GET /zendesk', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Acessar Zendesk', + 'en-us': 'Access Zendesk', + }, + }, }, }, METABASE: { - OPEN: { - seqid: 11, - claim: 'GET /metabase', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Metabase', + 'en-us': 'Metabase', + }, + permissions: { + OPEN: { + seqid: 11, + claim: 'GET /metabase', + usage: PermissionUsages.INTERNAL, + name: { + 'pt-br': 'Acessar Metabase', + 'en-us': 'Access Metabase', + }, + }, }, }, ORCHEST: { - INTELLIGENCE: { - seqid: 31, - claim: 'intelligence:open', - usage: PermissionUsages.PUBLIC, + title: { + 'pt-br': 'Orchest', + 'en-us': 'Orchest', }, - APP_BUILDER: { - seqid: 32, - claim: 'app-builder:open', - usage: PermissionUsages.PUBLIC, - }, - MACHINE_LEARNING: { - seqid: 33, - claim: 'machine-learning:open', - usage: PermissionUsages.PUBLIC, + permissions: { + INTELLIGENCE: { + seqid: 31, + claim: 'intelligence:open', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Acessar inteligência', + 'en-us': 'Access intelligence', + }, + }, + APP_BUILDER: { + seqid: 32, + claim: 'app-builder:open', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Acessar App Builder', + 'en-us': 'Access App Builder', + }, + }, + MACHINE_LEARNING: { + seqid: 33, + claim: 'machine-learning:open', + usage: PermissionUsages.PUBLIC, + name: { + 'pt-br': 'Acessar Machine Learning', + 'en-us': 'Access Machine Learning', + }, + }, }, }, }; +export type PermissionsObject = typeof PERMISSIONS; // traverses the object searching for duplicate seqids or claims (executes at runtime) let nextAvailableSeqid = 0; -const seqids = Object.values(Permissions).flatMap((namespace) => - Object.values(namespace).map(({ seqid }) => seqid), +const seqids = Object.values(PERMISSIONS).flatMap((namespace) => + Object.values(namespace.permissions).map(({ seqid }) => seqid), ); -const claims = Object.values(Permissions).flatMap((namespace) => - Object.values(namespace).map(({ claim }) => claim), +const claims = Object.values(PERMISSIONS).flatMap((namespace) => + Object.values(namespace.permissions).map(({ claim }) => claim), ); -Object.values(Permissions).map((namespace) => - Object.values(namespace).map(({ seqid, claim }) => { +Object.values(PERMISSIONS).map((namespace) => + Object.values(namespace.permissions).map(({ seqid, claim }) => { const seqidsCount = seqids.filter((x) => x === seqid).length; assert(seqidsCount === 1, `seqid ${seqid} count is not 1`); diff --git a/src/authentication/user.decorator.spec.ts b/src/authentication/user.decorator.spec.ts index cc57a88..91eee24 100644 --- a/src/authentication/user.decorator.spec.ts +++ b/src/authentication/user.decorator.spec.ts @@ -11,7 +11,7 @@ import { AuthClientService } from '../modules/auth/auth.service'; import ErrorCodes from '../utils/errorCodes'; import { User } from './user.decorator'; -import { Permissions } from './permissions.enum'; +import { PERMISSIONS } from './permissions.enum'; @Controller('user') class UserController { @@ -45,7 +45,7 @@ describe('user.decorator', () => { const fakeUserPayload = { user_id: 'd50d33c7-6c2b-463c-861f-e21667e7c125', username: 'super.admin', - permissions: [Permissions.METABASE.OPEN].map(({ seqid }) => seqid), + permissions: [PERMISSIONS.METABASE.OPEN].map(({ seqid }) => seqid), customer_id: '9d18e8ae-24b9-41a3-9e8f-a25ce57555b11', customer_name: 'dadosfera', customer_tier: 'BASIC', diff --git a/src/i18n/pt/messages.json b/src/i18n/pt/messages.json deleted file mode 100644 index dc5f042..0000000 --- a/src/i18n/pt/messages.json +++ /dev/null @@ -1,11 +0,0 @@ -{ - "ERRORS": {}, - "PERMISSIONS": { - "NAMES": { - "PIPELINE_CREATE": "Criar pipeline", - "PIPELINE_GET": "Buscar pipelines", - "PIPELINE_PUT": "Atualizar pipeline", - "PIPELINE_DELETE": "Excluir pipeline" - } - } -} \ No newline at end of file diff --git a/src/modules/catalog/catalog.controller.ts b/src/modules/catalog/catalog.controller.ts index 7c44f81..1d32ebe 100644 --- a/src/modules/catalog/catalog.controller.ts +++ b/src/modules/catalog/catalog.controller.ts @@ -10,7 +10,7 @@ import { } from '@nestjs/common'; import { ApiTags } from '@nestjs/swagger'; import { AuthenticateCondition } from '../../authentication/authentication.decorator'; -import { Permissions } from '../../authentication/permissions.enum'; +import { PERMISSIONS } from '../../authentication/permissions.enum'; import { CatalogService } from './catalog.service'; import { DadosferaLogger } from 'dadosfera-logs'; @@ -32,7 +32,7 @@ import { DadosferaLogger } from 'dadosfera-logs'; action = req.method; } - return user.permissions.includes(Permissions.CATALOG[action].seqid); + return user.permissions.includes(PERMISSIONS.CATALOG[action].seqid); }) export class CatalogController { logger: any; diff --git a/src/modules/inputs/inputs.controller.ts b/src/modules/inputs/inputs.controller.ts index 7ac86e3..38dd1ba 100644 --- a/src/modules/inputs/inputs.controller.ts +++ b/src/modules/inputs/inputs.controller.ts @@ -12,7 +12,7 @@ import { InputsService } from './inputs.service'; import { DadosferaLogger } from 'dadosfera-logs'; import { InputsClientService } from 'src/clients/inputs/client.service'; import { UpdateInputRequest } from 'src/clients/inputs/interfaces'; -import { Permissions } from '../../authentication/permissions.enum'; +import { PERMISSIONS } from '../../authentication/permissions.enum'; import { AuthenticateCondition } from 'src/authentication/authentication.decorator'; import { ApiOkResponse, ApiTags } from '@nestjs/swagger'; import { @@ -41,7 +41,7 @@ import { break; case 'PATCH': - action = 'UPDATE_PARTIAL'; + action = 'UPDATE'; break; default: @@ -55,7 +55,7 @@ import { action = 'GET_ENTITIES'; } - return user.permissions.includes(Permissions.INPUT[action].seqid); + return user.permissions.includes(PERMISSIONS.INPUT[action].seqid); }) export class InputsController { inputService: InputsService; diff --git a/src/modules/outputs/outputs.controllers.ts b/src/modules/outputs/outputs.controllers.ts index e13bf70..ba7b283 100644 --- a/src/modules/outputs/outputs.controllers.ts +++ b/src/modules/outputs/outputs.controllers.ts @@ -12,7 +12,7 @@ import { Payload } from '@nestjs/microservices'; import { ApiTags } from '@nestjs/swagger'; import { OutputsClientService } from 'src/clients/outputs/client.service'; import { AuthenticateCondition } from 'src/authentication/authentication.decorator'; -import { Permissions } from '../../authentication/permissions.enum'; +import { PERMISSIONS } from '../../authentication/permissions.enum'; import { OutputsService } from './outputs.service'; import { DadosferaLogger } from 'dadosfera-logs'; @@ -34,7 +34,7 @@ import { DadosferaLogger } from 'dadosfera-logs'; action = req.method; } - return user.permissions.includes(Permissions.OUTPUT[action].seqid); + return user.permissions.includes(PERMISSIONS.OUTPUT[action].seqid); }) export class OutputsController { logger: any; diff --git a/src/modules/permissions/dto/entities.ts b/src/modules/permissions/dto/entities.ts new file mode 100644 index 0000000..07a2528 --- /dev/null +++ b/src/modules/permissions/dto/entities.ts @@ -0,0 +1,30 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class PermissionDto { + @ApiProperty() + name: string; + @ApiProperty() + id: number; +} + +export class PermissionGroup { + @ApiProperty() + title: string; + @ApiProperty({ type: [PermissionDto] }) + permissions: PermissionDto[]; +} + +export class Permission { + @ApiProperty() + id: string; + @ApiProperty() + seqid: number; + @ApiProperty() + name: string; + @ApiProperty() + claim: string; + @ApiProperty() + createdAt: string; + @ApiProperty() + updatedAt: string; +} diff --git a/src/modules/permissions/permissions.service.ts b/src/modules/permissions/permissions.service.ts index 2c0ec54..67c700e 100644 --- a/src/modules/permissions/permissions.service.ts +++ b/src/modules/permissions/permissions.service.ts @@ -11,8 +11,14 @@ import { ProtoServices } from 'protospack-v2/dist/lib/Duc'; import { PermissionsProtoService as PermissionsServiceInterface } from 'protospack-v2/dist/lib/Duc/interfaces/write-service'; import { InjectPermissionsRequest } from 'protospack-v2/dist/lib/Duc/interfaces/messages'; import { DadosferaLogger } from 'dadosfera-logs'; -import { Permissions } from '../../authentication/permissions.enum'; +import { + Permission, + PERMISSIONS, + PermissionsObject, + PermissionUsages, +} from '../../authentication/permissions.enum'; import ErrorBuilder from '../../utils/ErrorBuilder'; +import { PermissionGroup } from './dto/entities'; @Injectable() export class PermissionsClientService @@ -40,8 +46,8 @@ export class PermissionsClientService async onApplicationBootstrap() { this.logger.info('sending permissions to DUC...'); - const permissions = Object.values(Permissions).flatMap((namespace) => - Object.values(namespace), + const permissions = Object.values(PERMISSIONS).flatMap((namespace) => + Object.values(namespace.permissions), ); return this.injectPermissions({ @@ -67,4 +73,11 @@ export class PermissionsClientService this.permissionsService.InjectPermissions({ permissions }), ); } + getPublicPermissions() { + return this.getPermissions(PermissionUsages.PUBLIC); + } + getPermissions(permissionUsage?: PermissionUsages): PermissionGroup[] { + const groups: PermissionGroup[] = []; + return groups; + } } diff --git a/src/modules/pipelines/pipelines.controller.ts b/src/modules/pipelines/pipelines.controller.ts index 1c40836..cc17671 100644 --- a/src/modules/pipelines/pipelines.controller.ts +++ b/src/modules/pipelines/pipelines.controller.ts @@ -11,7 +11,7 @@ import { import { ApiTags } from '@nestjs/swagger'; import { PipelinesClientService } from 'src/clients/pipelines/client.service'; import { AuthenticateCondition } from 'src/authentication/authentication.decorator'; -import { Permissions } from '../../authentication/permissions.enum'; +import { PERMISSIONS } from '../../authentication/permissions.enum'; import { PipelinesService } from './pipelines.service'; import { DadosferaLogger } from 'dadosfera-logs'; @@ -33,7 +33,7 @@ import { DadosferaLogger } from 'dadosfera-logs'; action = req.method; } - return user.permissions.includes(Permissions.PIPELINE[action].seqid); + return user.permissions.includes(PERMISSIONS.PIPELINE[action].seqid); }) export class PipelinesController { logger: any; diff --git a/src/modules/roles/dto/entities.ts b/src/modules/roles/dto/entities.ts index 65eebcc..deefd83 100644 --- a/src/modules/roles/dto/entities.ts +++ b/src/modules/roles/dto/entities.ts @@ -1,19 +1,5 @@ import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; - -export class Permission { - @ApiProperty() - id: string; - @ApiProperty() - seqid: number; - @ApiProperty() - name: string; - @ApiProperty() - claim: string; - @ApiProperty() - createdAt: string; - @ApiProperty() - updatedAt: string; -} +import { Permission } from 'src/modules/permissions/dto/entities'; export class Role { @ApiPropertyOptional({ type: [Permission] }) permissions: Permission[]; diff --git a/src/modules/transformations/transformations.controller.ts b/src/modules/transformations/transformations.controller.ts index 71b2d21..0c96dbd 100644 --- a/src/modules/transformations/transformations.controller.ts +++ b/src/modules/transformations/transformations.controller.ts @@ -13,7 +13,7 @@ import { ApiTags } from '@nestjs/swagger'; import { TransformationsClientService } from 'src/clients/transformations/client.service'; import { IIdRequest } from 'src/clients/transformations/interfaces'; import { AuthenticateCondition } from 'src/authentication/authentication.decorator'; -import { Permissions } from '../../authentication/permissions.enum'; +import { PERMISSIONS } from '../../authentication/permissions.enum'; import { TransformationsService } from './transformations.service'; import { DadosferaLogger } from 'dadosfera-logs'; @@ -35,7 +35,7 @@ import { DadosferaLogger } from 'dadosfera-logs'; action = req.method; } - return user.permissions.includes(Permissions.TRANSFORMATIONS[action].seqid); + return user.permissions.includes(PERMISSIONS.TRANSFORMATIONS[action].seqid); }) export class TransformationsController { logger: any;