Skip to content

📜 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.

License

Notifications You must be signed in to change notification settings

eneas-almeida/bekid

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

90 Commits
 
 
 
 
 
 
 
 

Repository files navigation

Bekid

NPM

BeKid é uma aplicação para o mapeamento de emoções e auxílio no combate ao bullying escolar.
👉 bekid.app

👤 Autores

Foto Nome Ativo Dt. inativo Atribuições
Enéas Almeida Enéas Almeida 🔥 - Manager, Arquiteto, FullStack
Joab Maia Joab Maia 🔥 - Manager and System Analyst

⚓ Links

👉 Git do backend 🔒 (privado)
👉 Git do frontend 🔒 (privado)
👉 Sistema em QA
👉 Sistema em Produção
👉 FAQ Geral

Etapas de desenvolvimento

  1. Levantamento do problema a ser resolvido (Briefing);
  2. Levantamento dos requisitos funcionais;
  3. Definição da arquitetura utilizada;
  4. Definição das tecnologias utilizadas;
  5. Definição das atribuições e cronograma de estimativas no desenvolvimento das atividades;
  6. Criação do diagrama de relacionamentos e testes de hipóteses;
  7. Desenvolvimento da documentação e diagramas explicativos no Git;
  8. Diagramação das telas (UX Design);
  9. Configurações dos ambientes de QA e Produção;
  10. Desenvolvimento do MVP.
    10.1. Desenvolvimento da backend;
    10.2. Desenvolvimento do frontend;
    10.3. Integração do frontend com o backend.

⌛ Cronograma de estimativas no desenvolvimento das atividades

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%

Significados dos esforços na escala Fibonacci

  • 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

Backend

NodeJs Typescript Javascript Jest

  • NodeJs/Express
  • Typescript / Javascript
  • TypeORM / Postgres / MongoDB / Redis
  • Testes com métricas de coverages (Jest)

👉 Link para a documentação no git do backend

Persistência dos dados

Postgres MongoDB Redis Docker

  • Postgres
  • MongoDB
  • Redis

* Os bancos de dados são provenientes de containers do docker.

TypeORM

TypeORM

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

Frontend

VueJs Vuetify Javascript

  • 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

Telas do sistema (UX)

Telas

Descrição Data de modificação Versão Link de download
Segunda versão 08 de abril de 2022 v2 Download

👉 Link do arquivo PDF

Prints do sistema

Tela de login

Cadastro

Dashboard do admin

Lista de escolas

Listagem de emotions mobile

Desativar ator

Confirma exclusão

Dashboard do escola

Editar campanha

Editar campanha

Editar campanha mobile

Fila de usuários

Tela de voto do emotion

Tela de voto do autor

Tela de voto do motivo

Backend/Frontend

Docker Codeship

  • Docker
  • Codeship (CI/CD)

👉 Link para a faq do Docker
👉 Link para a faq do Codeship

Infraestrutura

Docker PM2 Docker Certbot

  • Nginx
  • PM2
  • Docker
  • Certbot

👉 Link para faq do Nginx
👉 Link para faq do PM2
👉 Link para faq do Docker
👉 Link para faq do Certbot

Arquitetura

Organização do backend (Feature by Package)

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.

Vantagens da arquitetura

  • 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.

Estratégia de captura de erros com o Sentry

Sentry

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:

Sentry erro

👉 Mais informações sobre o Sentry
👉 Link oficial do serviço

Tests com métricas coverages

Testes

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

Diagrama de relacionamentos

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.

Usuário/Gerente/Admin

  1. O USUÁRIO/GERENTE/ADMIN deve poder efetuar o login/logout;
  2. O USUÁRIO/GERENTE deve poder se cadastrar;
  3. O USUÁRIO/GERENTE deve poder alterar o perfil (nome);
  4. O USUÁRIO/GERENTE deve poder alterar a senha;
  5. O USUÁRIO/GERENTE/ADMIN deve poder recuperar a senha;
  6. O ADMIN deve poder visualizar os usuários do sistema;
  7. O ADMIN deve poder deletar um usuário do sistema;
  8. O ADMIN deve poder desabilitar/habilitar um usuário do sistema.

Emotion

  1. O ADMIN deve poder criar um emotion;
  2. O ADMIN deve poder alterar um emotion;
  3. O ADMIN deve poder habilitar/desabilitar um emotion;
  4. O ADMIN deve poder deletar um emotion.

Razão

  1. O ADMIN deve poder criar uma razão;
  2. O ADMIN deve poder alterar uma razão;
  3. O ADMIN deve poder habilitar/desabilitar uma razão;
  4. O ADMIN deve poder deletar uma razão.

Ator

  1. O ADMIN deve poder criar um ator;
  2. O ADMIN deve poder alterar um ator;
  3. O ADMIN deve poder habilitar/desabilitar um ator;
  4. O ADMIN deve poder deletar um ator.

Grupo

  1. O GERENTE deve poder criar um grupo;
  2. O GERENTE deve poder alterar um grupo;
  3. O GERENTE deve poder deletar um grupo;
  4. O GERENTE deve poder enviar uma solicitação para USUÁRIO entrar em um grupo;
  5. O GERENTE deve poder remover um USUÁRIO de um grupo.

Campanha

  1. O GERENTE deve poder criar uma campanha;
  2. O GERENTE deve poder alterar uma campanha;
  3. O GERENTE deve poder deletar uma campanha;
  4. O GERENTE deve poder iniciar uma campanha;
  5. O GERENTE deve poder finalizar uma campanha.

Usuário

  1. O USUÁRIO deve poder aceitar/negar a solicitação da entrada em um grupo;
  2. 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

Download do projeto no Insomnia

Run in Insomnia}

CI/CD

Gitflow

O Gitflow é um fluxo de trabalho que auxilia o desenvolvimento contínuo de software entre a equipe envolvida.

👉 Mais informações

Branchs

Gitflow

  • 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)

Diretrizes

* 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

Padronização de commits (Conventional Commits)

Branch

Conventional Commits é uma convenção de mensagens de commits. Essa convenção descrevendo os recursos, correções e alterações importantes feitas nas mensagens.

Flags utilizadas:

Í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.

Exemplos de commits utilizando a padronização

# 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."

👉 Mais informações

Prettier

Prettier

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"
}

👉 Link oficial

Pipeline

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:

Gitflow

👉 Link do arquivo no Lucidchart

Etapas

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.

About

📜 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.

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published