{"id":20703901,"url":"https://github.com/gabrielmaialva33/base-acl-api","last_synced_at":"2025-10-14T14:12:36.225Z","repository":{"id":115579678,"uuid":"499833338","full_name":"gabrielmaialva33/base-acl-api","owner":"gabrielmaialva33","description":"Base ACL is a modular access control list API built with AdonisJS v6 that provides a robust foundation for authentication and role-based access control. The API follows clean architecture principles with clear separation of concerns and is designed to serve as a base for multiple projects.","archived":false,"fork":false,"pushed_at":"2025-10-08T01:07:25.000Z","size":2414,"stargazers_count":6,"open_issues_count":10,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-10-14T14:12:35.853Z","etag":null,"topics":["acl","acl-api","acl2025","adonis-framework","adonis6","adonisjs","adonisjs-framework","adonisjs6","api","api-rest","docker","docker-compose","lucid","lucid-orm"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/gabrielmaialva33.png","metadata":{"files":{"readme":"README-pt.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","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,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2022-06-04T13:25:11.000Z","updated_at":"2025-08-29T19:41:03.000Z","dependencies_parsed_at":"2024-12-07T00:26:45.319Z","dependency_job_id":"dae6e235-d8ab-4914-844e-4994d746c4da","html_url":"https://github.com/gabrielmaialva33/base-acl-api","commit_stats":null,"previous_names":[],"tags_count":0,"template":true,"template_full_name":null,"purl":"pkg:github/gabrielmaialva33/base-acl-api","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fbase-acl-api","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fbase-acl-api/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fbase-acl-api/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fbase-acl-api/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gabrielmaialva33","download_url":"https://codeload.github.com/gabrielmaialva33/base-acl-api/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gabrielmaialva33%2Fbase-acl-api/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":279019121,"owners_count":26086679,"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","status":"online","status_checked_at":"2025-10-14T02:00:06.444Z","response_time":60,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"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":["acl","acl-api","acl2025","adonis-framework","adonis6","adonisjs","adonisjs-framework","adonisjs6","api","api-rest","docker","docker-compose","lucid","lucid-orm"],"created_at":"2024-11-17T01:10:06.874Z","updated_at":"2025-10-14T14:12:36.220Z","avatar_url":"https://github.com/gabrielmaialva33.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003ch1 align=\"center\"\u003e\n  \u003cimg src=\".github/assets/images/img1.png\" height=\"200\" alt=\"acl\"\u003e\n\u003c/h1\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://img.shields.io/github/license/gabrielmaialva33/base-acl-api?color=00b8d3?style=flat\u0026logo=appveyor\" alt=\"License\" /\u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/top/gabrielmaialva33/base-acl-api?style=flat\u0026logo=appveyor\" alt=\"GitHub top language\" \u003e\n  \u003cimg src=\"https://img.shields.io/github/languages/count/gabrielmaialva33/base-acl-api?style=flat\u0026logo=appveyor\" alt=\"GitHub language count\" \u003e\n  \u003cimg src=\"https://img.shields.io/github/repo-size/gabrielmaialva33/base-acl-api?style=flat\u0026logo=appveyor\" alt=\"Repository size\" \u003e\n  \u003cimg src=\"https://wakatime.com/badge/user/e61842d0-c588-4586-96a3-f0448a434be4/project/b0347a5f-cacf-486d-bd2d-b91d3e6cb570.svg?style=flat\u0026logo=appveyor\" alt=\"Wakatime\" \u003e\n  \u003ca href=\"https://github.com/gabrielmaialva33/base-rbac-api/commits/master\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/last-commit/gabrielmaialva33/base-acl-api?style=flat\u0026logo=appveyor\" alt=\"GitHub last commit\" \u003e\n    \u003cimg src=\"https://img.shields.io/badge/feito%20por-Maia-15c3d6?style=flat\u0026logo=appveyor\" alt=\"Maia\" \u003e\n  \u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n    \u003ca href=\"README.md\"\u003eEnglish\u003c/a\u003e\n    ·\n    \u003ca href=\"README-pt.md\"\u003ePortuguese\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"#bookmark-about\"\u003eSobre\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#computer-technologies\"\u003eTecnologias\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#wrench-tools\"\u003eFerramentas\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#package-installation\"\u003eInstalação\u003c/a\u003e\u0026nbsp;\u0026nbsp;\u0026nbsp;|\u0026nbsp;\u0026nbsp;\u0026nbsp;\n  \u003ca href=\"#memo-license\"\u003eLicença\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr\u003e\n\n## :bookmark: Sobre\n\n**Base ACL** é uma API modular de controle de acesso construída com AdonisJS v6 que fornece uma base robusta para\nautenticação e controle de acesso baseado em papéis. A API segue princípios de arquitetura limpa com clara separação de\nresponsabilidades e foi projetada para servir como base para múltiplos projetos.\n\n### 🏗️ Visão Geral da Arquitetura\n\n```mermaid\ngraph TB\n    subgraph \"Camada Cliente\"\n        WEB[Aplicações Web]\n        MOB[Aplicações Mobile]\n        API[APIs Externas]\n    end\n\n    subgraph \"Gateway API - v1\"\n        ROUTES[\"/api/v1/*\"]\n        MW[Stack de Middleware]\n    end\n\n    subgraph \"Módulos\"\n        AUTH[Módulo Auth\u003cbr/\u003eJWT, Sessões]\n        USER[Módulo Usuário\u003cbr/\u003eCRUD, Perfil]\n        ROLE[Módulo Papel\u003cbr/\u003eRBAC, Hierarquia]\n        PERM[Módulo Permissão\u003cbr/\u003eContextual, Herança]\n        FILE[Módulo Arquivo\u003cbr/\u003eUpload, Armazenamento]\n        AUDIT[Módulo Auditoria\u003cbr/\u003eLogs, Analytics]\n        HEALTH[Módulo Saúde\u003cbr/\u003eStatus, Monitoramento]\n    end\n\n    subgraph \"Serviços Core\"\n        JWT[Serviço JWT]\n        HASH[Serviço Hash]\n        VALIDATOR[Serviço Validador]\n        STORAGE[Serviço Armazenamento]\n    end\n\n    subgraph \"Camada de Dados\"\n        TS[(PostgreSQL\u003cbr/\u003eBanco Principal)]\n        REDIS[(Redis\u003cbr/\u003eCache \u0026 Sessões)]\n        PGREST[PostgREST\u003cbr/\u003eAPI REST Auto-gerada]\n    end\n\n    WEB --\u003e ROUTES\n    MOB --\u003e ROUTES\n    API --\u003e ROUTES\n\n    ROUTES --\u003e MW\n    MW --\u003e AUTH\n    MW --\u003e USER\n    MW --\u003e ROLE\n    MW --\u003e PERM\n    MW --\u003e FILE\n    MW --\u003e AUDIT\n    MW --\u003e HEALTH\n\n    AUTH --\u003e JWT\n    AUTH --\u003e HASH\n    USER --\u003e VALIDATOR\n    FILE --\u003e STORAGE\n    PERM --\u003e REDIS\n    AUDIT --\u003e TS\n\n    USER --\u003e TS\n    ROLE --\u003e TS\n    PERM --\u003e TS\n    AUTH --\u003e TS\n    AUTH --\u003e REDIS\n    AUDIT --\u003e TS\n\n    TS --\u003e PGREST\n\n    style ROUTES fill:#4A90E2\n    style TS fill:#336791\n    style REDIS fill:#DC382D\n    style PGREST fill:#008080\n```\n\n### 🔐 Fluxo de Autenticação\n\n```mermaid\nsequenceDiagram\n    participant C as Cliente\n    participant API as Gateway API\n    participant AUTH as Módulo Auth\n    participant JWT as Serviço JWT\n    participant DB as PostgreSQL\n    participant REDIS as Cache Redis\n\n    C-\u003e\u003eAPI: POST /api/v1/sessions/sign-in\n    API-\u003e\u003eAUTH: Validar credenciais\n    AUTH-\u003e\u003eDB: Buscar usuário por email\n    DB--\u003e\u003eAUTH: Dados do usuário\n    AUTH-\u003e\u003eAUTH: Verificar hash da senha\n    AUTH-\u003e\u003eJWT: Gerar tokens\n    JWT--\u003e\u003eAUTH: Tokens de acesso \u0026 refresh\n    AUTH-\u003e\u003eREDIS: Armazenar sessão\n    AUTH--\u003e\u003eC: Retornar tokens + dados do usuário\n\n    Note over C,API: Requisições subsequentes\n\n    C-\u003e\u003eAPI: GET /api/v1/users (Bearer token)\n    API-\u003e\u003eAUTH: Validar JWT\n    AUTH-\u003e\u003eREDIS: Verificar sessão\n    REDIS--\u003e\u003eAUTH: Sessão válida\n    AUTH--\u003e\u003eAPI: Usuário autenticado\n    API--\u003e\u003eC: Retornar recurso protegido\n```\n\n### 📁 Estrutura Modular\n\n```mermaid\ngraph TD\n    subgraph \"Estrutura da Aplicação\"\n        APP[app/]\n        MODULES[modules/]\n\n        subgraph \"Módulo Usuário\"\n            USER_M[user/]\n        end\n        subgraph \"Módulo Papel\"\n            ROLE_M[role/]\n        end\n        subgraph \"Módulo Permissão\"\n            PERM_M[permission/]\n        end\n        subgraph \"Módulo Arquivo\"\n            FILE_M[file/]\n        end\n        subgraph \"Módulo Auditoria\"\n            AUDIT_M[audit/]\n        end\n        subgraph \"Módulo Saúde\"\n            HEALTH_M[health/]\n        end\n        subgraph \"Módulo Propriedade\"\n            OWNER_M[ownership/]\n        end\n    end\n\n    APP --\u003e MODULES\n    MODULES --\u003e USER_M\n    MODULES --\u003e ROLE_M\n    MODULES --\u003e PERM_M\n    MODULES --\u003e FILE_M\n    MODULES --\u003e AUDIT_M\n    MODULES --\u003e HEALTH_M\n    MODULES --\u003e OWNER_M\n```\n\n## 🌟 Principais Funcionalidades\n\n### Funcionalidades Core\n\n- **🔐 Autenticação JWT**: Autenticação segura baseada em tokens com refresh tokens\n- **👥 Controle de Acesso Baseado em Papéis**: Permissões refinadas com papéis ROOT, ADMIN, USER, EDITOR e GUEST\n- **📁 Arquitetura Modular**: Clara separação de responsabilidades com módulos de funcionalidades\n- **🗄️ PostgreSQL**: Banco de dados robusto e confiável\n- **🚀 API RESTful**: Endpoints bem estruturados seguindo princípios REST\n- **📤 Upload de Arquivos**: Manipulação segura de arquivos com múltiplos drivers de armazenamento\n- **🏥 Monitoramento de Saúde**: Endpoints integrados para verificação de saúde\n- **🔒 Segurança em Primeiro Lugar**: Hash de senhas, CORS, rate limiting pronto\n- **📝 Validação de Requisições**: DTOs com validação em tempo de execução\n- **🌐 Pronto para i18n**: Suporte a internacionalização integrado\n- **🔗 Integração PostgREST**: API REST auto-gerada para acesso direto ao banco\n\n### Funcionalidades Avançadas de ACL\n\n- **🎯 Permissões Contextuais**: Suporte para contextos `own`, `any`, `team` e `department`\n- **🔄 Herança de Permissões**: Herança automática de permissões através da hierarquia de papéis\n- **📋 Trilha de Auditoria Completa**: Rastreamento de todas as verificações de permissão e tentativas de acesso\n- **⚡ Permissões em Cache Redis**: Verificação de permissões de alta performance com cache inteligente\n- **🏢 Propriedade de Recursos**: Sistema de propriedade integrado com suporte a contextos de equipe e departamento\n- **🔍 Controle Granular de Permissões**: Sistema de permissões baseado em Recurso + Ação + Contexto\n\n### Esquema do Banco de Dados\n\n```mermaid\nerDiagram\n    USERS ||--o{ USER_ROLES : possui\n    ROLES ||--o{ USER_ROLES : possui\n    USERS ||--o{ USER_PERMISSIONS : possui\n    USERS ||--o{ FILES : envia\n    ROLES ||--o{ ROLE_PERMISSIONS : possui\n    PERMISSIONS ||--o{ ROLE_PERMISSIONS : possui\n    PERMISSIONS ||--o{ USER_PERMISSIONS : possui\n    USERS ||--o{ AUDIT_LOGS : gera\n\n    USERS {\n        bigint id PK\n        string first_name\n        string last_name\n        string email UK\n        string username UK\n        string password\n        string avatar_url\n        boolean is_online\n        timestamp deleted_at\n        timestamp created_at\n        timestamp updated_at\n    }\n\n    ROLES {\n        bigint id PK\n        string name\n        string slug UK\n        string description\n        timestamp created_at\n        timestamp updated_at\n    }\n\n    PERMISSIONS {\n        bigint id PK\n        string name UK\n        string resource\n        string action\n        string context\n        string description\n        timestamp created_at\n        timestamp updated_at\n    }\n\n    USER_ROLES {\n        bigint id PK\n        bigint user_id FK\n        bigint role_id FK\n        timestamp created_at\n        timestamp updated_at\n    }\n\n    ROLE_PERMISSIONS {\n        bigint id PK\n        bigint role_id FK\n        bigint permission_id FK\n        timestamp created_at\n        timestamp updated_at\n    }\n\n    USER_PERMISSIONS {\n        bigint id PK\n        bigint user_id FK\n        bigint permission_id FK\n        boolean granted\n        timestamp expires_at\n        timestamp created_at\n        timestamp updated_at\n    }\n\n    AUDIT_LOGS {\n        bigint id PK\n        bigint user_id FK\n        string resource\n        string action\n        string context\n        bigint resource_id\n        string result\n        string reason\n        string ip_address\n        string user_agent\n        json metadata\n        timestamp created_at\n    }\n\n    FILES {\n        bigint id PK\n        bigint owner_id FK\n        string client_name\n        string file_name\n        bigint file_size\n        string file_type\n        string file_category\n        string url\n        timestamp created_at\n        timestamp updated_at\n    }\n```\n\n\u003cbr\u003e\n\n## :computer: Tecnologias\n\n- **[Typescript](https://www.typescriptlang.org/)**\n- **[Node.js](https://nodejs.org/)**\n- **[AdonisJS](https://adonisjs.com/)**\n- **[PostgreSQL](https://www.postgresql.org/)**\n- **[Redis](https://redis.io/)** - Armazenamento de dados em memória\n- **[PostgREST](https://postgrest.org/)** - API REST auto-gerada\n- **[Docker](https://www.docker.com/)**\n\n\u003cbr\u003e\n\n## :wrench: Ferramentas\n\n- **[WebStorm](https://www.jetbrains.com/webstorm/)**\n- **[Insomnia](https://insomnia.rest/)**\n- **[DataGrip](https://www.jetbrains.com/datagrip/)**\n\n\u003cbr\u003e\n\n## :package: Instalação\n\n### :heavy_check_mark: **Pré-requisitos**\n\nOs seguintes softwares devem estar instalados:\n\n- **[Node.js](https://nodejs.org/en/)**\n- **[Git](https://git-scm.com/)**\n- **[NPM](https://www.npmjs.com/)** or **[Yarn](https://yarnpkg.com/)**\n- **[PostgreSQL](https://www.postgresql.org/download/)** or **[Docker](https://www.docker.com/get-started/)**\n\n\u003cbr\u003e\n\n### :arrow_down: **Clonando o repositório**\n\n```sh\n  $ git clone https://github.com/gabrielmaialva33/base-acl-api.git\n```\n\n\u003cbr\u003e\n\n### :arrow_forward: **Rodando o backend**\n\n- :package: API\n\n```sh\n  $ cd base-acl-api\n  # Instalação de dependências.\n  $ yarn # ou npm install\n  # Configuração ambiente de sistema\n  $ cp .env.example .env\n  # Criação de banco de dados.\n  $ node ace migration:run # ou docker-compose up --build\n  # Iniciar API\n  $ node ace serve --hmr # ou pnpm dev\n```\n\n\u003cbr\u003e\n\n## :twisted_rightwards_arrows: Rotas da API\n\nA API é versionada e todos os endpoints são prefixados com `/api/v1/`. Abaixo está a estrutura completa de rotas:\n\n### 🛣️ Organização das Rotas\n\n```mermaid\ngraph LR\n    subgraph \"Rotas Públicas\"\n        HOME[GET /]\n        HEALTH[GET /api/v1/health]\n        SIGNIN[POST /api/v1/sessions/sign-in]\n        SIGNUP[POST /api/v1/sessions/sign-up]\n    end\n\n    subgraph \"Rotas Protegidas\"\n        subgraph \"Rotas de Usuário\"\n            USER_LIST[GET /api/v1/users]\n            USER_GET[GET /api/v1/users/:id]\n            USER_CREATE[POST /api/v1/users]\n            USER_UPDATE[PUT /api/v1/users/:id]\n            USER_DELETE[DELETE /api/v1/users/:id]\n        end\n\n        subgraph \"Rotas Admin\"\n            ROLE_LIST[GET /api/v1/admin/roles]\n            ROLE_ATTACH[PUT /api/v1/admin/roles/attach]\n        end\n\n        subgraph \"Rotas de Arquivo\"\n            FILE_UPLOAD[POST /api/v1/files/upload]\n        end\n    end\n\n    style HOME fill:#90EE90\n    style HEALTH fill:#90EE90\n    style SIGNIN fill:#90EE90\n    style SIGNUP fill:#90EE90\n    style ROLE_LIST fill:#FFB6C1\n    style ROLE_ATTACH fill:#FFB6C1\n```\n\n### 📋 Detalhes das Rotas\n\n| Método     | Endpoint                                    | Descrição                           | Auth Obrigatória | Permissão/Papel    |\n| ---------- | ------------------------------------------- | ----------------------------------- | ---------------- | ------------------ |\n| **GET**    | `/`                                         | Informações da API                  | ❌               | -                  |\n| **GET**    | `/api/v1/health`                            | Verificação de saúde                | ❌               | -                  |\n| **POST**   | `/api/v1/sessions/sign-in`                  | Login de usuário                    | ❌               | -                  |\n| **POST**   | `/api/v1/sessions/sign-up`                  | Registro de usuário                 | ❌               | -                  |\n| **GET**    | `/api/v1/verify-email`                      | Verificar email do usuário          | ❌               | -                  |\n| **POST**   | `/api/v1/resend-verification-email`         | Reenviar email de verificação       | ✅               | -                  |\n| **GET**    | `/api/v1/me`                                | Obter perfil do usuário atual       | ✅               | -                  |\n| **GET**    | `/api/v1/me/permissions`                    | Obter permissões do usuário atual   | ✅               | -                  |\n| **GET**    | `/api/v1/me/roles`                          | Obter papéis do usuário atual       | ✅               | -                  |\n| **GET**    | `/api/v1/users`                             | Listar usuários (paginado)          | ✅               | users.list         |\n| **GET**    | `/api/v1/users/:id`                         | Obter usuário por ID                | ✅               | users.read         |\n| **POST**   | `/api/v1/users`                             | Criar usuário                       | ✅               | users.create       |\n| **PUT**    | `/api/v1/users/:id`                         | Atualizar usuário                   | ✅               | users.update       |\n| **DELETE** | `/api/v1/users/:id`                         | Deletar usuário                     | ✅               | users.delete       |\n| **GET**    | `/api/v1/admin/roles`                       | Listar papéis                       | ✅               | ROOT, ADMIN        |\n| **PUT**    | `/api/v1/admin/roles/attach`                | Atribuir papel ao usuário           | ✅               | ROOT, ADMIN        |\n| **GET**    | `/api/v1/admin/permissions`                 | Listar permissões                   | ✅               | permissions.list   |\n| **POST**   | `/api/v1/admin/permissions`                 | Criar permissão                     | ✅               | permissions.create |\n| **PUT**    | `/api/v1/admin/roles/permissions/sync`      | Sincronizar permissões do papel     | ✅               | permissions.update |\n| **PUT**    | `/api/v1/admin/roles/permissions/attach`    | Anexar permissões ao papel          | ✅               | permissions.update |\n| **PUT**    | `/api/v1/admin/roles/permissions/detach`    | Desanexar permissões do papel       | ✅               | permissions.update |\n| **PUT**    | `/api/v1/admin/users/permissions/sync`      | Sincronizar permissões do usuário   | ✅               | permissions.update |\n| **GET**    | `/api/v1/admin/users/:id/permissions`       | Obter permissões diretas do usuário | ✅               | permissions.list   |\n| **POST**   | `/api/v1/admin/users/:id/permissions/check` | Verificar permissões do usuário     | ✅               | permissions.list   |\n| **POST**   | `/api/v1/files/upload`                      | Upload de arquivo                   | ✅               | files.create       |\n\n### 🔄 Fluxo de Requisição/Resposta\n\n```mermaid\nsequenceDiagram\n    participant Cliente\n    participant Router\n    participant Middleware\n    participant Controller\n    participant Service\n    participant Repository\n    participant Database\n\n    Cliente-\u003e\u003eRouter: Requisição HTTP\n    Router-\u003e\u003eMiddleware: Match de Rota\n\n    alt Rota Protegida\n        Middleware-\u003e\u003eMiddleware: Verificação Auth\n        Middleware-\u003e\u003eMiddleware: Verificação ACL\n    end\n\n    Middleware-\u003e\u003eController: Requisição Validada\n    Controller-\u003e\u003eService: Lógica de Negócio\n    Service-\u003e\u003eRepository: Acesso aos Dados\n    Repository-\u003e\u003eDatabase: Query\n    Database--\u003e\u003eRepository: Resultado\n    Repository--\u003e\u003eService: Entidade/DTO\n    Service--\u003e\u003eController: Dados de Resposta\n    Controller--\u003e\u003eCliente: Resposta HTTP\n```\n\n### 🔐 Sistema de Permissões\n\nO sistema avançado de permissões suporta controle de acesso contextual:\n\n```mermaid\ngraph TD\n    subgraph \"Estrutura de Permissão\"\n        P[Permissão]\n        P --\u003e R[Recurso]\n        P --\u003e A[Ação]\n        P --\u003e C[Contexto]\n\n        R --\u003e |exemplos| R1[users]\n        R --\u003e |exemplos| R2[files]\n        R --\u003e |exemplos| R3[permissions]\n\n        A --\u003e |exemplos| A1[create]\n        A --\u003e |exemplos| A2[read]\n        A --\u003e |exemplos| A3[update]\n        A --\u003e |exemplos| A4[delete]\n        A --\u003e |exemplos| A5[list]\n\n        C --\u003e |exemplos| C1[own - Apenas recursos próprios]\n        C --\u003e |exemplos| C2[any - Qualquer recurso]\n        C --\u003e |exemplos| C3[team - Recursos da equipe]\n        C --\u003e |exemplos| C4[department - Recursos do departamento]\n    end\n```\n\n#### Hierarquia de Papéis e Herança\n\n```\nROOT\n├── ADMIN (herda todas as permissões ROOT)\n│   ├── USER (herda permissões básicas ADMIN)\n│   │   └── GUEST (herda permissões limitadas USER)\n│   └── EDITOR (herda permissões de conteúdo ADMIN)\n       └── USER (herda de EDITOR)\n```\n\n#### Exemplos de Contexto\n\n- `users.update.own` - Pode atualizar apenas o próprio perfil\n- `users.update.any` - Pode atualizar qualquer usuário\n- `files.delete.team` - Pode deletar arquivos de membros da equipe\n- `reports.read.department` - Pode ler relatórios do próprio departamento\n\n### 📥 Coleção Insomnia\n\nObtenha a coleção completa da API para o\nInsomnia: [Download](https://raw.githubusercontent.com/gabrielmaialva33/base-acl-api/master/.github/assets/insomnia/Insomnia.json.zip)\n\n## :memo: Licença\n\nO projeto está sobre a licença [MIT](./LICENSE) ❤️\n\nGostou? Deixe uma estrela para ajudar o projeto ⭐\n\n\u003cbr\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"https://raw.githubusercontent.com/gabrielmaialva33/gabrielmaialva33/master/assets/gray0_ctp_on_line.svg?sanitize=true\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u0026copy; 2017-present \u003ca href=\"https://github.com/gabrielmaialva33/\" target=\"_blank\"\u003eMaia\u003c/a\u003e\n\u003c/p\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielmaialva33%2Fbase-acl-api","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgabrielmaialva33%2Fbase-acl-api","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgabrielmaialva33%2Fbase-acl-api/lists"}