BeKid é uma aplicação para o mapeamento de emoções e auxílio no combate ao bullying escolar.
👉 bekid.app
Foto | Nome | Ativo | Dt. inativo | Atribuições |
---|---|---|---|---|
Enéas Almeida | 🔥 | - | Manager, Arquiteto, FullStack | |
Joab Maia | 🔥 | - | Manager and System Analyst |
👉 Git do backend 🔒 (privado)
👉 Git do frontend 🔒 (privado)
👉 Sistema em QA
👉 Sistema em Produção
👉 FAQ Geral
- Levantamento do problema a ser resolvido (Briefing);
- Levantamento dos requisitos funcionais;
- Definição da arquitetura utilizada;
- Definição das tecnologias utilizadas;
- Definição das atribuições e cronograma de estimativas no desenvolvimento das atividades;
- Criação do diagrama de relacionamentos e testes de hipóteses;
- Desenvolvimento da documentação e diagramas explicativos no Git;
- Diagramação das telas (UX Design);
- Configurações dos ambientes de QA e Produção;
- Desenvolvimento do MVP.
10.1. Desenvolvimento da backend;
10.2. Desenvolvimento do frontend;
10.3. Integração do frontend com o backend.
Atividade | Esforço (Fibonacci) | Finalizado? | Execução |
---|---|---|---|
Levantamento do problema a ser resolvido (Briefing) | 3 | 🔥 | 100% |
Levantamento dos requisitos funcionais | 1 | 🔥 | 100% |
Definição das tecnologias utilizadas | 1 | 🔥 | 100% |
Criação da documentação no Git | 13 | 🔥 | 100% |
Diagramação das telas (UX Design) | 13 | 🔥 | 100% |
Configuração do ambiente de QA e produção | 5 | 🔥 | 100% |
Desenvolvimento do backend | 21 | 🔥 | 100% |
Desenvolvimento do frontend | 21 | 🔥 | 100% |
Integração do backend com o frontend | 21 | 🔥 | 100% |
- Esforço 1 - Representa >= 1 hora e <= 7 horas.
- Esforço 3 - Representa > 21 horas e <= 35 horas.
- Esforço 5 - Representa > 35 horas e <= 42 horas.
- Esforço 13 - Representa > 49 horas e <= 70 horas.
- Esforço 21 - Representam horas não determinadas.
👉 Mais sobre a metodologia de esforço Fibonacci
- NodeJs/Express
- Typescript / Javascript
- TypeORM / Postgres / MongoDB / Redis
- Testes com métricas de coverages (Jest)
👉 Link para a documentação no git do backend
- Postgres
- MongoDB
- Redis
* Os bancos de dados são provenientes de containers do docker.
O 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.
👉 Mais informações sobre o TypeORM na Medium
👉 Documentação oficial do TypeORM
- VueJs
- Vuetify
- Javascript
👉 Link para a documentação no git do frontend
👉 Link da documentação oficial do VueJs
👉 Link da documentação oficial do Vuetify
Descrição | Data de modificação | Versão | Link de download |
---|---|---|---|
Segunda versão | 08 de abril de 2022 | v2 | Download |
- Docker
- Codeship (CI/CD)
👉 Link para a faq do Docker
👉 Link para a faq do Codeship
- Nginx
- PM2
- Docker
- Certbot
👉 Link para faq do Nginx
👉 Link para faq do PM2
👉 Link para faq do Docker
👉 Link para faq do Certbot
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.
- Manutenção: Facilita o engajamento de multiplas equipe e colaboradores em um projeto;
- Escalável: Facilita refatoramento do código monolítico para uma uma estrura de microserviços;
- SOLID: Facilita a aplicação de todos os princípios do SOLID;
- Git: Melhora o gerenciamento dos commits, evitando conflitos e etc;
- Testes: Facilita o desenvolvimento de testes de unidade e integração.
O Sentry é um serviço open source para logar erros da aplicação.
A 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:
👉 Mais informações sobre o Sentry
👉 Link oficial do serviço
Estrutura de módulos do backend
- Models
- Infra
- Dtos
- Repositories
- Containers
- Providers
- UseCases (Middlewares, Controllers, Services, Validators)
Estrutura de arquivos dos módulos do backend
├── containers
│ └── index.ts
├── dtos
│ ├── ICreateVoteDTO.ts
│ └── IDeleteVoteDTO.ts
├── infra
│ ├── http
│ │ └── routes
│ │ └── VoteRoutes.ts
│ └── typeorm
│ └── postgres
│ ├── entities
│ │ └── VotePostgresEntity.ts
│ └── repositories
│ └── VotePostgresRepository.ts
├── models
│ └── entities
│ ├── IVoteEntity.ts
│ └── VoteInMemoryEntity.ts
├── repositories
│ ├── IVoteRepository.ts
│ └── VoteInMemoryRepository.ts
└── useCases
├── CreateVote
│ ├── CreateVoteController.ts
│ ├── CreateVoteMiddleware.ts
│ ├── CreateVoteService.ts
│ └── CreateVoteValidator.ts
├── DeleteVote
│ ├── DeleteVoteController.ts
│ ├── DeleteVoteMiddleware.ts
│ ├── DeleteVoteService.ts
│ └── DeleteVoteValidator.ts
└── ListVote
├── ListVoteController.ts
├── ListVoteMiddleware.ts
└── ListVoteService.ts├── containers
│ └── index.ts
├── dtos
│ ├── ICreateVoteDTO.ts
│ └── IDeleteVoteDTO.ts
├── infra
│ ├── http
│ │ └── routes
│ │ └── VoteRoutes.ts
│ └── typeorm
│ └── postgres
│ ├── entities
│ │ └── VotePostgresEntity.ts
│ └── repositories
│ └── VotePostgresRepository.ts
├── models
│ └── entities
│ ├── IVoteEntity.ts
│ └── VoteInMemoryEntity.ts
├── repositories
│ ├── IVoteRepository.ts
│ └── VoteInMemoryRepository.ts
└── useCases
├── CreateVote
│ ├── CreateVoteController.ts
│ ├── CreateVoteMiddleware.ts
│ ├── CreateVoteService.ts
│ └── CreateVoteValidator.ts
├── DeleteVote
│ ├── DeleteVoteController.ts
│ ├── DeleteVoteMiddleware.ts
│ ├── DeleteVoteService.ts
│ └── DeleteVoteValidator.ts
└── ListVote
├── ListVoteController.ts
├── ListVoteMiddleware.ts
└── ListVoteService.ts
Descrição | Data de modificação | Versão | Link de download |
---|---|---|---|
Quarta versão do documento | 01 de abril de 2022 | v4 | Download |
Quinta versão do documento | 25 de maio de 2022 | v5 | Download |
👉 Download do arquivo do Astah
JSON
{
"USERS": [
{
"id": 1,
"name": "Vanessa",
"role": "ADMIN"
},
{
"id": 2,
"name": "tiago",
"role": "MANAGER"
},
{
"id": 3,
"name": "alex",
"role": "USER"
},
{
"id": 4,
"name": "liz",
"role": "USER"
}
],
"GROUPS": [
{
"id": 1,
"manager_id": 2,
"name": "4 serie fundamental - turma A",
"users": []
},
{
"id": 2,
"manager_id": 2,
"name": "5 serie fundamental - turma A",
"users": []
}
],
"GROUP_QUEUE": [
{
"id": 1,
"group_id": 2,
"user_id": 1,
"created_at": "26-12-2021"
}
],
"GROUPS_USERS": [
{
"group_id": 1,
"user_id": 2,
"created_at": "26-12-2021"
},
{
"group_id": 1,
"user_id": 3,
"created_at": "26-12-2021"
},
{
"group_id": 1,
"user_id": 4,
"created_at": "26-12-2021"
}
],
"CAMPAIGNS": [
{
"id": 1,
"group_id": 1,
"manager_id": 1,
"name": "Primeira dinamica em grupo",
"expiration": null
},
{
"id": 2,
"group_id": 1,
"manager_id": 1,
"name": "Segunda dinamica em grupo",
"expiration": "28-12-2021"
}
],
"CAMPAIGN_QUEUE": [
{
"id": 1,
"campaign_id": 1,
"user_id": 2,
"created_at": "26-12-2021"
},
{
"id": 2,
"campaign_id": 1,
"user_id": 3,
"created_at": "26-12-2021"
},
{
"id": 3,
"campaign_id": 1,
"user_id": 4,
"created_at": "26-12-2021"
}
],
"EMOTIONS": [
{
"id": 1,
"slug": "alegre",
"name": "Alegre"
},
{
"id": 2,
"slug": "triste",
"name": "Triste"
},
{
"id": 3,
"slug": "raiva",
"name": "Raiva"
},
{
"id": 4,
"slug": "medo",
"name": "Medo"
}
],
"ACTORS": [
{
"id": 1,
"name": "Colega",
"slug": "colega"
},
{
"id": 2,
"name": "Pai",
"slug": "pai"
},
{
"id": 3,
"name": "Padastro",
"slug": "padastro"
},
{
"id": 4,
"name": "Mãe",
"slug": "mae"
},
{
"id": 5,
"name": "Madastra",
"slug": "madastra"
},
{
"id": 6,
"name": "Irmão",
"slug": "irmao"
},
{
"id": 7,
"name": "Escola",
"slug": "escola"
}
],
"REASONS": [
{
"id": 1,
"emotion_id": 2,
"description": "Me apelidaram"
},
{
"id": 2,
"emotion_id": 2,
"description": "Bateram em mim"
},
{
"id": 3,
"emotion_id": 2,
"description": "Meu pai esta doente"
},
{
"id": 4,
"emotion_id": 2,
"description": "Cai da bicicleta"
}
],
"VOTES": [
{
"id": 1,
"campaign_id": 1,
"emotion_id": 1,
"user_id": 2
},
{
"id": 2,
"campaign_id": 1,
"emotion_id": 1,
"user_id": 3
}
],
"VOTES_ACTORS": [
{
"id": 1,
"vote_id": 1,
"actor_id": 1,
"user_id": 2
},
{
"id": 2,
"vote_id": 1,
"actor_id": 1,
"user_id": 2
}
],
"VOTES_REASONS": [
{
"id": 1,
"vote_id": 1,
"user_id": 2,
"reason_id": 1
},
{
"id": 1,
"vote_id": 1,
"user_id": 2,
"reason_id": 2
},
{
"id": 1,
"vote_id": 1,
"user_id": 2,
"reason_id": 3
}
],
"VOTES_COMMENTS": [
{
"id": 1,
"vote_id": 1,
"user_id": 2,
"message": "Estou com fome"
}
]
}
Requisitos funcionais
- ADMIN: É o gestor master do sistema, ator que tem acesso irrestrito ao painel administrativo.
- GERENTE: É considerado o professor, ator que irá gerir os alunos (usuários).
- USUÁRIO: É considerado o aluno, ator que paticipa da campanha e realia o voto.
- O USUÁRIO/GERENTE/ADMIN deve poder efetuar o login/logout;
- O USUÁRIO/GERENTE deve poder se cadastrar;
- O USUÁRIO/GERENTE deve poder alterar o perfil (nome);
- O USUÁRIO/GERENTE deve poder alterar a senha;
- O USUÁRIO/GERENTE/ADMIN deve poder recuperar a senha;
- O ADMIN deve poder visualizar os usuários do sistema;
- O ADMIN deve poder deletar um usuário do sistema;
- O ADMIN deve poder desabilitar/habilitar um usuário do sistema.
- O ADMIN deve poder criar um emotion;
- O ADMIN deve poder alterar um emotion;
- O ADMIN deve poder habilitar/desabilitar um emotion;
- O ADMIN deve poder deletar um emotion.
- O ADMIN deve poder criar uma razão;
- O ADMIN deve poder alterar uma razão;
- O ADMIN deve poder habilitar/desabilitar uma razão;
- O ADMIN deve poder deletar uma razão.
- O ADMIN deve poder criar um ator;
- O ADMIN deve poder alterar um ator;
- O ADMIN deve poder habilitar/desabilitar um ator;
- O ADMIN deve poder deletar um ator.
- O GERENTE deve poder criar um grupo;
- O GERENTE deve poder alterar um grupo;
- O GERENTE deve poder deletar um grupo;
- O GERENTE deve poder enviar uma solicitação para USUÁRIO entrar em um grupo;
- O GERENTE deve poder remover um USUÁRIO de um grupo.
- O GERENTE deve poder criar uma campanha;
- O GERENTE deve poder alterar uma campanha;
- O GERENTE deve poder deletar uma campanha;
- O GERENTE deve poder iniciar uma campanha;
- O GERENTE deve poder finalizar uma campanha.
- O USUÁRIO deve poder aceitar/negar a solicitação da entrada em um grupo;
- O USUÁRIO deve poder efetuar uma votação;
Endpoints do backend (API)
Path | Método | Token | Role | Descrição |
---|---|---|---|---|
USER/MANAGER/ADMIN | ||||
/login | POST | ALL | Efetua login | |
/users | POST | USER/MANAGER | Cria uma conta | |
/users | GET | ADMIN | Lista usuários | |
/users/{id} | GET | ADMIN | Exibe usuário | |
/users/{id} | PUT | ADMIN | Atualiza usuário | |
/users/{id} | DELETE | ADMIN | Deleta usuário | |
/change_password | PUT | USER/MANAGER/ADMIN | Altera senha | |
/forgot_password | PUT | USER/MANAGER/ADMIN | Esqueceu a senha | |
/reset_password | PATCH | USER/MANAGER/ADMIN | Reseta a senha | |
/change_avatar | PATCH | USER/MANAGER/ADMIN | Altera avatar | |
/change_profile | PUT | USER/MANAGER/ADMIN | Altera o perfil | |
/toggle_role/{id} | PATCH | ADMIN | Alterna a patente | |
/toggle_allow/{id} | PATCH | ADMIN | Alterna o status | |
EMOTION | ||||
/emotions | POST | ADMIN | Cria emotion | |
/emotions | GET | ADMIN | Lista emotions | |
/emotions/{id} | GET | ADMIN | Exibe emotion | |
/emotions/{id} | PUT | ADMIN | Atualiza emotion | |
/emotions/{id} | DELETE | ADMIN | Deleta emotion | |
REASON | ||||
/reasons | POST | ADMIN | Cria motivo | |
/reasons | GET | ADMIN | Lista motivos | |
/reasons/{id} | GET | ADMIN | Exibe motivo | |
/reasons/{id} | PUT | ADMIN | Atualiza motivo | |
/reasons/{id} | DELETE | ADMIN | Deleta motivo | |
ACTOR | ||||
/actors | POST | ADMIN | Cria ator | |
/actors | GET | ADMIN | Lista ators | |
/actors/{id} | GET | ADMIN | Exibe ator | |
/actors/{id} | PUT | ADMIN | Atualiza ator | |
/actors/{id} | DELETE | ADMIN | Deleta ator | |
GROUP | ||||
/groups | POST | MANAGER | Cria grupo | |
/groups | GET | MANAGER | Lista grupos | |
/groups/{id} | GET | MANAGER | Exibe grupo | |
/groups/{id} | PUT | MANAGER | Atualiza grupo | |
/groups/{id} | DELETE | MANAGER | Deleta grupo | |
GROUP_QUEUE | ||||
/invite_user_in_group... | GET | MANAGER | Convida usuário para um grupo | |
/delete_invite_user_in_group... | GET | MANAGER | Deleta convite usuário p/ grupo | |
/monitore_group_queue | GET | MANAGER | Monitora a fila de grupos | |
CAMPAIGN | ||||
/campaigns | POST | MANAGER | Cria campanha | |
/campaigns | GET | MANAGER | Lista campanhas | |
/campaigns/{id} | GET | MANAGER | Exibe campanha | |
/campaigns/{id} | PUT | MANAGER | Atualiza campanha | |
/campaigns/{id} | DELETE | MANAGER | Deleta campanha | |
CAMPAIGN_QUEUE | ||||
/monitore_campaign_queue | GET | MANAGER | Monitora fila de campanhas | |
VOTES | ||||
/votes?campaign_id={id}&emotion_id={id} | PUT | USER | Cria voto | |
/votes | GET | USER | Lista votos | |
/votes/{id} | DELETE | USER | Deleta voto | |
VOTE_ACTOR | ||||
/votes_actors | PUT | USER | Associa o ator ao voto | |
/votes_actors | GET | USER | Lista os associações | |
VOTE_REASON | ||||
/votes_reasos | PUT | USER | Associa o motivo ao voto | |
/votes_reasos | GET | USER | Lista os motivos | |
VOTE_COMMENT | ||||
/votes_comments | PUT | USER | Associa comentário ao voto | |
/votes_comments | GET | USER | Lista os comentários |
O Gitflow é um fluxo de trabalho que auxilia o desenvolvimento contínuo de software entre a equipe envolvida.
- user - Envia commits apenas para o próprio user, exemplo: tiago-feature-21.
- develop - Recebe merges dos users. (Ambiente de QA)
- master 🔒 - Recebe merges da develop, no final de uma release. (Ambiente de produção)
* A branch master 🔒 é bloqueada para receber commits de usuários.
* A branch master representa o software em produção.
* A branch develop representa o software em QA.
* 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.
👉 Documentação completa do gitflow - passo a passo
Conventional Commits é uma convenção de mensagens de commits. Essa convenção descrevendo os recursos, correções e alterações importantes feitas nas mensagens.
Ícone | Flag | Descrição |
---|---|---|
🪲 | fix | Correção de bug para o usuário. |
☂️ | feat | Desenvolvimento de uma nova funcionalidade. |
📃 | docs | Alterações na documentação. |
✂️ | refactor | Refatoração de um bloco de código. |
💅 | style | Formatação, falta de ponto e vírgula, etc. |
🔧 | perf | Uma mudança de código que melhora o desempenho. |
🔨 | build | Alterações que afetam o sistema de compilação ou dependências externas (escopos de exemplo: gulp e npm). |
🪀 | ci | Alterações em arquivos e scripts de configuração de CI (escopos de exemplo: Travis, Circle e Codeship). |
🧪 | test | Adicionando testes ausentes ou corrigindo testes existentes. |
# Exemplo 1
git commit -m "🪲 fix: corrige bug da listagem de usuários."
# Exemplo 2
git commit -m "☂️ feat: cria o módulo de pontos."
O 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.
Arquivo .prettierrc na raiz do projeto.
{
"semi": true,
"tabWidth": 4,
"printWidth": 90,
"singleQuote": true,
"trailingComma": "es5"
}
O 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:
👉 Link do arquivo no Lucidchart
1 - Lint: Nessa etapa é verificada as regras do Sonarlint;
2 - Test: Nessa etapa é realizado os testes unitários;
3 - Build: Nessa etapa é realizado o build da aplicação.
© Documento de autorias de Enéas Almeida e Joab Maia.