FEAT: internationalization of permissions

This commit is contained in:
Gabriel Rosa
2022-07-08 19:03:32 -03:00
parent 4cff593695
commit 730fab8ed1
14 changed files with 469 additions and 290 deletions
+44 -74
View File
@@ -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": {
-1
View File
@@ -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",
+10 -10
View File
@@ -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']);
+355 -163
View File
@@ -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<string, Permission>;
}
/*
@@ -23,224 +33,406 @@ export interface Permission {
/*export const Permissions: {
[P in keyof any]: { [Q in keyof any]: Permission };
} = {*/
export const Permissions: Record<any, Record<string, Permission>> = {
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`);
+2 -2
View File
@@ -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',
-11
View File
@@ -1,11 +0,0 @@
{
"ERRORS": {},
"PERMISSIONS": {
"NAMES": {
"PIPELINE_CREATE": "Criar pipeline",
"PIPELINE_GET": "Buscar pipelines",
"PIPELINE_PUT": "Atualizar pipeline",
"PIPELINE_DELETE": "Excluir pipeline"
}
}
}
+2 -2
View File
@@ -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;
+3 -3
View File
@@ -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;
+2 -2
View File
@@ -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;
+30
View File
@@ -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;
}
+16 -3
View File
@@ -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;
}
}
@@ -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;
+1 -15
View File
@@ -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[];
@@ -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;