{"id":25650642,"url":"https://github.com/fabionmoraes/role-permissions-bd","last_synced_at":"2026-05-10T03:38:28.372Z","repository":{"id":65491181,"uuid":"452789946","full_name":"fabionmoraes/role-permissions-bd","owner":"fabionmoraes","description":"Permissão de acesso de usuário por rota","archived":false,"fork":false,"pushed_at":"2023-08-13T23:45:10.000Z","size":185,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-02-12T09:49:37.121Z","etag":null,"topics":["backend","nestjs","nestjs-backend","nodejs","permissions","roles"],"latest_commit_sha":null,"homepage":"https://www.npmjs.com/package/role-permissions-bd","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/fabionmoraes.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-27T18:03:09.000Z","updated_at":"2023-08-13T23:45:14.000Z","dependencies_parsed_at":"2024-10-19T14:38:14.771Z","dependency_job_id":null,"html_url":"https://github.com/fabionmoraes/role-permissions-bd","commit_stats":{"total_commits":18,"total_committers":1,"mean_commits":18.0,"dds":0.0,"last_synced_commit":"3ba3431b1b9084b7fcf4007c48789f1e88ee750c"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabionmoraes%2Frole-permissions-bd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabionmoraes%2Frole-permissions-bd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabionmoraes%2Frole-permissions-bd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/fabionmoraes%2Frole-permissions-bd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/fabionmoraes","download_url":"https://codeload.github.com/fabionmoraes/role-permissions-bd/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":240265469,"owners_count":19774070,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["backend","nestjs","nestjs-backend","nodejs","permissions","roles"],"created_at":"2025-02-23T15:17:15.753Z","updated_at":"2026-05-10T03:38:28.331Z","avatar_url":"https://github.com/fabionmoraes.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# role-permissions-bd - Backend\n\n## express Compatibility\n\nRole Permissions é testado e tem total compatibilidade com express 4x.\n\n## O que a lib faz?\n\nA Lib retorna de uma forma fácil as permissões de todas as rotas Express\n\n## Para utilizar precisa?\n\n- No banco de dados precisa ter as tabelas:\n  --users[..info]\n  --roles[\"name: string\", \"permissions: string\"] // Aqui vai ser criado o perfil de permissão de acordo com a rota criada.\n  --user_roles[\"user_id: string | number\", \"user_role_id: string | number\"]\n\n## Instalação\n\n```bash\nyarn add role-permissions-bd\n# or\nnpm i role-permissions-bd --save\n```\n\n## Outra Library (Frontend) React JS\n\nA Lib carrega os dados que vem do backend em um formato e mostra em tela para criar e editar.\nOpen [role-permissions-react](https://www.npmjs.com/package/role-permissions-react)\n\n## Funcionalidades\n\n### exclude\n\n- O exclude vai retirar a rota que você deseja. Por ex.: ['users', 'roles'] O users e roles serão excluido\n\n```ts\nAllRouters(req, { exclude: [\"users\", \"roles\"] });\n```\n\n### exclude_prefix\n\n- O exclude_prefix vai retirar o prefix da url que foi configurado ex.: http.../api { exclude_prefix: 'api } retira\n\n```ts\nAllRouters(req, { exclude_prefix: \"api\" });\n```\n\n## Utilização da Library NestJS\n\n### Example Use Code\n\nOpen [Segue Exemplo do NestJS](https://github.com/fabionmoraes/use-role-permissions-bd-nestjs)\n\n### Interceptors\n\n```ts\nimport {\n  Injectable,\n  NestInterceptor,\n  ExecutionContext,\n  CallHandler,\n  HttpException,\n} from \"@nestjs/common\";\nimport { Observable } from \"rxjs\";\nimport { NextPermission, UserRoles } from \"role-permissions-bd\";\n\n@Injectable()\nexport class PermissionsInterceptor implements NestInterceptor {\n  intercept(context: ExecutionContext, next: CallHandler): Observable\u003cany\u003e {\n    const ctx = context.switchToHttp();\n    const request = ctx.getRequest();\n\n    const user: any = request.user; // Na documentação do auth NestJS ele armazena o user no request\n\n    const passed = NextPermission({\n      request,\n      userRoles: UserRoles(user.user_roles), // Aqui pega a roles do usuário user_roles com relacionamento role\n      roleNameNext: 'administrator', // Aqui você pode passar uma role name para passar. Por default o nome da role é admin\n    });\n\n    if (passed) {\n      return next.handle();\n    }\n\n    throw new HttpException(...);\n  }\n}\n```\n\n### Controllers\n\n```ts\n...\nimport { AllRouters, Permissions, Permission } from 'role-permissions-bd'\n\n@UseGuards(JwtAuthGuard) // Authenticação do proprio NestJS\n@UseInterceptors(PermissionsInterceptor) // Utilização do Interceptors do NestJS\n@Controllers('roles')\nexport class RolesController {\n    constructor(...) {}\n\n    @Get('/todo')\n    async findAll() {\n        const roles = await this.rolesService.findAll()\n        return Permissions(req, { roles })\n\n        // Retorno será uma junção das roles que já existe no seu banco com a permissão de cada rota\n        // [\n        //     {\n        //         \"id\": 8,\n        //         \"name\": \"Suporte\",\n        //         \"slug\": \"suporte\",\n        //         \"permissions\": [\n        //             {\n        //                 \"name\": \"roles\",\n        //                 \"permissions\": {\n        //                     \"GET\": true,// ... visualizar\n        //                     \"POST\": true, // Usuário tem permissão de criar\n        //                     \"UPDATE\": true, // ... alterar\n        //                     \"DELETE\": false\n        //                 }\n        //             },\n        //             {\n        //                 \"name\": \"countries\",\n        //                 \"permissions\": {\n        //                     \"GET\": false\n        //                 }\n        //             },\n        //         ],\n        //         \"created_at\": \"2022-01-27T19:32:23.855Z\",\n        //         \"updated_at\": \"2022-01-27T19:32:23.855Z\",\n        //         \"deleted_at\": null\n        //     }\n        // ]\n    }\n\n    @Get('/one')\n    findAllRoutes(@Request() req) {\n        const role = await this.rolesService.findOne(...)\n        return Permissions(req, { role, exclude: ['roles'] }) //exclude retira a rota roles para visualizar não sendo obrigatório\n    }\n\n    @Get('/routes')\n    findAllRoutes(@Request() req) {\n        return AllRouters(req) // Aqui Retorna todas rotas como tudo false do exemplo acima\n    }\n}\n```\n\n## Utilização da Library NodeJS\n\n### Middleware\n\n```ts\n//src/middleware/handle\nimport { Request, Response, NextFunction } from \"express\";\nimport { container } from \"tsyringe\";\nimport { NextPermission } from \"role-permissions-bd\";\n\nimport { AppError } from \"@config/AppError\";\nimport { jwtVerify } from \"@config/jwt\";\nimport { FindOneUserByIdService } from \"@modules/users/services/FindOneUserByIdService\";\n\nexport default class RolePermissionsMiddleware {\n  async handle(request: Request, response: Response, next: NextFunction) {\n    const findOneUserByIdService = container.resolve(FindOneUserByIdService);\n\n    const authToken = request.headers.authorization;\n\n    const [, token] = authToken.split(\" \");\n\n    const { sub } = jwtVerify(token);\n\n    const user = await findOneUserByIdService.execute(sub);\n\n    const passed = NextPermission({\n      request,\n      userRoles: user.roles,\n    });\n\n    if (passed) {\n      return next();\n    }\n\n    throw new AppError(\"Not Permission\", 403);\n  }\n}\n\n//src/middleware/index\n\nimport EnsureAuthenticated from \"./handle/ensureAuthenticated\";\nimport RolePermissions from \"./handle/rolePermissions\";\n\nconst ensureAuthenticated = new EnsureAuthenticated().handle;\nconst rolePermissionsMiddleware = new RolePermissions().handle;\n\nexport { rolePermissionsMiddleware, ensureAuthenticated };\n```\n\n### Controllers\n\n```ts\nimport { Request, Response } from \"express\";\n\nimport { AllRouters, Permissions, Permission } from \"role-permissions-bd\";\nimport { container } from \"tsyringe\";\n\nimport { FindOneRoleByIdService } from \"@modules/roles/services/FindOneRoleByIdService\";\nimport { FindAllRoleService } from \"@modules/roles/services/FindAllRoleService\";\n\nexport class PermissionsController {\n  async findAllRouters(request: Request, response: Response) {\n    return response.json(\n      AllRouters(request, { exclude: [\"permissions\", \"auth\"] })\n    );\n  }\n\n  async findOneRole(request: Request, response: Response) {\n    const { id } = request.params;\n\n    try {\n      const findOneRoleByIdService = container.resolve(FindOneRoleByIdService);\n      const role = await findOneRoleByIdService.execute(+id);\n\n      return response.json(Permission(request, { role }));\n    } catch (err: any) {\n      return response.sendError(err.message);\n    }\n  }\n\n  async findAllTools(request: Request, response: Response) {\n    const findAllRoleService = container.resolve(FindAllRoleService);\n\n    try {\n      const roles = await findAllRoleService.execute();\n\n      return response.json(\n        Permissions(request, { roles, exclude: [\"permissions\", \"auth\"] })\n      );\n    } catch (err: any) {\n      return response.sendError(err.message);\n    }\n  }\n}\n```\n\n### Routes\n\n```ts\nimport { Router } from \"express\";\nimport { ensureAuthenticated } from \"middleware\";\nimport { PermissionsController } from \"./PermissionsController\";\n\nconst permissionsRoutes = Router();\nconst permissionsController = new PermissionsController();\n\n// permissionsRoutes.use(ensureAuthenticated)\n\npermissionsRoutes.get(\"/routes\", permissionsController.findAllRouters);\npermissionsRoutes.get(\"/roles\", permissionsController.findAllTools);\npermissionsRoutes.get(\"/roles/:id\", permissionsController.findOneRole);\n\nexport { permissionsRoutes };\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabionmoraes%2Frole-permissions-bd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ffabionmoraes%2Frole-permissions-bd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ffabionmoraes%2Frole-permissions-bd/lists"}