import { Logger } from '@nestjs/common'; import assert from 'assert'; import { LanguageEnum } from 'src/utils/languages.enum'; const logger = new Logger(); export enum PermissionUsages { PUBLIC = 'public', INTERNAL = 'internal', } export interface PermissionsObjectPermission { seqid: number; claim: string; usage: PermissionUsages; name?: Record; } export interface PermissionsObjectPermissionTranslated { seqid: number; claim: string; usage: PermissionUsages; name?: string; } export interface PermissionsObjectGroup { title: { 'pt-br': string; 'en-us': string; }; permissions: Record; } /* - like field numbers in gRPC, avoid to change (or reuse previously used) seqids once its deployed to DUC - it is possible to update claim and usage, not seqid */ /*export const Permissions: { [P in keyof any]: { [Q in keyof any]: Permission }; } = {*/ export const PERMISSIONS = { AUTH: { title: { 'pt-br': 'Autenticação', 'en-us': 'Authentication', }, permissions: { CREATE: { seqid: 18, claim: 'POST /auth', usage: PermissionUsages.INTERNAL, name: { 'pt-br': '', 'en-us': '', }, }, }, }, PIPELINE: { title: { 'pt-br': 'Coletar | Pipelines', 'en-us': 'Collect | Pipelines', }, 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': 'Excluir pipeline', 'en-us': 'Delete pipeline', }, }, }, }, INPUT: { title: { 'pt-br': 'Coletar | Conexões', 'en-us': 'Collect | Connections', }, permissions: { CREATE: { seqid: 21, claim: 'POST /inputs', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Criar conexões', 'en-us': 'Create connections', }, }, GET: { seqid: 9, claim: 'GET /inputs', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Buscar conexões', 'en-us': 'Get connections', }, }, UPDATE: { seqid: 27, claim: 'PUT /inputs', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Atualizar conexões', 'en-us': 'Create connections', }, }, DELETE: { seqid: 3, claim: 'DELETE /inputs', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Excluir conexões', 'en-us': 'Delete connections', }, }, GET_ENTITIES: { seqid: 10, claim: 'GET /inputs/available-entities', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Excluir conexões', 'en-us': 'Delete connections', }, }, }, }, OUTPUT: { title: { 'pt-br': 'Output', 'en-us': 'Output', }, 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': 'Excluir outputs', 'en-us': 'Remove outputs', }, }, }, }, TRANSFORMATIONS: { title: { 'pt-br': 'Micro-transformações', 'en-us': 'Micro-transformations', }, permissions: { CREATE: { seqid: 24, claim: 'POST /transformations', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Criar micro-transformações', 'en-us': 'Create micro-transformations', }, }, GET: { seqid: 15, claim: 'GET /transformations', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Buscar micro-transformações', 'en-us': 'Get micro-transformations', }, }, UPDATE: { seqid: 30, claim: 'PUT /transformations', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Editar micro-transformações', 'en-us': 'Edit micro-transformations', }, }, DELETE: { seqid: 6, claim: 'DELETE /transformations', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Excluir micro-transformações', 'en-us': 'Remove micro-transformations', }, }, }, }, CATALOG: { title: { 'pt-br': 'Explorar | Catálogo', 'en-us': 'Explore | Catalog', }, permissions: { GET: { seqid: 7, claim: 'GET /catalog', usage: PermissionUsages.PUBLIC, name: { 'pt-br': 'Buscar data assets', 'en-us': 'Search for data assets', }, }, CREATE: { seqid: 19, claim: 'POST /catalog', usage: PermissionUsages.PUBLIC, name: { 'pt-br': 'Criar atributos no catálogo', 'en-us': 'Create attributes', }, }, UPDATE: { seqid: 25, claim: 'PUT /catalog', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Editar atributos no catálogo', 'en-us': 'Edit attributes', }, }, DELETE: { seqid: 1, claim: 'DELETE /catalog', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Excluir atributos no catálogo', 'en-us': 'Remove attributes', }, }, }, }, CONNECTORS: { title: { 'pt-br': 'Conectores', 'en-us': 'Connectors', }, 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': 'Excluir conectores', 'en-us': 'Remove connectors', }, }, }, }, SNOWFLAKE: { title: { 'pt-br': 'Explorar | Consolidar', 'en-us': 'Explore | Data consolidation', }, permissions: { OPEN: { seqid: 14, claim: 'GET /snowflake', usage: PermissionUsages.PUBLIC, name: { 'pt-br': 'Acessar Snowflake', 'en-us': 'Access Snowflake', }, }, }, }, ZENDESK: { 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: { title: { 'pt-br': 'Analisar | Visualização', 'en-us': 'Analyze | Visualization', }, permissions: { OPEN: { seqid: 11, claim: 'GET /metabase', usage: PermissionUsages.PUBLIC, name: { 'pt-br': 'Acessar Metabase', 'en-us': 'Access Metabase', }, }, }, }, ORCHEST: { title: { 'pt-br': 'Analisar | Inteligência', 'en-us': 'Analyze | Intelligence', }, permissions: { INTELLIGENCE: { seqid: 31, claim: 'intelligence:open', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Acessar Orchest', 'en-us': 'Access Orchest', }, }, APP_BUILDER: { seqid: 32, claim: 'app-builder:open', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Acessar App Builder', 'en-us': 'Access App Builder', }, }, MACHINE_LEARNING: { seqid: 33, claim: 'machine-learning:open', usage: PermissionUsages.INTERNAL, name: { 'pt-br': 'Acessar Machine Learning', 'en-us': 'Access Machine Learning', }, }, }, }, USERS: { title: { 'pt-br': 'Usuários', 'en-us': 'Users', }, permissions: { ADMIN: { seqid: 34, claim: 'users:admin', usage: PermissionUsages.PUBLIC, name: { 'pt-br': 'Gestão de usuários e grupos', 'en-us': 'Manage user and roles', }, }, }, }, }; // 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.permissions).map(({ seqid }) => seqid), ); const claims = Object.values(PERMISSIONS).flatMap((namespace) => Object.values(namespace.permissions).map(({ claim }) => 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`); const claimsCount = claims.filter((x) => x === claim).length; assert(claimsCount === 1, `claim '${claim}' count is not 1`); nextAvailableSeqid = Math.max(nextAvailableSeqid, seqid); }), ); logger.log(`next available seqid ${nextAvailableSeqid + 1}`);