{"id":25615319,"url":"https://github.com/eneas-almeida/bekid","last_synced_at":"2026-04-07T08:01:34.447Z","repository":{"id":46018483,"uuid":"429849482","full_name":"eneas-almeida/bekid","owner":"eneas-almeida","description":"📜 BeKid é uma aplicação com o objetivo de realizar o mapeamento de emoções para o auxílio no combate ao bullying escolar. API fullstack em NodeJs com VueJs. ","archived":false,"fork":false,"pushed_at":"2022-08-09T00:27:57.000Z","size":5969,"stargazers_count":0,"open_issues_count":0,"forks_count":1,"subscribers_count":2,"default_branch":"master","last_synced_at":"2025-02-22T03:19:16.704Z","etag":null,"topics":["apirest","docker","docker-compose","gitflow","jest","nodejs","postgres","redis","typeorm","typescript","uml"],"latest_commit_sha":null,"homepage":"","language":null,"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/eneas-almeida.png","metadata":{"files":{"readme":"README.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}},"created_at":"2021-11-19T15:40:23.000Z","updated_at":"2024-01-05T23:18:32.000Z","dependencies_parsed_at":"2022-09-02T18:42:37.974Z","dependency_job_id":null,"html_url":"https://github.com/eneas-almeida/bekid","commit_stats":null,"previous_names":["eneas-almeida/bekid"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/eneas-almeida/bekid","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eneas-almeida%2Fbekid","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eneas-almeida%2Fbekid/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eneas-almeida%2Fbekid/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eneas-almeida%2Fbekid/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/eneas-almeida","download_url":"https://codeload.github.com/eneas-almeida/bekid/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/eneas-almeida%2Fbekid/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":31504897,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-07T03:10:19.677Z","status":"ssl_error","status_checked_at":"2026-04-07T03:10:13.982Z","response_time":105,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"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":["apirest","docker","docker-compose","gitflow","jest","nodejs","postgres","redis","typeorm","typescript","uml"],"created_at":"2025-02-22T03:19:11.732Z","updated_at":"2026-04-07T08:01:34.414Z","avatar_url":"https://github.com/eneas-almeida.png","language":null,"funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bekid\n\n[![NPM](https://img.shields.io/npm/l/react)](https://github.com/venzel/bekid-backend/blob/master/LICENSE)\n\n\u003e **BeKid** é uma aplicação para o mapeamento de emoções e auxílio no combate ao bullying escolar.\u003cbr /\u003e \u003ca href=\"https://bekid.app\"\u003e👉 bekid.app\u003c/a\u003e\n\n\u003cp align=\"center\"\u003e\u003cimg src=\"./media/logos/bekid-v1.png\" width=\"240\" /\u003e\u003c/p\u003e\n\n## 👤 Autores\n\n| Foto                                              | Nome                                        | Ativo | Dt. inativo | Atribuições                   |\n| ------------------------------------------------- | ------------------------------------------- | ----- | ----------- | ----------------------------- |\n| ![Enéas Almeida](./media/images/venzel-thumb.png) | [Enéas Almeida](https://github.com/venzel/) | 🔥    | -           | Manager, Arquiteto, FullStack |\n| ![Joab Maia](./media/images/joab-thumb.png)       | [Joab Maia](https://github.com/JoabMaia/)   | 🔥    | -           | Manager and System Analyst    |\n\n## ⚓ Links\n\n👉 [Git do backend](https://github.com/venzel/bekid-backend) 🔒 (privado)\u003cbr /\u003e\n👉 [Git do frontend](https://github.com/venzel/bekid-frontend) 🔒 (privado)\u003cbr /\u003e\n👉 [Sistema em QA](https://qa.bekid.app)\u003cbr /\u003e\n👉 [Sistema em Produção](https://bekid.app)\u003cbr /\u003e\n👉 [FAQ Geral](./media/faq/FAQ.md)\n\n## Etapas de desenvolvimento\n\n1. Levantamento do problema a ser resolvido **(Briefing)**;\n2. Levantamento dos requisitos funcionais;\n3. Definição da arquitetura utilizada;\n4. Definição das tecnologias utilizadas;\n5. Definição das atribuições e cronograma de estimativas no desenvolvimento das atividades;\n6. Criação do diagrama de relacionamentos e testes de hipóteses;\n7. Desenvolvimento da documentação e diagramas explicativos no Git;\n8. Diagramação das telas (UX Design);\n9. Configurações dos ambientes de QA e Produção;\n10. Desenvolvimento do MVP.\u003cbr /\u003e\n    10.1. Desenvolvimento da backend;\u003cbr /\u003e\n    10.2. Desenvolvimento do frontend;\u003cbr /\u003e\n    10.3. Integração do frontend com o backend.\n\n## ⌛ Cronograma de estimativas no desenvolvimento das atividades\n\n| Atividade                                               | Esforço (Fibonacci) | Finalizado? | Execução |\n| ------------------------------------------------------- | ------------------- | ----------- | -------- |\n| Levantamento do problema a ser resolvido **(Briefing)** | 3                   | 🔥          | 100%     |\n| Levantamento dos requisitos funcionais                  | 1                   | 🔥          | 100%     |\n| Definição das tecnologias utilizadas                    | 1                   | 🔥          | 100%     |\n| Criação da documentação no Git                          | 13                  | 🔥          | 100%     |\n| Diagramação das telas (UX Design)                       | 13                  | 🔥          | 100%     |\n| Configuração do ambiente de QA e produção               | 5                   | 🔥          | 100%     |\n| Desenvolvimento do backend                              | 21                  | 🔥          | 100%     |\n| Desenvolvimento do frontend                             | 21                  | 🔥          | 100%     |\n| Integração do backend com o frontend                    | 21                  | 🔥          | 100%     |\n\n### Significados dos esforços na escala Fibonacci\n\n-   **Esforço 1** - Representa \u003e= 1 hora e \u003c= 7 horas.\n-   **Esforço 3** - Representa \u003e 21 horas e \u003c= 35 horas.\n-   **Esforço 5** - Representa \u003e 35 horas e \u003c= 42 horas.\n-   **Esforço 13** - Representa \u003e 49 horas e \u003c= 70 horas.\n-   **Esforço 21** - Representam horas não determinadas.\n\n👉 [Mais sobre a metodologia de esforço Fibonacci](./media/docs/fibonacci.md)\n\n## Backend\n\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/nodejs-icon.svg\" alt=\"NodeJs\" title=\"NodeJs\" width=\"30\" height=\"30\" /\u003e\n  \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/typescript.svg\" alt=\"Typescript\" title=\"Typescript\" width=\"30\" height=\"30\" /\u003e\n  \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/logo-javascript.svg\" alt=\"Javascript\" title=\"Javascript\" width=\"30\" height=\"30\" /\u003e\n  \u003cimg src=\"./media/icons/jest.svg\" alt=\"Jest\" title=\"Jest\" width=\"30\" height=\"30\" /\u003e\n\u003c/p\u003e\n\n-   NodeJs/Express\n-   Typescript / Javascript\n-   TypeORM / Postgres / MongoDB / Redis\n-   Testes com métricas de coverages (**Jest**)\n\n👉 [Link para a documentação no git do backend](./backend/README.md)\u003cbr /\u003e\n\n## Persistência dos dados\n\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"./media/icons/postgres.svg\" alt=\"Postgres\" title=\"Postgres\" width=\"35\" height=\"35\" /\u003e\n  \u003cimg src=\"./media/icons/mongodb.svg\" alt=\"MongoDB\" title=\"MongoDB\" width=\"35\" height=\"35\" /\u003e\n  \u003cimg src=\"./media/icons/redis.svg\" alt=\"Redis\" title=\"Redis\" width=\"40\" height=\"40\" /\u003e\n  \u003cimg src=\"./media/icons/docker.svg\" alt=\"Docker\" title=\"Docker\" width=\"40\" height=\"40\" /\u003e\n\u003c/p\u003e\n\n-   Postgres\n-   MongoDB\n-   Redis\n\n\\* Os bancos de dados são provenientes de containers do docker.\n\n### TypeORM\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/images/typeorm.png\" alt=\"TypeORM\" width=\"250\" /\u003e\n\u003c/p\u003e\n\nO **TypeORM** é um ORM que pode ser utilizado em plataformas como o Node, NestJs, dentre outras, e que possibilita o desenvolvimento tanto com JavaScript como com TypeScript. O TypeORM foi inspirado no Hibernate e Entity Framework, oferece suporte a Decorators e trabalha com bancos de dados como PostgreSQL, Microsoft SQL Server, e atualmente com MongoDB.\n\n👉 [Mais informações sobre o TypeORM na Medium](https://medium.com/@matheusbessa_44838/orm-no-nodejs-com-typeorm-a3b3d8a22240)\u003cbr /\u003e\n👉 [Documentação oficial do TypeORM](https://typeorm.io/)\n\n## Frontend\n\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/vue-9.svg\" alt=\"VueJs\" title=\"VueJs\" width=\"30\" height=\"30\" /\u003e\n  \u003cimg src=\"./media/icons/vuetify.svg\" alt=\"Vuetify\" title=\"Vuetify\" height=\"30\" /\u003e\n  \u003cimg src=\"https://cdn.worldvectorlogo.com/logos/logo-javascript.svg\" alt=\"Javascript\" title=\"Javascript\" width=\"30\" height=\"40\" /\u003e \n\u003c/p\u003e\n\n-   VueJs\n-   Vuetify\n-   Javascript\n\n👉 [Link para a documentação no git do frontend](./frontend/README.md)\u003cbr /\u003e\n👉 [Link da documentação oficial do VueJs](https://vuejs.org/guide/introduction.html)\u003cbr /\u003e\n👉 [Link da documentação oficial do Vuetify](https://vuetifyjs.com/en/introduction/why-vuetify/#feature-guides)\n\n### Telas do sistema (UX)\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/ux/ux-v2.png\" alt=\"Telas\" title=\"telas\" /\u003e\n\u003c/p\u003e\n\n| Descrição      | Data de modificação | Versão | Link de download                 |\n| -------------- | ------------------- | ------ | -------------------------------- |\n| Segunda versão | 08 de abril de 2022 | v2     | [Download](./media/ux/ux-v1.pdf) |\n\n👉 [Link do arquivo PDF](./media/ux/ux-v1.pdf)\n\n### Prints do sistema\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/login.png\" alt=\"Tela de login\" title=\"tela de login\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/cadastro.png\" alt=\"Cadastro\" title=\"Cadastro\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/dashboard-admin.png\" alt=\"Dashboard do admin\" title=\"Dashboard do admin\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/escolas.png\" alt=\"Lista de escolas\" title=\"Lista de escolas\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/listagem-mobile.png\" alt=\"Listagem de emotions mobile\" title=\"Listagem de emotions mobile\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/desativar-ator.png\" alt=\"Desativar ator\" title=\"Desativar ator\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/confirma-exclusao.png\" alt=\"Confirma exclusão\" title=\"Confirma exclusão\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/dashboard-escola.png\" alt=\"Dashboard do escola\" title=\"Dashboard do escola\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/alunos-vinculados.png\" alt=\"Editar campanha\" title=\"Editar campanha\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/editar-campanha.png\" alt=\"Editar campanha\" title=\"Editar campanha\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/editar-campanha-mobile.png\" alt=\"Editar campanha mobile\" title=\"Editar campanha mobile\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/fila-usuario.png\" alt=\"Fila de usuários\" title=\"Fila de usuários\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/tela-voto-emotion.png\" alt=\"Tela de voto do emotion\" title=\"Tela de voto do emotion\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/tela-voto-autor.png\" alt=\"Tela de voto do autor\" title=\"Tela de voto do autor\" /\u003e\n\u003c/p\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003cimg src=\"./media/screens/tela-voto-motivo.png\" alt=\"Tela de voto do motivo\" title=\"Tela de voto do motivo\" /\u003e\n\u003c/p\u003e\n\n## Backend/Frontend\n\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"./media/icons/docker.svg\" alt=\"Docker\" title=\"Docker\" width=\"30\" height=\"30\" /\u003e\n  \u003cimg src=\"./media/icons/codeship.svg\" alt=\"Codeship\" title=\"Codeship\" width=\"30\" height=\"30\" /\u003e\n\u003c/p\u003e\n\n-   Docker\n-   Codeship (**CI/CD**)\n\n👉 [Link para a faq do Docker](./media/faq/geral/docker-commands.md)\u003cbr /\u003e\n👉 [Link para a faq do Codeship](./media/faq/geral/codeship.md)\n\n## Infraestrutura\n\n\u003cp align=\"left\"\u003e\n  \u003cimg src=\"./media/icons/nginx.svg\" alt=\"Docker\" title=\"Nginx\" width=\"30\" height=\"30\" /\u003e\n  \u003cimg src=\"./media/images/pm2.png\" alt=\"PM2\" title=\"PM2\" height=\"30\" /\u003e\n  \u003cimg src=\"./media/icons/docker.svg\" alt=\"Docker\" title=\"Docker\" width=\"30\" height=\"30\" /\u003e\n  \u003cimg src=\"./media/images/certbot.png\" alt=\"Certbot\" title=\"Certbot\" height=\"30\" /\u003e\n\u003c/p\u003e\n\n-   Nginx\n-   PM2\n-   Docker\n-   Certbot\n\n👉 [Link para faq do Nginx](./media/faq/geral/nginx-install-and-configure.md)\u003cbr /\u003e\n👉 [Link para faq do PM2](./media/faq/geral/pm2-configurations.md)\u003cbr /\u003e\n👉 [Link para faq do Docker](./media/faq/geral/docker-commands.md)\u003cbr /\u003e\n👉 [Link para faq do Certbot](./media/faq/geral/certbot.md)\n\n## Arquitetura\n\n### Organização do backend (Feature by Package)\n\n**Feature by Package** é uma arquitetura que utiliza conceitos do **DDD (Domain Driven Design)**, com o objetivo de tornar o código mais **flexível**, **escalável** e de **manutenção simples**.\n\n### Vantagens da arquitetura\n\n-   **Manutenção**: Facilita o engajamento de multiplas equipe e colaboradores em um projeto;\n-   **Escalável**: Facilita refatoramento do código monolítico para uma uma estrura de microserviços;\n-   **SOLID**: Facilita a aplicação de todos os princípios do SOLID;\n-   **Git**: Melhora o gerenciamento dos commits, evitando conflitos e etc;\n-   **Testes**: Facilita o desenvolvimento de testes de unidade e integração.\n\n### Estratégia de captura de erros com o Sentry\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/images/sentry.png\" alt=\"Sentry\" /\u003e\n\u003c/p\u003e\n\nO **Sentry** é um serviço open source para logar erros da aplicação.\n\nA aplicação é configurada para que sempre que ocorrer um erro do tipo 500, a exceção seja capturada e catalogada no Sentry, indicando exatamente a linha que ocorreu o erro, assim como dados de data e hora, tornando mais fácil a identificação de bugs, como mostra no exemplo abaixo:\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/images/sentry-erro.png\" alt=\"Sentry erro\" width=\"700\" /\u003e\n\u003c/p\u003e\n\n👉 [Mais informações sobre o Sentry](https://blog.locaweb.com.br/temas/codigo-aberto/voce-consegue-prever-os-bugs-de-sua-aplicacao/)\u003cbr /\u003e\n👉 [Link oficial do serviço](https://sentry.io)\n\n## Tests com métricas coverages\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/images/testes.png\" alt=\"Testes\" title=\"Testes\" width=\"700\" /\u003e\n\u003c/p\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eEstrutura de módulos do backend\u003c/summary\u003e\n\n-   Models\n-   Infra\n-   Dtos\n-   Repositories\n-   Containers\n-   Providers\n-   UseCases (Middlewares, Controllers, Services, Validators)\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eEstrutura de arquivos dos módulos do backend\u003c/summary\u003e\n\n```\n├── containers\n│   └── index.ts\n├── dtos\n│   ├── ICreateVoteDTO.ts\n│   └── IDeleteVoteDTO.ts\n├── infra\n│   ├── http\n│   │   └── routes\n│   │       └── VoteRoutes.ts\n│   └── typeorm\n│       └── postgres\n│           ├── entities\n│           │   └── VotePostgresEntity.ts\n│           └── repositories\n│               └── VotePostgresRepository.ts\n├── models\n│   └── entities\n│       ├── IVoteEntity.ts\n│       └── VoteInMemoryEntity.ts\n├── repositories\n│   ├── IVoteRepository.ts\n│   └── VoteInMemoryRepository.ts\n└── useCases\n    ├── CreateVote\n    │   ├── CreateVoteController.ts\n    │   ├── CreateVoteMiddleware.ts\n    │   ├── CreateVoteService.ts\n    │   └── CreateVoteValidator.ts\n    ├── DeleteVote\n    │   ├── DeleteVoteController.ts\n    │   ├── DeleteVoteMiddleware.ts\n    │   ├── DeleteVoteService.ts\n    │   └── DeleteVoteValidator.ts\n    └── ListVote\n        ├── ListVoteController.ts\n        ├── ListVoteMiddleware.ts\n        └── ListVoteService.ts├── containers\n│   └── index.ts\n├── dtos\n│   ├── ICreateVoteDTO.ts\n│   └── IDeleteVoteDTO.ts\n├── infra\n│   ├── http\n│   │   └── routes\n│   │       └── VoteRoutes.ts\n│   └── typeorm\n│       └── postgres\n│           ├── entities\n│           │   └── VotePostgresEntity.ts\n│           └── repositories\n│               └── VotePostgresRepository.ts\n├── models\n│   └── entities\n│       ├── IVoteEntity.ts\n│       └── VoteInMemoryEntity.ts\n├── repositories\n│   ├── IVoteRepository.ts\n│   └── VoteInMemoryRepository.ts\n└── useCases\n    ├── CreateVote\n    │   ├── CreateVoteController.ts\n    │   ├── CreateVoteMiddleware.ts\n    │   ├── CreateVoteService.ts\n    │   └── CreateVoteValidator.ts\n    ├── DeleteVote\n    │   ├── DeleteVoteController.ts\n    │   ├── DeleteVoteMiddleware.ts\n    │   ├── DeleteVoteService.ts\n    │   └── DeleteVoteValidator.ts\n    └── ListVote\n        ├── ListVoteController.ts\n        ├── ListVoteMiddleware.ts\n        └── ListVoteService.ts\n```\n\n\u003c/details\u003e\n\n## Diagrama de relacionamentos\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/diagrams/diagram-v5.png\" width=\"700\" /\u003e\n\u003c/p\u003e\n\n| Descrição                  | Data de modificação | Versão | Link de download                            |\n| -------------------------- | ------------------- | ------ | ------------------------------------------- |\n| Quarta versão do documento | 01 de abril de 2022 | v4     | [Download](./media/diagrams/diagram-v4.png) |\n| Quinta versão do documento | 25 de maio de 2022  | v5     | [Download](./media/diagrams/diagram-v5.png) |\n\n👉 [Download do arquivo do Astah](./media/diagrams/diagram-relational-v2.asta)\n\n\u003cdetails\u003e\n\u003csummary\u003eJSON\u003c/summary\u003e\n\n```json\n{\n    \"USERS\": [\n        {\n            \"id\": 1,\n            \"name\": \"Vanessa\",\n            \"role\": \"ADMIN\"\n        },\n        {\n            \"id\": 2,\n            \"name\": \"tiago\",\n            \"role\": \"MANAGER\"\n        },\n        {\n            \"id\": 3,\n            \"name\": \"alex\",\n            \"role\": \"USER\"\n        },\n        {\n            \"id\": 4,\n            \"name\": \"liz\",\n            \"role\": \"USER\"\n        }\n    ],\n    \"GROUPS\": [\n        {\n            \"id\": 1,\n            \"manager_id\": 2,\n            \"name\": \"4 serie fundamental - turma A\",\n            \"users\": []\n        },\n        {\n            \"id\": 2,\n            \"manager_id\": 2,\n            \"name\": \"5 serie fundamental - turma A\",\n            \"users\": []\n        }\n    ],\n    \"GROUP_QUEUE\": [\n        {\n            \"id\": 1,\n            \"group_id\": 2,\n            \"user_id\": 1,\n            \"created_at\": \"26-12-2021\"\n        }\n    ],\n    \"GROUPS_USERS\": [\n        {\n            \"group_id\": 1,\n            \"user_id\": 2,\n            \"created_at\": \"26-12-2021\"\n        },\n        {\n            \"group_id\": 1,\n            \"user_id\": 3,\n            \"created_at\": \"26-12-2021\"\n        },\n        {\n            \"group_id\": 1,\n            \"user_id\": 4,\n            \"created_at\": \"26-12-2021\"\n        }\n    ],\n    \"CAMPAIGNS\": [\n        {\n            \"id\": 1,\n            \"group_id\": 1,\n            \"manager_id\": 1,\n            \"name\": \"Primeira dinamica em grupo\",\n            \"expiration\": null\n        },\n        {\n            \"id\": 2,\n            \"group_id\": 1,\n            \"manager_id\": 1,\n            \"name\": \"Segunda dinamica em grupo\",\n            \"expiration\": \"28-12-2021\"\n        }\n    ],\n    \"CAMPAIGN_QUEUE\": [\n        {\n            \"id\": 1,\n            \"campaign_id\": 1,\n            \"user_id\": 2,\n            \"created_at\": \"26-12-2021\"\n        },\n        {\n            \"id\": 2,\n            \"campaign_id\": 1,\n            \"user_id\": 3,\n            \"created_at\": \"26-12-2021\"\n        },\n        {\n            \"id\": 3,\n            \"campaign_id\": 1,\n            \"user_id\": 4,\n            \"created_at\": \"26-12-2021\"\n        }\n    ],\n    \"EMOTIONS\": [\n        {\n            \"id\": 1,\n            \"slug\": \"alegre\",\n            \"name\": \"Alegre\"\n        },\n        {\n            \"id\": 2,\n            \"slug\": \"triste\",\n            \"name\": \"Triste\"\n        },\n        {\n            \"id\": 3,\n            \"slug\": \"raiva\",\n            \"name\": \"Raiva\"\n        },\n        {\n            \"id\": 4,\n            \"slug\": \"medo\",\n            \"name\": \"Medo\"\n        }\n    ],\n    \"ACTORS\": [\n        {\n            \"id\": 1,\n            \"name\": \"Colega\",\n            \"slug\": \"colega\"\n        },\n        {\n            \"id\": 2,\n            \"name\": \"Pai\",\n            \"slug\": \"pai\"\n        },\n        {\n            \"id\": 3,\n            \"name\": \"Padastro\",\n            \"slug\": \"padastro\"\n        },\n        {\n            \"id\": 4,\n            \"name\": \"Mãe\",\n            \"slug\": \"mae\"\n        },\n        {\n            \"id\": 5,\n            \"name\": \"Madastra\",\n            \"slug\": \"madastra\"\n        },\n        {\n            \"id\": 6,\n            \"name\": \"Irmão\",\n            \"slug\": \"irmao\"\n        },\n        {\n            \"id\": 7,\n            \"name\": \"Escola\",\n            \"slug\": \"escola\"\n        }\n    ],\n    \"REASONS\": [\n        {\n            \"id\": 1,\n            \"emotion_id\": 2,\n            \"description\": \"Me apelidaram\"\n        },\n        {\n            \"id\": 2,\n            \"emotion_id\": 2,\n            \"description\": \"Bateram em mim\"\n        },\n        {\n            \"id\": 3,\n            \"emotion_id\": 2,\n            \"description\": \"Meu pai esta doente\"\n        },\n        {\n            \"id\": 4,\n            \"emotion_id\": 2,\n            \"description\": \"Cai da bicicleta\"\n        }\n    ],\n    \"VOTES\": [\n        {\n            \"id\": 1,\n            \"campaign_id\": 1,\n            \"emotion_id\": 1,\n            \"user_id\": 2\n        },\n        {\n            \"id\": 2,\n            \"campaign_id\": 1,\n            \"emotion_id\": 1,\n            \"user_id\": 3\n        }\n    ],\n    \"VOTES_ACTORS\": [\n        {\n            \"id\": 1,\n            \"vote_id\": 1,\n            \"actor_id\": 1,\n            \"user_id\": 2\n        },\n        {\n            \"id\": 2,\n            \"vote_id\": 1,\n            \"actor_id\": 1,\n            \"user_id\": 2\n        }\n    ],\n    \"VOTES_REASONS\": [\n        {\n            \"id\": 1,\n            \"vote_id\": 1,\n            \"user_id\": 2,\n            \"reason_id\": 1\n        },\n        {\n            \"id\": 1,\n            \"vote_id\": 1,\n            \"user_id\": 2,\n            \"reason_id\": 2\n        },\n        {\n            \"id\": 1,\n            \"vote_id\": 1,\n            \"user_id\": 2,\n            \"reason_id\": 3\n        }\n    ],\n    \"VOTES_COMMENTS\": [\n        {\n            \"id\": 1,\n            \"vote_id\": 1,\n            \"user_id\": 2,\n            \"message\": \"Estou com fome\"\n        }\n    ]\n}\n```\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eRequisitos funcionais\u003c/summary\u003e\n\n-   **ADMIN**: É o gestor master do sistema, ator que tem acesso irrestrito ao painel administrativo.\n-   **GERENTE**: É considerado o professor, ator que irá gerir os alunos (usuários).\n-   **USUÁRIO**: É considerado o aluno, ator que paticipa da campanha e realia o voto.\n\n### Usuário/Gerente/Admin\n\n1. O **USUÁRIO/GERENTE/ADMIN** deve poder efetuar o **login/logout**;\n2. O **USUÁRIO/GERENTE** deve poder se **cadastrar**;\n3. O **USUÁRIO/GERENTE** deve poder **alterar o perfil** (nome);\n4. O **USUÁRIO/GERENTE** deve poder **alterar a senha**;\n5. O **USUÁRIO/GERENTE/ADMIN** deve poder **recuperar a senha**;\n6. O **ADMIN** deve poder **visualizar os usuários** do sistema;\n7. O **ADMIN** deve poder **deletar um usuário** do sistema;\n8. O **ADMIN** deve poder **desabilitar/habilitar um usuário** do sistema.\n\n### Emotion\n\n1. O **ADMIN** deve poder **criar um emotion**;\n2. O **ADMIN** deve poder **alterar um emotion**;\n3. O **ADMIN** deve poder **habilitar/desabilitar um emotion**;\n4. O **ADMIN** deve poder **deletar um emotion**.\n\n### Razão\n\n1. O **ADMIN** deve poder **criar uma razão**;\n2. O **ADMIN** deve poder **alterar uma razão**;\n3. O **ADMIN** deve poder **habilitar/desabilitar uma razão**;\n4. O **ADMIN** deve poder **deletar uma razão**.\n\n### Ator\n\n1. O **ADMIN** deve poder **criar um ator**;\n2. O **ADMIN** deve poder **alterar um ator**;\n3. O **ADMIN** deve poder **habilitar/desabilitar um ator**;\n4. O **ADMIN** deve poder **deletar um ator**.\n\n### Grupo\n\n1. O **GERENTE** deve poder **criar um grupo**;\n2. O **GERENTE** deve poder **alterar um grupo**;\n3. O **GERENTE** deve poder **deletar um grupo**;\n4. O **GERENTE** deve poder **enviar uma solicitação para USUÁRIO entrar em um grupo**;\n5. O **GERENTE** deve poder **remover um USUÁRIO de um grupo**.\n\n### Campanha\n\n1. O **GERENTE** deve poder **criar uma campanha**;\n2. O **GERENTE** deve poder **alterar uma campanha**;\n3. O **GERENTE** deve poder **deletar uma campanha**;\n4. O **GERENTE** deve poder **iniciar uma campanha**;\n5. O **GERENTE** deve poder **finalizar uma campanha**.\n\n### Usuário\n\n1. O **USUÁRIO** deve poder **aceitar/negar a solicitação da entrada em um grupo**;\n2. O **USUÁRIO** deve poder **efetuar uma votação**;\n\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eEndpoints do backend (API)\u003c/summary\u003e\n\n| Path                                                                                                                 | Método | Token | Role               | Descrição                       |\n| -------------------------------------------------------------------------------------------------------------------- | ------ | ----- | ------------------ | ------------------------------- |\n| **USER/MANAGER/ADMIN**                                                                                               |\n| [/login](https://bekid.app/api/v1/login)                                                                             | POST   |       | ALL                | Efetua login                    |\n| [/users](https://bekid.app/api/v1/users)                                                                             | POST   |       | USER/MANAGER       | Cria uma conta                  |\n| [/users](https://bekid.app/api/v1/users)                                                                             | GET    |       | ADMIN              | Lista usuários                  |\n| [/users/{id}](https://bekid.app/api/v1/users/1)                                                                      | GET    |       | ADMIN              | Exibe usuário                   |\n| [/users/{id}](https://bekid.app/api/v1/users/1)                                                                      | PUT    |       | ADMIN              | Atualiza usuário                |\n| [/users/{id}](https://bekid.app/api/v1/users/1)                                                                      | DELETE |       | ADMIN              | Deleta usuário                  |\n| [/change_password](https://bekid.app/api/v1/change_password)                                                         | PUT    |       | USER/MANAGER/ADMIN | Altera senha                    |\n| [/forgot_password](https://bekid.app/api/v1/forgot_password)                                                         | PUT    |       | USER/MANAGER/ADMIN | Esqueceu a senha                |\n| [/reset_password](https://bekid.app/api/v1/reset_password)                                                           | PATCH  |       | USER/MANAGER/ADMIN | Reseta a senha                  |\n| [/change_avatar](https://bekid.app/api/v1/change_avatar)                                                             | PATCH  |       | USER/MANAGER/ADMIN | Altera avatar                   |\n| [/change_profile](https://bekid.app/api/v1/change_profile)                                                           | PUT    |       | USER/MANAGER/ADMIN | Altera o perfil                 |\n| [/toggle_role/{id}](https://bekid.app/api/v1/toggle_role/1)                                                          | PATCH  |       | ADMIN              | Alterna a patente               |\n| [/toggle_allow/{id}](https://bekid.app/api/v1/toggle_allow/1)                                                        | PATCH  |       | ADMIN              | Alterna o status                |\n| **EMOTION**                                                                                                          |\n| [/emotions](https://bekid.app/api/v1/emotions)                                                                       | POST   |       | ADMIN              | Cria emotion                    |\n| [/emotions](https://bekid.app/api/v1/emotions)                                                                       | GET    |       | ADMIN              | Lista emotions                  |\n| [/emotions/{id}](https://bekid.app/api/v1/emotions/1)                                                                | GET    |       | ADMIN              | Exibe emotion                   |\n| [/emotions/{id}](https://bekid.app/api/v1/emotions/1)                                                                | PUT    |       | ADMIN              | Atualiza emotion                |\n| [/emotions/{id}](https://bekid.app/api/v1/emotions/1)                                                                | DELETE |       | ADMIN              | Deleta emotion                  |\n| **REASON**                                                                                                           |\n| [/reasons](https://bekid.app/api/v1/reasons)                                                                         | POST   |       | ADMIN              | Cria motivo                     |\n| [/reasons](https://bekid.app/api/v1/reasons)                                                                         | GET    |       | ADMIN              | Lista motivos                   |\n| [/reasons/{id}](https://bekid.app/api/v1/reasons/1)                                                                  | GET    |       | ADMIN              | Exibe motivo                    |\n| [/reasons/{id}](https://bekid.app/api/v1/reasons/1)                                                                  | PUT    |       | ADMIN              | Atualiza motivo                 |\n| [/reasons/{id}](https://bekid.app/api/v1/reasons/1)                                                                  | DELETE |       | ADMIN              | Deleta motivo                   |\n| **ACTOR**                                                                                                            |\n| [/actors](https://bekid.app/api/v1/actors)                                                                           | POST   |       | ADMIN              | Cria ator                       |\n| [/actors](https://bekid.app/api/v1/actors)                                                                           | GET    |       | ADMIN              | Lista ators                     |\n| [/actors/{id}](https://bekid.app/api/v1/actors/1)                                                                    | GET    |       | ADMIN              | Exibe ator                      |\n| [/actors/{id}](https://bekid.app/api/v1/actors/1)                                                                    | PUT    |       | ADMIN              | Atualiza ator                   |\n| [/actors/{id}](https://bekid.app/api/v1/actors/1)                                                                    | DELETE |       | ADMIN              | Deleta ator                     |\n| **GROUP**                                                                                                            |\n| [/groups](https://bekid.app/api/v1/groups)                                                                           | POST   |       | MANAGER            | Cria grupo                      |\n| [/groups](https://bekid.app/api/v1/groups)                                                                           | GET    |       | MANAGER            | Lista grupos                    |\n| [/groups/{id}](https://bekid.app/api/v1/groups/1)                                                                    | GET    |       | MANAGER            | Exibe grupo                     |\n| [/groups/{id}](https://bekid.app/api/v1/groups/1)                                                                    | PUT    |       | MANAGER            | Atualiza grupo                  |\n| [/groups/{id}](https://bekid.app/api/v1/groups/1)                                                                    | DELETE |       | MANAGER            | Deleta grupo                    |\n| **GROUP_QUEUE**                                                                                                      |\n| [/invite_user_in_group...](https://bekid.app/api/v1/invite_user_in_group?group_id=2\u0026user_id=2)                       | GET    |       | MANAGER            | Convida usuário para um grupo   |\n| [/delete_invite_user_in_group...](https://bekid.app/api/v1/delete_invite_user_in_group?group_queue_id=2)             | GET    |       | MANAGER            | Deleta convite usuário p/ grupo |\n| [/monitore_group_queue](https://bekid.app/api/v1/monitore_group_queue)                                               | GET    |       | MANAGER            | Monitora a fila de grupos       |\n| **CAMPAIGN**                                                                                                         |\n| [/campaigns](https://bekid.app/api/v1/campaigns)                                                                     | POST   |       | MANAGER            | Cria campanha                   |\n| [/campaigns](https://bekid.app/api/v1/campaigns)                                                                     | GET    |       | MANAGER            | Lista campanhas                 |\n| [/campaigns/{id}](https://bekid.app/api/v1/campaigns/1)                                                              | GET    |       | MANAGER            | Exibe campanha                  |\n| [/campaigns/{id}](https://bekid.app/api/v1/campaigns/1)                                                              | PUT    |       | MANAGER            | Atualiza campanha               |\n| [/campaigns/{id}](https://bekid.app/api/v1/campaigns/1)                                                              | DELETE |       | MANAGER            | Deleta campanha                 |\n| **CAMPAIGN_QUEUE**                                                                                                   |\n| [/monitore_campaign_queue](https://bekid.app/api/v1/monitore_campaign_queue)                                         | GET    |       | MANAGER            | Monitora fila de campanhas      |\n| **VOTES**                                                                                                            |\n| [/votes?campaign_id={id}\u0026emotion_id={id}](https://bekid.app/api/v1/add_one_user_in_group_queue?group_id=2\u0026user_id=2) | PUT    |       | USER               | Cria voto                       |\n| [/votes](https://bekid.app/api/v1/votes)                                                                             | GET    |       | USER               | Lista votos                     |\n| [/votes/{id}](https://bekid.app/api/v1/votes/1)                                                                      | DELETE |       | USER               | Deleta voto                     |\n| **VOTE_ACTOR**                                                                                                       |\n| [/votes_actors](https://bekid.app/api/v1/votes_actors)                                                               | PUT    |       | USER               | Associa o ator ao voto          |\n| [/votes_actors](https://bekid.app/api/v1/votes_actors)                                                               | GET    |       | USER               | Lista os associações            |\n| **VOTE_REASON**                                                                                                      |\n| [/votes_reasos](https://bekid.app/api/v1/votes_reasons)                                                              | PUT    |       | USER               | Associa o motivo ao voto        |\n| [/votes_reasos](https://bekid.app/api/v1/votes_reasons)                                                              | GET    |       | USER               | Lista os motivos                |\n| **VOTE_COMMENT**                                                                                                     |\n| [/votes_comments](https://bekid.app/api/v1/votes_comments)                                                           | PUT    |       | USER               | Associa comentário ao voto      |\n| [/votes_comments](https://bekid.app/api/v1/votes_comments)                                                           | GET    |       | USER               | Lista os comentários            |\n\n\u003c/details\u003e\n\n## Download do projeto no Insomnia\n\n[![Run in Insomnia}](https://insomnia.rest/images/run.svg)](https://insomnia.rest/run/?label=Bekid\u0026uri=https%3A%2F%2Fraw.githubusercontent.com%2Fvenzel%2Fbekid-backend%2Fmaster%2./media/insomnia/Insomnia_2022-04-08.json)\n\n## CI/CD\n\n### Gitflow\n\nO Gitflow é um fluxo de trabalho que auxilia o desenvolvimento contínuo de software entre a equipe envolvida.\n\n👉 \u003ca href=\"https://www.atlassian.com/br/git/tutorials/comparing-workflows/gitflow-workflow\"\u003eMais informações\u003c/a\u003e\n\n## Branchs\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/images/gitflow-v1.png\" alt=\"Gitflow\" width=\"700\" /\u003e\n\u003c/p\u003e\n\n-   **user** - Envia commits apenas para o próprio user, exemplo: tiago-feature-21.\n-   **develop** - Recebe merges dos users. (**Ambiente de QA**)\n-   **master** 🔒 - Recebe merges da develop, no final de uma release. (**Ambiente de produção**)\n\n### Diretrizes\n\n\\* A branch **master** 🔒 é bloqueada para receber commits de usuários.\u003cbr /\u003e \\* A branch **master** representa o software em **produção**.\u003cbr /\u003e \\* A branch **develop** representa o software em **QA**.\u003cbr /\u003e \\* Fica determinado que sempre que um merge request na branch develop for aprovado ou reprovado, a branch do usuário **NÃO** será deletada, a fim de manter o histórico de branchs.\n\n👉 [Documentação completa do gitflow - passo a passo](./media/docs/gitflow.md)\n\n## Padronização de commits (Conventional Commits)\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/icons/branch.svg\" alt=\"Branch\" width=\"150\" /\u003e\n\u003c/p\u003e\n\n**Conventional Commits** é uma convenção de mensagens de commits. Essa convenção descrevendo os recursos, correções e alterações importantes feitas nas mensagens.\n\n### Flags utilizadas:\n\n| Ícone | Flag         | Descrição                                                                                                |\n| ----- | ------------ | -------------------------------------------------------------------------------------------------------- |\n| 🪲    | **fix**      | Correção de bug para o usuário.                                                                          |\n| ☂️    | **feat**     | Desenvolvimento de uma nova funcionalidade.                                                              |\n| 📃    | **docs**     | Alterações na documentação.                                                                              |\n| ✂️    | **refactor** | Refatoração de um bloco de código.                                                                       |\n| 💅    | **style**    | Formatação, falta de ponto e vírgula, etc.                                                               |\n| 🔧    | **perf**     | Uma mudança de código que melhora o desempenho.                                                          |\n| 🔨    | **build**    | Alterações que afetam o sistema de compilação ou dependências externas (escopos de exemplo: gulp e npm). |\n| 🪀    | **ci**       | Alterações em arquivos e scripts de configuração de CI (escopos de exemplo: Travis, Circle e Codeship).  |\n| 🧪    | **test**     | Adicionando testes ausentes ou corrigindo testes existentes.                                             |\n\n### Exemplos de commits utilizando a padronização\n\n```bash\n# Exemplo 1\ngit commit -m \"🪲 fix: corrige bug da listagem de usuários.\"\n```\n\n```bash\n# Exemplo 2\ngit commit -m \"☂️ feat: cria o módulo de pontos.\"\n```\n\n👉 [Mais informações](https://www.conventionalcommits.org/en/v1.0.0/)\n\n## Prettier\n\n\u003cp align=\"center\"\u003e\n    \u003cimg src=\"./media/images/prettier-v1.png\" alt=\"Prettier\" width=\"250\" /\u003e\n\u003c/p\u003e\n\nO **Prettier** é um formatador de código que visa ajudar os desenvolvedores a escrever aplicações que são mais fáceis de entender e mais uniformizadas entre as diversas formas de programar que existem.\n\nArquivo **.prettierrc** na raiz do projeto.\n\n```json\n{\n    \"semi\": true,\n    \"tabWidth\": 4,\n    \"printWidth\": 90,\n    \"singleQuote\": true,\n    \"trailingComma\": \"es5\"\n}\n```\n\n👉 [Link oficial](https://prettier.io)\n\n## Pipeline\n\nO **Codeship** é um serviço de entrega contínua hospedado que se concentra na velocidade, confiabilidade e simplicidade. Em nossa arquitetura, o Codeship é integrado com o Github, ele identifica automaticamente quando um commit é realizado e dá sequência na entrega para os ambientes pré configurados, como demonstra na imagem abaixo:\n\n![Gitflow](./media/images/deploy.png)\n\n👉 [Link do arquivo no Lucidchart](https://lucid.app/documents/view/e3f44502-6734-49bd-bb02-aa1b2c4c54da)\n\n### Etapas\n\n1 - **Lint**: Nessa etapa é verificada as regras do Sonarlint;\u003cbr /\u003e\n2 - **Test**: Nessa etapa é realizado os testes unitários;\u003cbr /\u003e\n3 - **Build**: Nessa etapa é realizado o build da aplicação.\n\n\u003chr\u003e\n\n© Documento de autorias de \u003ca href=\"https://github.com/venzel/\"\u003eEnéas Almeida\u003c/a\u003e e \u003ca href=\"https://github.com/JoabMaia/\"\u003eJoab Maia\u003c/a\u003e.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feneas-almeida%2Fbekid","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Feneas-almeida%2Fbekid","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Feneas-almeida%2Fbekid/lists"}