From 385bd6db0410c15756dec45e964685602079c39e Mon Sep 17 00:00:00 2001 From: joaobisi Date: Wed, 28 Aug 2024 16:37:12 -0300 Subject: [PATCH 01/22] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20do=20Diagrama=20d?= =?UTF-8?q?e=20Arquitetura?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/assets/diagrama_arquitetura.png | Bin 0 -> 60399 bytes docs/organizacoes/documento_arquitetura.md | 22 +++++---------------- 2 files changed, 5 insertions(+), 17 deletions(-) create mode 100644 docs/assets/diagrama_arquitetura.png diff --git a/docs/assets/diagrama_arquitetura.png b/docs/assets/diagrama_arquitetura.png new file mode 100644 index 0000000000000000000000000000000000000000..cc2b1a7da2ad8263df420dc77941cfc74c438f1d GIT binary patch literal 60399 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 literal 0 HcmV?d00001 diff --git a/docs/organizacoes/documento_arquitetura.md b/docs/organizacoes/documento_arquitetura.md index 478f5f2..b3d296f 100644 --- a/docs/organizacoes/documento_arquitetura.md +++ b/docs/organizacoes/documento_arquitetura.md @@ -27,21 +27,13 @@ A arquitetura de microsserviços acelera o desenvolvimento e facilita a escalabi ### 2.2. Representação dos serviços -#### 2.2.1. Gateway - -O gateway é responsável por atuar como a interface entre o usuário e os demais serviços da aplicação, garantindo autenticação e autorização. Além disso, ele facilita a comunicação entre os serviços, servindo como ponto central para a gestão de requisições e respostas. No Caluculos, utilizaremos RabbitMQ para gerenciar a comunicação assíncrona entre os microsserviços, assegurando um fluxo de dados eficiente e confiável. - -#### 2.2.2. Usuário +#### 2.2.2. User Service O serviço de usuário é responsável pela gestão completa dos usuários da aplicação. Isso inclui o registro, autenticação, atualização de informações, gerenciamento de permissões e controle de acesso, garantindo uma experiência segura e personalizada para cada usuário. -#### 2.2.3. Jornadas - -O serviço de jornadas é responsável pela gestão das jornadas na aplicação. Isso inclui a criação, atualização e exclusão de jornadas, bem como a administração das inscrições dos clientes, permitindo que eles ingressem e participem das jornadas de forma eficiente e organizada. +#### 2.2.3. Application Service -#### 2.2.4. Gamificação - -O serviço de gamificação é responsável por gerenciar a progressão dos usuários nas trilhas, acompanhando o avanço passo a passo nos exercícios. Ele também administra o sistema de recompensas, incentivando a participação ativa dos usuários através de pontos, medalhas e outros incentivos, promovendo uma experiência mais envolvente e motivadora na aplicação. +O serviço de aplicação é responsável por todas as funcionalidades referentes à experiência de todos os níveis de usuários autenticados no sistema. ### 2.3. Tecnologias @@ -61,10 +53,6 @@ O MongoDB é um banco de dados NoSQL de código aberto reconhecido pela sua flex O Docker é uma plataforma de virtualização de contêineres que transformou a maneira como aplicações são desenvolvidas, empacotadas e implantadas. Ele proporciona aos desenvolvedores a capacidade de criar ambientes isolados e autossuficientes para suas aplicações, conhecidos como contêineres. Esses contêineres encapsulam não apenas o código da aplicação, mas também todas as dependências necessárias, como bibliotecas e configurações, garantindo consistência e portabilidade entre diferentes ambientes de desenvolvimento e produção. -#### 2.3.5. RabbitMQ - -O RabbitMQ é um sistema de mensageria de código aberto amplamente utilizado para facilitar a comunicação entre diferentes partes de uma aplicação distribuída. Ele funciona como um intermediário que permite que os diversos componentes do sistema troquem mensagens de forma assíncrona e confiável. O RabbitMQ suporta diversos padrões de mensageria, como filas, trocas e roteamento de mensagens, proporcionando flexibilidade na configuração e escalabilidade para aplicações que exigem comunicação distribuída. - ## 3. Visão Lógica ### 3.1. Diagrama de Pacotes @@ -79,14 +67,14 @@ Ambos os Diagramas estão abaixo: -### 3.2. Diagrama de Implementação +### 3.2. Diagrama de Implantação ### 3.3 Diagrama de Arquitetura A estrutura do projeto, planejada para seguir uma arquitetura de microsserviços, possui componentes chave para que seu ecossistema funcione corretamente. Dentre eles, está o papel fundamental da API Gateway bem como a individualização dos bancos de dados NoSQL, para trazer mais robustez e organização. Abaixo segue o artefato criado com o intuito de dar uma visão em baixo nível da arquitetura e seus componentes: - +![Arquitetura](../assets/diagrama_arquitetura.png) Nome: Diagrama de Arquitetura From 92f730b3a148885eada3c64174ef78880f6e0af1 Mon Sep 17 00:00:00 2001 From: joaobisi Date: Wed, 28 Aug 2024 17:00:52 -0300 Subject: [PATCH 02/22] =?UTF-8?q?Atualiza=C3=A7=C3=A3o=20do=20versionament?= =?UTF-8?q?o=20do=20documento?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/organizacoes/documento_arquitetura.md | 1 + 1 file changed, 1 insertion(+) diff --git a/docs/organizacoes/documento_arquitetura.md b/docs/organizacoes/documento_arquitetura.md index b3d296f..53aebba 100644 --- a/docs/organizacoes/documento_arquitetura.md +++ b/docs/organizacoes/documento_arquitetura.md @@ -91,3 +91,4 @@ Autor: Calculus Team | 09/07/2024 | Criação do documento | Davi Matheus| | 10/07/2024 | Revisao | Natanael Filho | | 15/07/2024 | Adição do Diagrama de Arquitetura | Paulo Gontijo e João Bisinotti | +| 28/08/2024 | Atualização do Diagrama de Arquitetura | João Bisinotti | \ No newline at end of file From cbcb718cd1d75a06655848734e6777e0ee4b5655 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 17:18:51 -0300 Subject: [PATCH 03/22] docs(#142): atualizando documento de arquitetura --- docs/organizacoes/documento_arquitetura.md | 83 ++++++++++++---------- 1 file changed, 46 insertions(+), 37 deletions(-) diff --git a/docs/organizacoes/documento_arquitetura.md b/docs/organizacoes/documento_arquitetura.md index 53aebba..95cb950 100644 --- a/docs/organizacoes/documento_arquitetura.md +++ b/docs/organizacoes/documento_arquitetura.md @@ -1,57 +1,59 @@ +Aqui está o documento de arquitetura revisado com todas as alterações solicitadas: + +--- # Documento de Arquitetura ## 1. Introdução -Este documento tem como principal objetivo fornecer uma visão abrangente e estruturada da arquitetura do software Calculos. Utilizando diferentes visões arquiteturais, ele destaca diversos aspectos do sistema, proporcionando uma visão geral completa. A descrição abrange as principais decisões de design, componentes, módulos, interações e estrutura do software, facilitando assim o entendimento da arquitetura para os desenvolvedores. +Este documento tem como objetivo principal fornecer uma visão abrangente e estruturada da arquitetura do software *Calculus*. Utilizando diferentes perspectivas arquiteturais, ele detalha diversos aspectos do sistema, incluindo decisões de design, componentes, módulos, interações e a estrutura geral do software. O intuito é facilitar o entendimento da arquitetura por parte dos desenvolvedores e demais stakeholders. -### 1.1. Visão Geral +### 1.1. Estrutura do Documento -Este documento está estruturado da seguinte forma: +Este documento está organizado da seguinte forma: -- Introdução -- Representação arquitetural -- Visão Lógica -- Referências bibliográficas -- Histórico de versão +- **Introdução**: Contextualiza o documento e descreve sua estrutura. +- **Representação Arquitetural**: Apresenta os diagramas e conceitos-chave da arquitetura. +- **Visão Lógica**: Descreve a organização dos componentes e a interação entre eles. +- **Referências Bibliográficas**: Lista as fontes referenciadas no documento. +- **Histórico de Versão**: Registra as alterações realizadas no documento ao longo do tempo. ## 2. Representação Arquitetural ### 2.1. Diagrama de Relações +**Autor:** Calculus Team -O estilo arquitetural de microsserviços consiste em uma abordagem onde a aplicação é composta por serviços menores, implementados de forma independente e com baixo acoplamento. Esses serviços, organizados por recursos de negócios, comunicam-se entre si normalmente por meio de APIs. - -A arquitetura de microsserviços acelera o desenvolvimento e facilita a escalabilidade da aplicação. Esse padrão será utilizado no Calculos, com cada microsserviço possuindo sua própria base de dados independente. +A arquitetura de microsserviços adotada no *Calculus* segue uma abordagem onde a aplicação é composta por serviços menores, implementados de forma independente e com baixo acoplamento. Esses serviços, organizados por domínios de negócios, comunicam-se entre si, principalmente por meio de APIs. Essa arquitetura promove um desenvolvimento mais ágil e facilita a escalabilidade da aplicação. Cada microsserviço possui sua própria base de dados independente, assegurando isolamento e robustez. -### 2.2. Representação dos serviços +### 2.2. Serviços -#### 2.2.2. User Service +#### 2.2.1. User Service -O serviço de usuário é responsável pela gestão completa dos usuários da aplicação. Isso inclui o registro, autenticação, atualização de informações, gerenciamento de permissões e controle de acesso, garantindo uma experiência segura e personalizada para cada usuário. +O *User Service* é responsável pela gestão completa dos usuários da aplicação. Suas funcionalidades incluem registro, autenticação, atualização de informações, gerenciamento de permissões e controle de acesso, garantindo uma experiência segura e personalizada para cada usuário. -#### 2.2.3. Application Service +#### 2.2.2. Studio Maker Service -O serviço de aplicação é responsável por todas as funcionalidades referentes à experiência de todos os níveis de usuários autenticados no sistema. +O *Studio Maker Service* é responsável pela criação e gestão de conteúdo na plataforma. Esse serviço lida com todas as funcionalidades necessárias para que os usuários autenticados possam criar, editar e organizar conteúdos de forma eficiente, permitindo uma gestão eficaz do material disponibilizado na plataforma. ### 2.3. Tecnologias -#### 2.3.1. NextJS +#### 2.3.1. Next.js -O Next.js é um framework de desenvolvimento baseado em React que permite a criação de interfaces de usuário robustas e escaláveis. Ele facilita a renderização no servidor, a geração de páginas estáticas e a integração com APIs, proporcionando uma experiência de desenvolvimento otimizada. Com Next.js, é possível criar UIs complexas de forma eficiente, garantindo alta performance e SEO aprimorado. O Next.js será utilizado no front-end. +O Next.js é um framework de desenvolvimento baseado em React, que permite a criação de interfaces de usuário robustas e escaláveis. Ele facilita a renderização no servidor, a geração de páginas estáticas e a integração com APIs, proporcionando uma experiência de desenvolvimento otimizada. O Next.js será utilizado no front-end do *Calculus*, garantindo alta performance e SEO aprimorado. #### 2.3.2. NestJS -O NestJS é um framework de desenvolvimento baseado em Node.js que facilita a criação de aplicações escaláveis e eficientes. Ele utiliza uma arquitetura modular e orientada a objetos, permitindo a organização de código em módulos, controladores e serviços. Com suporte integrado para TypeScript, injeção de dependências e uma estrutura robusta para desenvolvimento de APIs e microsserviços, o NestJS é ideal para construir back-ends robustos e manuteníveis. O NestJS será utilizado no back-end. +O NestJS é um framework de desenvolvimento baseado em Node.js, ideal para criar aplicações escaláveis e eficientes. Utilizando uma arquitetura modular e orientada a objetos, ele permite uma organização de código clara e manutenível. O NestJS será utilizado no back-end do *Calculus*, facilitando o desenvolvimento de APIs e microsserviços robustos. #### 2.3.3. MongoDB -O MongoDB é um banco de dados NoSQL de código aberto reconhecido pela sua flexibilidade e escalabilidade. Ele é projetado para lidar com grandes volumes de dados de forma eficiente e oferece esquemas dinâmicos, permitindo a modelagem de dados de maneira mais livre em comparação com bancos de dados relacionais. O MongoDB suporta operações de leitura e gravação de alto desempenho, distribuição automática de dados e consultas complexas usando sua linguagem de consulta avançada. Será utilizado para gerenciar as bases de dados dos serviços da aplicação, proporcionando agilidade, escalabilidade e suporte para aplicações que demandam grande flexibilidade no armazenamento e recuperação de dados. +O MongoDB é um banco de dados NoSQL, flexível e escalável, projetado para lidar com grandes volumes de dados de maneira eficiente. Ele será utilizado para gerenciar as bases de dados dos serviços da aplicação, proporcionando agilidade e suporte a aplicações que demandam grande flexibilidade no armazenamento e recuperação de dados. #### 2.3.4. Docker -O Docker é uma plataforma de virtualização de contêineres que transformou a maneira como aplicações são desenvolvidas, empacotadas e implantadas. Ele proporciona aos desenvolvedores a capacidade de criar ambientes isolados e autossuficientes para suas aplicações, conhecidos como contêineres. Esses contêineres encapsulam não apenas o código da aplicação, mas também todas as dependências necessárias, como bibliotecas e configurações, garantindo consistência e portabilidade entre diferentes ambientes de desenvolvimento e produção. +O Docker é uma plataforma de virtualização que permite criar ambientes isolados para aplicações, conhecidos como contêineres. Ele garante consistência e portabilidade entre diferentes ambientes, facilitando o desenvolvimento e a implantação do *Calculus*. ## 3. Visão Lógica @@ -59,36 +61,43 @@ O Docker é uma plataforma de virtualização de contêineres que transformou a #### 3.1.1 Introdução -O Diagrama de Pacotes é uma representação estrutural usada para organizar as classes de um projeto em grupos lógicos chamados pacotes. Cada pacote agrupa elementos relacionados, como diagramas, classes e outros pacotes, oferecendo uma visão de alto nível especialmente útil em projetos e sistemas complexos. +O Diagrama de Pacotes organiza as classes do projeto em grupos lógicos chamados pacotes, oferecendo uma visão de alto nível especialmente útil em sistemas complexos. No *Calculus*, seguimos uma arquitetura de microsserviços, onde o pacote principal representa o sistema. Dentro dele, a camada de front-end realiza requisições que são processadas pela camada de back-end, composta pelos microsserviços principais: *User Service*, *Studio Maker Service* e *Gamification Service*, que interagem com os bancos de dados para armazenamento e recuperação de dados. -No nosso diagrama de pacotes, seguimos a arquitetura definida pelas diretrizes de microsserviços. O pacote principal representa o nosso sistema, dentro do qual encontramos a camada de front-end responsável por realizar requisições. Essas requisições são direcionadas para a camada de back-end, que por sua vez abriga nossos três microsserviços principais: UserService, JornadaService e GamificationService. Esses microsserviços interagem com o banco de dados para armazenamento e recuperação de dados. + -Ambos os Diagramas estão abaixo: - +**Autor:** *Calculus* Team ### 3.2. Diagrama de Implantação +O Diagrama de Implantação oferece uma visão detalhada de como os componentes do sistema *Calculus* estão distribuídos em diferentes máquinas ou servidores dentro da infraestrutura de TI. Ele demonstra como os serviços são implantados em contêineres, como a comunicação ocorre entre eles e como os dados são armazenados e acessados. + +No *Calculus*, a implantação é realizada com o auxílio de contêineres Docker, orquestrados pelo Kubernetes. Esta abordagem garante que cada serviço, como o *User Service* e o *Studio Maker Service*, possa ser escalado de forma independente, mantendo a alta disponibilidade e eficiência operacional. Além disso, o Kubernetes gerencia a distribuição de cargas de trabalho e proporciona resiliência, assegurando que os serviços permaneçam acessíveis mesmo em caso de falhas. + -### 3.3 Diagrama de Arquitetura -A estrutura do projeto, planejada para seguir uma arquitetura de microsserviços, possui componentes chave para que seu ecossistema funcione corretamente. Dentre eles, está o papel fundamental da API Gateway bem como a individualização dos bancos de dados NoSQL, para trazer mais robustez e organização. Abaixo segue o artefato criado com o intuito de dar uma visão em baixo nível da arquitetura e seus componentes: -![Arquitetura](../assets/diagrama_arquitetura.png) +**Autor:** *Calculus* Team -Nome: Diagrama de Arquitetura +### 3.3. Diagrama de Arquitetura +O Diagrama de Arquitetura mostra a estrutura planejada do projeto Calculus, enfatizando a arquitetura de microsserviços. Ele destaca a individualização dos bancos de dados NoSQL para cada serviço, o que garante maior robustez e organização. Cada microsserviço opera de forma independente, permitindo escalabilidade e flexibilidade no desenvolvimento e na manutenção do sistema. A comunicação entre os microsserviços ocorre diretamente, sem a necessidade de um ponto de entrada centralizado. -Autor: Calculus Team + -## 4. Referencências bibliográficas + +**Autor:** *Calculus* Team -> [1] EQUIPE ALECTRION 2022-2. Documento de Arquitetura. Disponível em: https://fga-eps-mds.github.io/2022-2-Alectrion-DOC/#/./Documentos/arquitetura. +## 4. Referências Bibliográficas + +> [1] EQUIPE ALECTRION 2022-2. Documento de Arquitetura. Disponível em: https://fga-eps-mds.github.io/2022-2-Alectrion-DOC/#/./Documentos/arquitetura. > [2] SOARES, João Pedro; ESTANISLAU, Matheus. Documento de Arquitetura. Disponível em: https://fga-eps-mds.github.io/2022-1-Alectrion-DOC/documentation/Documentos/documento-arquitetura.html. -## 5. Histórico de versão -|**Data**|**Descrição**|**Autore(es)**| +## 5. Histórico de Versão + +|**Data**|**Descrição**|**Autor(es)**| |--------|-------------|--------------| | 09/07/2024 | Criação do documento | Davi Matheus| -| 10/07/2024 | Revisao | Natanael Filho | -| 15/07/2024 | Adição do Diagrama de Arquitetura | Paulo Gontijo e João Bisinotti | -| 28/08/2024 | Atualização do Diagrama de Arquitetura | João Bisinotti | \ No newline at end of file +| 10/07/2024 | Revisão | Natanael Filho | +| 15/07/2024 | Adição do Diagrama de Arquitetura | Paulo Gontijo, João Bisinotti | +| 28/08/2024 | Atualização do Diagrama de Arquitetura | João Bisinotti | +| 01/09/2024 | Atualização geral do documento | Paulo Gontijo | From a061f7bebfd8445d30fe170bcab2eb2c53e7706d Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 17:29:43 -0300 Subject: [PATCH 04/22] docs(#142): atualizando o documento EAP --- docs/organizacoes/eap.md | 35 ++++++++++++++++++++++++++--------- 1 file changed, 26 insertions(+), 9 deletions(-) diff --git a/docs/organizacoes/eap.md b/docs/organizacoes/eap.md index 14f6ec1..1b8f8b9 100644 --- a/docs/organizacoes/eap.md +++ b/docs/organizacoes/eap.md @@ -1,31 +1,48 @@ +Aqui está o documento de Estrutura Analítica do Projeto (EAP) atualizado com a adição da seção para a Release 2: + +--- + # Estrutura Analítica do Projeto ## Contexto -A primeira versão da Estrutura Analítica do Projeto (EAP) mapeia os entregáveis planejados até o momento, proporcionando uma visão clara e estruturada do projeto. +A Estrutura Analítica do Projeto (EAP) apresentada nesta versão inicial mapeia os entregáveis planejados até o momento, proporcionando uma visão clara e estruturada do projeto. Este documento serve como uma referência para acompanhar o progresso e assegurar que todos os elementos críticos sejam devidamente gerenciados. ## Visão do Produto -A visão do produto é fundamentada no Canvas MVP, desenvolvido durante a Lean Inception, e no backlog do produto, que foi definido pela equipe de desenvolvimento em colaboração com o cliente. Abaixo está o artefato criado: +A visão do produto é baseada no Canvas MVP, desenvolvido durante a Lean Inception, e no backlog do produto, definido em colaboração entre a equipe de desenvolvimento e o cliente. A seguir, encontra-se o artefato visual que representa essa visão: - + ## Documentação -A documentação compreende os principais documentos que estabelecem os prazos, orçamentos, bem como os aspectos do produto e do projeto. +A documentação abrange os principais documentos que definem os prazos, orçamentos, e aspectos técnicos do produto e do projeto. Esses documentos são fundamentais para orientar o desenvolvimento e garantir o alinhamento entre todos os envolvidos. ## Treinamentos -Os treinamentos foram realizados pelos estudantes de EPS para os estudantes de MDS, com o objetivo de alinhar os conhecimentos nas tecnologias que serão aplicadas no projeto. +Os treinamentos foram ministrados pelos estudantes de EPS para os estudantes de MDS, com o objetivo de alinhar os conhecimentos nas tecnologias que serão aplicadas no projeto. Este processo assegura que todos os membros da equipe possuam as competências necessárias para contribuir eficazmente. ## Release 1 -Esta seção inclui as _user stories_ que serão entregues na primeira _release_ do projeto. +Esta seção descreve as _user stories_ que serão entregues na primeira _release_ do projeto, marcando a primeira etapa significativa do ciclo de desenvolvimento. + +## Release 2 +Nesta seção são apresentadas as _user stories_ planejadas para a segunda _release_ do projeto. Essa fase busca aprimorar as funcionalidades entregues na Release 1 e no MVP, adicionando novos recursos e melhorias baseadas no feedback dos usuários e nas necessidades do negócio. A Release 2 visa consolidar o produto, garantindo a sua evolução contínua e a satisfação dos stakeholders. ## Release MVP -Esta seção inclui as _user stories_ que serão entregues complementando o MVP definido. +Release MVP +A Release MVP (Produto Mínimo Viável) é uma etapa crucial no ciclo de desenvolvimento do Calculus. Nesta fase, o foco é entregar um conjunto de funcionalidades essenciais que permitem ao usuário final começar a interagir com a plataforma de maneira significativa. A definição do MVP foi realizada em colaboração com o cliente, garantindo que os requisitos mais críticos fossem priorizados. + +Esta release inclui as user stories fundamentais que estabelecem a base para o funcionamento do sistema. As funcionalidades implementadas nesta etapa são suficientes para validar as principais hipóteses do produto, testar a aceitação pelo usuário e coletar feedbacks que orientarão futuras iterações. Entre os recursos planejados para o MVP, destacam-se: + +Autenticação de Usuários: Implementação de um sistema de registro e login seguro, garantindo que apenas usuários autenticados possam acessar a plataforma. +Gestão de Conteúdo: Funcionalidades básicas para criação e organização de conteúdos pelos usuários, essencial para validar o core da plataforma. ## Resultado -![EAP](../assets/eap.png) +O diagrama abaixo ilustra os principais resultados obtidos até o momento, fornecendo uma visão consolidada dos avanços do projeto: + + +**Autor:** Calculus Team ## Histórico de Versão | Data | Versão | Descrição | Autor(es) | |------------|--------|-----------------------|------------------------------------| | 07/07/2024 | 1.0 | Criação do Documento | João Victor Max, Paulo Henrique Gontijo | | 12/07/2024 | 1.1 | Atualização do Documento | João Victor Max, Paulo Henrique Gontijo | -| 28/07/2024 | 1.2 | Refatorando escrita do artefato | Paulo Henrique Gontijo | \ No newline at end of file +| 28/07/2024 | 1.2 | Refatorando escrita do artefato | Paulo Henrique Gontijo | +| 01/09/2024 | 1.3 | Atualizando documento | Paulo Henrique Gontijo | \ No newline at end of file From 8c116949507b6c71f5f87353da13ae6ba6d7a0b9 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 17:30:25 -0300 Subject: [PATCH 05/22] docs(#142): ajuste de erro textual --- docs/organizacoes/eap.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/organizacoes/eap.md b/docs/organizacoes/eap.md index 1b8f8b9..2bdd3ea 100644 --- a/docs/organizacoes/eap.md +++ b/docs/organizacoes/eap.md @@ -1,7 +1,3 @@ -Aqui está o documento de Estrutura Analítica do Projeto (EAP) atualizado com a adição da seção para a Release 2: - ---- - # Estrutura Analítica do Projeto ## Contexto From 6f40cd554b854f5394806d3f883fb4d6957fcbdb Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 17:32:59 -0300 Subject: [PATCH 06/22] docs(#142): ajuste de texto --- docs/organizacoes/eap.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/docs/organizacoes/eap.md b/docs/organizacoes/eap.md index 2bdd3ea..2eef343 100644 --- a/docs/organizacoes/eap.md +++ b/docs/organizacoes/eap.md @@ -21,13 +21,13 @@ Esta seção descreve as _user stories_ que serão entregues na primeira _releas Nesta seção são apresentadas as _user stories_ planejadas para a segunda _release_ do projeto. Essa fase busca aprimorar as funcionalidades entregues na Release 1 e no MVP, adicionando novos recursos e melhorias baseadas no feedback dos usuários e nas necessidades do negócio. A Release 2 visa consolidar o produto, garantindo a sua evolução contínua e a satisfação dos stakeholders. ## Release MVP -Release MVP A Release MVP (Produto Mínimo Viável) é uma etapa crucial no ciclo de desenvolvimento do Calculus. Nesta fase, o foco é entregar um conjunto de funcionalidades essenciais que permitem ao usuário final começar a interagir com a plataforma de maneira significativa. A definição do MVP foi realizada em colaboração com o cliente, garantindo que os requisitos mais críticos fossem priorizados. Esta release inclui as user stories fundamentais que estabelecem a base para o funcionamento do sistema. As funcionalidades implementadas nesta etapa são suficientes para validar as principais hipóteses do produto, testar a aceitação pelo usuário e coletar feedbacks que orientarão futuras iterações. Entre os recursos planejados para o MVP, destacam-se: -Autenticação de Usuários: Implementação de um sistema de registro e login seguro, garantindo que apenas usuários autenticados possam acessar a plataforma. -Gestão de Conteúdo: Funcionalidades básicas para criação e organização de conteúdos pelos usuários, essencial para validar o core da plataforma. +- Gestão e autenticação de Usuários: Implementação de um sistema de registro e login seguro, garantindo que apenas usuários autenticados possam acessar a plataforma. + +- Gestão de Conteúdo: Funcionalidades básicas para criação e organização de conteúdos pelos usuários, essencial para validar o core da plataforma. ## Resultado O diagrama abaixo ilustra os principais resultados obtidos até o momento, fornecendo uma visão consolidada dos avanços do projeto: From a345d4367403a7ec26eaa0bf20b57609b9ccd7ba Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 18:04:43 -0300 Subject: [PATCH 07/22] fix(#142): removendo texto errado --- docs/organizacoes/documento_arquitetura.md | 4 ---- 1 file changed, 4 deletions(-) diff --git a/docs/organizacoes/documento_arquitetura.md b/docs/organizacoes/documento_arquitetura.md index 95cb950..58d19cd 100644 --- a/docs/organizacoes/documento_arquitetura.md +++ b/docs/organizacoes/documento_arquitetura.md @@ -1,7 +1,3 @@ -Aqui está o documento de arquitetura revisado com todas as alterações solicitadas: - ---- - # Documento de Arquitetura ## 1. Introdução From 28666eed06241d1bb73e8989cac1241ccbd3ab78 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 19:23:43 -0300 Subject: [PATCH 08/22] =?UTF-8?q?docs(#142):=20criando=20vis=C3=A3o=20de?= =?UTF-8?q?=20dados=20da=20plataforma?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/organizacoes/visao-de-dados.md | 362 ++++++++++++++++++++++++++++ mkdocs.yml | 45 ++-- 2 files changed, 383 insertions(+), 24 deletions(-) create mode 100644 docs/organizacoes/visao-de-dados.md diff --git a/docs/organizacoes/visao-de-dados.md b/docs/organizacoes/visao-de-dados.md new file mode 100644 index 0000000..835d6a3 --- /dev/null +++ b/docs/organizacoes/visao-de-dados.md @@ -0,0 +1,362 @@ +# Visão de Dados da Aplicação +*** +## 1. Introdução +Este documento descreve a visão geral de dados da aplicação, abordando a estrutura dos dados, os fluxos de informação, as fontes de dados, os processos de transformação e armazenamento, além dos padrões de acesso e governança. O objetivo é garantir que todos os aspectos relacionados ao gerenciamento de dados na aplicação estejam bem documentados e compreendidos por todos os stakeholders. + +*** +## 2. Modelagem de Dados +### 2.1. Modelo Conceitual + +O modelo conceitual do *Calculus* reflete a estrutura de dados fundamental que conecta conteúdos educacionais a alunos, com base em uma hierarquia que organiza as aulas em **Jornadas**, **Trilhas**, e **Conteúdos**. O sistema distingue entre diferentes tipos de usuários (Alunos, Professores, e Administradores), cada um com permissões específicas. Professores são os únicos que podem criar e editar conteúdos, enquanto alunos podem se inscrever em jornadas e acessar conteúdos, mas não podem modificá-los. + +#### Entidades e Relacionamentos: + +- **Usuário**: Representa qualquer pessoa com uma conta na plataforma. Os usuários têm papéis específicos: **Aluno**, **Professor**, e **Administrador**. Professores criam e editam conteúdos, enquanto alunos consomem os conteúdos dentro das jornadas em que estão inscritos. + +- **Jornada**: O maior nível na hierarquia educacional, composto por múltiplas trilhas. Alunos podem se inscrever em jornadas. + +- **Trilha**: Um conjunto de conteúdos organizados dentro de uma jornada. Trilhas agrupam conteúdos relacionados. + +- **Conteúdo**: O nível mais granular, criado e gerido por professores, e consumido por alunos. Cada conteúdo pertence a uma trilha. + +
+ +```mermaid +erDiagram + Usuario { + string id + string nome + string email + string role + } + Jornada { + string id + string titulo + string descricao + } + Trilha { + string id + string titulo + string descricao + string jornadaId + } + Conteudo { + string id + string titulo + string descricao + string trilhaId + string professorId + } + + Usuario ||--o{ Jornada : "inscreve-se" + Jornada ||--o{ Trilha : "composta por" + Trilha ||--o{ Conteudo : "contém" + Usuario ||--o{ Conteudo : "cria/edita/visualiza" + Usuario ||--o{ Jornada : "cria/edita/visualiza" + Usuario ||--o{ Trilha : "cria/edita/visualiza" +``` +**Autor:** Calculus Team +
+ +**Autor:** Calculus Team + +#### Descrição + +- **Jornada** é composta por várias **Trilhas**, que por sua vez contêm **Conteúdos**. +- **Usuários** desempenham diferentes funções (**Aluno**, **Professor**, **Administrador**), e suas interações com a plataforma são mediadas por suas permissões: + - **Alunos** podem se inscrever em **Jornadas** e acessar os conteúdos dentro delas. + - **Professores** criam e gerenciam **Conteúdos** dentro das **Trilhas** e **Jornadas** às quais estão associados. + +### 2.2. Modelo Lógico + +O modelo lógico detalha a estrutura de dados do *Calculus*, especificando as entidades, atributos, e os relacionamentos entre elas, com um foco maior nos detalhes técnicos, como chaves primárias e estrangeiras. + +
+ +```mermaid +classDiagram + class Usuario { + +String id PK + +String nome + +String email UNIQUE + +String senha + +String role + } + + class Jornada { + +String id PK + +String titulo + +String descricao + } + + class Trilha { + +String id PK + +String titulo + +String descricao + +String jornadaId FK + } + + class Conteudo { + +String id PK + +String titulo + +String descricao + +String trilhaId FK + +String professorId FK + } + + + Usuario "1" --> "0..*" Jornada : se inscreve + Jornada "1" --> "0..*" Trilha : contém + Trilha "1" --> "0..*" Conteudo : agrupa + Usuario "1" --> "0..*" Conteudo : cria/edita/visualiza + Usuario "1" --> "0..*" Trilha : cria/edita/visualiza + Usuario "1" --> "0..*" Jornada : cria/edita/visualiza +``` +**Autor:** Calculus Team +
+ +#### Descrição + +- **Usuario.role** define o tipo de usuário (Aluno, Professor, Administrador). +- **Inscricao** registra a participação de um aluno em uma jornada específica. +- **Conteudo** está sempre associado a um **Professor** (via **professorId**), que tem permissão para criar e editar o conteúdo. + +### 2.3. Modelo Físico + +O modelo físico traduz a lógica dos dados para a implementação real no banco de dados, definindo tabelas, colunas, tipos de dados, e relacionamentos. + +
+ +```mermaid +classDiagram + class tb_users { + +String id PK + +String nome + +String email UNIQUE + +String senha + +String role + } + + class tb_journeys { + +String id PK + +String titulo + +String descricao + } + + class tb_trails { + +String id PK + +String titulo + +String descricao + +String jornada_id FK + } + + class tb_contents { + +String id PK + +String titulo + +String descricao + +String trilha_id FK + +String professor_id FK + } + + + tb_users "1" --> "0..*" tb_journeys : se inscreve + tb_journeys "1" --> "0..*" tb_trails : contém + tb_trails "1" --> "0..*" tb_contents : agrupa + tb_users "1" --> "0..*" tb_contents : cria/edita + tb_users "1" --> "0..*" tb_journeys : cria/edita + tb_users "1" --> "0..*" tb_trails : cria/edita +``` +**Autor:** Calculus Team +
+ +#### Descrição + +- **tb_users**: Armazena informações de login e funções dos usuários na plataforma. +- **tb_journeys**, **tb_trails**, **tb_contents**: Tabelas que estruturam a hierarquia de conteúdos educacionais. + + +*** +## 3. Arquitetura de Dados + +A arquitetura de dados do projeto *Calculus* foi projetada para assegurar que a coleta, processamento e armazenamento de informações ocorram de maneira eficiente e segura. A aplicação gera dados a partir das interações dos usuários, que são processados por serviços dedicados e armazenados em collections específicas no MongoDB Atlas. Cada serviço possui suas próprias collections que estruturam os dados de maneira organizada. + +### 3.1. Fluxo de Dados + +No *Calculus*, os dados são gerados a partir das interações dos usuários no frontend, que envia requisições para serviços no backend. Esses serviços processam os dados e interagem com collections específicas no MongoDB para armazenamento e recuperação. + +Descrição do Fluxo: + +1. **Interação do Usuário**: Usuários (alunos, professores, ou administradores) interagem com a interface da aplicação, realizando ações como autenticação, criação de conteúdos, inscrição em jornadas, etc. +2. **Envio de Requisições**: Essas interações resultam em requisições que são enviadas para serviços específicos: + - **UserService**: Gestão e autenticação de usuários, lidando com a criação e verificação de tokens de autenticação, além de gerenciar dados do usuário. + - **StudioMakerService**: Criação, edição e gestão de conteúdos educacionais, incluindo a estruturação de jornadas, trilhas e conteúdos. +3. **Processamento e Armazenamento**: Os dados processados são então armazenados em collections dedicadas dentro do MongoDB Atlas, conforme o serviço correspondente. + +Abaixo segue um diagrama que representa visualmente o conceito abordado acima: + +
+ +```mermaid +flowchart TD + UserFrontend[User Frontend] --> UserService + UserFrontend --> StudioMakerService + + UserService --> UsersDB[(users)] + UserService --> RefreshTokensDB[(refreshtokens)] + UserService --> ResetTokensDB[(resettokens)] + + StudioMakerService --> ContentsDB[(contents)] + StudioMakerService --> JourneysDB[(journeys)] + StudioMakerService --> TrailsDB[(trails)] + StudioMakerService --> StartpointsDB[(startpoints)] +``` +**Autor:** Calculus Team + +
+ +- **UserService** interage com as collections **users**, **refreshtokens**, e **resettokens**: + - **users**: Armazena informações de usuários, como credenciais e perfis. + - **refreshtokens**: Gera e armazena tokens usados para manter a sessão do usuário. + - **resettokens**: Armazena tokens temporários para redefinição de senhas. +- **StudioMakerService** interage com as collections **contents**, **journeys**, **trails**, e **startpoints**: + - **contents**: Armazena os materiais educacionais criados pelos professores. + - **journeys**: Armazena informações sobre jornadas, que agrupam trilhas educacionais. + - **trails**: Armazena trilhas, que são compostas por conteúdos. + - **startpoints**: Registra pontos de partida ou progresso em trilhas e jornadas. + +### 3.2. Fontes de Dados + +As principais fontes de dados no *Calculus* são as interações dos usuários, que geram informações processadas e armazenadas nas collections do MongoDB. A aplicação não depende de fontes externas; todos os dados são gerados e manipulados internamente pelos serviços. + +- **UserService**: Gerencia dados relacionados a usuários, incluindo autenticação, roles (permissões de aluno, professor, administrador) e gerenciamento de tokens. +- **StudioMakerService**: Gerencia a criação e edição de conteúdos educacionais e a estruturação de jornadas e trilhas. + +Cada serviço possui suas próprias collections no MongoDB, organizando os dados de forma eficiente e segura. + +### 3.3. Armazenamento de Dados + +O armazenamento dos dados no *Calculus* é realizado por meio de collections específicas em instâncias de MongoDB Atlas. Cada serviço possui suas próprias collections dedicadas para manter os dados organizados e seguros. + +#### Estrutura de Armazenamento: +- **UserDB (MongoDB Atlas)**: Armazena dados relacionados a usuários e autenticação. + - **users**: Dados do usuário, como credenciais e roles. + - **refreshtokens**: Tokens de sessão do usuário. + - **resettokens**: Tokens para redefinição de senhas. + +- **ContentDB (MongoDB Atlas)**: Armazena dados relacionados a conteúdos educacionais. + - **contents**: Materiais educacionais criados pelos professores. + - **journeys**: Estrutura de jornadas que agrupam trilhas. + - **trails**: Conjunto de trilhas associadas às jornadas. + - **startpoints**: Marca o progresso ou o início em trilhas e jornadas. + +Abaixo segue um diagrama que resume o conceito apresentado visualmente: + +
+ +```mermaid +flowchart TD + subgraph MongoDB Atlas + D[(users)] --> B[UserService] + E[(refreshtokens)] --> B + F[(resettokens)] --> B + + G[(contents)] --> C[StudioMakerService] + H[(journeys)] --> C + I[(trails)] --> C + J[(startpoints)] --> C + end + + B -.->|Leitura e Escrita| D + B -.->|Leitura e Escrita| E + B -.->|Leitura e Escrita| F + + C -.->|Leitura e Escrita| G + C -.->|Leitura e Escrita| H + C -.->|Leitura e Escrita| I + C -.->|Leitura e Escrita| J +``` +**Autor:** Calculus Team + +
+ +- Cada serviço (UserService, StudioMakerService) está conectado às suas respectivas collections no MongoDB Atlas. +- **UserDB** e **ContentDB**: Cada um possui suas collections específicas, garantindo organização, segurança e eficiência no gerenciamento dos dados. + +Considerações de Armazenamento: + +- **Isolamento**: Cada serviço tem suas próprias collections para evitar interferências e facilitar a manutenção. +- **Escalabilidade**: MongoDB Atlas permite o crescimento dos bancos de dados conforme a demanda da aplicação aumenta. +- **Segurança**: As interações com o MongoDB Atlas são realizadas de forma segura, requisitando autenticação válida para cada tipo de ação, garantindo que os dados estejam protegidos contra acessos não + +*** +## 4. Governança de Dados + +A governança de dados no *Calculus* é fundamental para garantir que todas as informações gerenciadas pela aplicação sejam tratadas de forma segura, precisa e conforme as regulamentações aplicáveis. A seção a seguir detalha as práticas de segurança, qualidade de dados, e conformidade implementadas no sistema. + +### 4.1. Políticas de Segurança + +As políticas de segurança do *Calculus* são desenhadas para proteger os dados contra acessos não autorizados, garantir a integridade das informações e assegurar a disponibilidade dos dados para os usuários legítimos. + +- **Autenticação e Autorização**: Todos os acessos à aplicação são controlados por um sistema robusto de autenticação e autorização. Os usuários devem se autenticar via credenciais seguras, e os tokens de sessão são gerenciados através das collections **refreshtokens** e **resettokens** no MongoDB. +- **Criptografia**: Dados sensíveis, como senhas de usuário e tokens de autenticação, são criptografados tanto em trânsito quanto em repouso. A comunicação entre o frontend e o backend é realizada via HTTPS para garantir a proteção dos dados em trânsito. +- **Backup e Recuperação**: Rotinas de backup são implementadas para garantir que os dados possam ser recuperados em caso de falha. O MongoDB Atlas oferece recursos avançados de backup e recuperação de desastres. + +
+ +```mermaid +flowchart TD + A[Entrada de Dados] --> B[Autenticacao e Autorizacao] + B --> C[Criptografia] + C --> D[Monitoramento de Acessos] + D --> E[Armazenamento Seguro] +``` +**Autor:** Calculus Team +
+ +### 4.2. Qualidade de Dados + +A qualidade dos dados é essencial para garantir que as informações usadas pelos alunos e professores sejam precisas, completas e consistentes. O *Calculus* adota várias práticas para manter altos padrões de qualidade de dados. + +- **Validação**: Todos os dados inseridos pelos usuários ou processados pelos serviços são validados para garantir que estejam no formato correto e dentro dos limites esperados. Por exemplo, os dados de **users**, **contents**, e **journeys** passam por validações de integridade antes de serem armazenados. +- **Consistência**: Garantir a consistência dos dados entre as diferentes collections é fundamental. Relacionamentos entre **journeys**, **trails**, e **contents** são verificados para assegurar que as referências cruzadas sejam válidas. + +
+ +```mermaid +flowchart TD + A[Entrada de Dados] --> B[Validação de Dados] + B --> C[Transformação de Dados] + C --> E[Armazenamento] +``` +**Autor:** Calculus Team +
+ +### 4.3. Conformidade e Regulamentação + +O *Calculus* está comprometido em cumprir todas as leis e regulamentações aplicáveis relacionadas à proteção de dados e privacidade. As práticas descritas abaixo garantem que a aplicação esteja em conformidade com normas como a GDPR (General Data Protection Regulation) e a LGPD (Lei Geral de Proteção de Dados). + +- **Anonimização e Pseudonimização**: Dados pessoais dos usuários, quando não necessários para a operação direta do sistema, são anonimizados ou pseudonimizados para proteger a privacidade dos usuários. +- **Gestão de Consentimento**: Os usuários são informados sobre como seus dados serão usados e devem fornecer consentimento explícito para o processamento de suas informações. As preferências de consentimento são gerenciadas e registradas no sistema. +- **Direitos dos Usuários**: Os usuários têm o direito de acessar, corrigir, ou excluir seus dados pessoais conforme as leis aplicáveis. O sistema implementa mecanismos para que esses direitos possam ser exercidos de maneira simples e eficaz. + +
+```mermaid +flowchart TD + A[Coleta de Dados] --> B[Anonimizacao] + B --> C[Armazenamento de Dados] + C --> D[Revisao de Conformidade] +``` +**Autor:** Calculus Team +
+ +## 6. Revisão Bibliográfica + +> Inmon, W. H., Strauss, D., & Neushloss, G. (2010). *DW 2.0: The Architecture for the Next Generation of Data Warehousing*. Morgan Kaufmann. + +> ISO/IEC 27001 (2013). *Information technology — Security techniques — Information security management systems — Requirements*. + +## 7. Histórico de Versão + +| Data | Versão | Descrição | Autor(es) | +|------------|--------|-----------------------------------------|--------------------------------------| +| 01/09/2024 | 1.0 | Criação do documento | Paulo Gontijo | \ No newline at end of file diff --git a/mkdocs.yml b/mkdocs.yml index b88c781..6987cec 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -33,38 +33,35 @@ extra_css: nav: - Sobre: 'index.md' - - Organizações do Projeto: + - Lean Inception: + - Visão do Produto: 'lean/visao_produto.md' + - É - Não É - Faz - Não Faz: 'lean/faz_nao_faz.md' + - Objetivos do Produto: 'lean/objetivos_produto.md' + - Jornada: 'lean/jornada_usuário.md' + - Revisão Técnica, de Negócio e de UX: 'lean/revisao_tecnica.md' + - Sequenciador: 'lean/sequenciador.md' + - Personas: 'lean/personas.md' + - Brainstorm: 'lean/brainstorms_funcionalidades.md' + - Canvas MVP: 'lean/canvas_mvp.md' + - Documentação Técnica: - Termo de Abertura do Projeto: 'organizacoes/tap.md' - Documento de Arquitetura: 'organizacoes/documento_arquitetura.md' - Estrutura Analítica do Projeto: 'organizacoes/eap.md' - - Planejamentos: - - Quadro de disponibilidade: 'planejamento/quadro_de_disponibilidade.md' - - Quadro de conhecimento e pareamento: 'planejamento/conhecimento_pareamento.md' + - Visão de Dados: 'organizacoes/visao-de-dados.md' + - Gestão do Projeto: + - Quadro de Disponibilidade: 'planejamento/quadro_de_disponibilidade.md' + - Quadro de Conhecimento e Pareamento: 'planejamento/conhecimento_pareamento.md' - Agenda e Ritual da Equipe: 'planejamento/agenda_ritual.md' - Planejamento de Comunicação: 'planejamento/comunicacao.md' - - Guias: - - Guia de contribuição: 'guias/guia-contribuicao.md' - - Código de conduta: 'guias/codigo-conduta.md' - - Guia de estilo: 'guias/guia-estilo.md' - - Planos: - Analise de Riscos: 'planos/planos_riscos.md' - Plano de qualidade: 'planos/plano_qualidade.md' - Plano de custos: 'planos/planos_custos.md' - - Atas de Reunião: - - Reunião 1 - 25/03: 'atas/reuniao1.md' - - Reunião 2 - 01/04: 'atas/reuniao2.md' - - Reunião 3 - 03/04: 'atas/reuniao3.md' - - Dojo: + - Guias: + - Guia de contribuição: 'guias/guia-contribuicao.md' + - Guia de estilo: 'guias/guia-estilo.md' + - Código de conduta: 'guias/codigo-conduta.md' + - Dojos: - Dojo Markdown: 'dojo/dojo-markdown.md' - Dojo Git: 'dojo/dojo-git.md' - Dojo Docker: 'dojo/dojo-docker.md' - - Lean Inception: - - Visão do Produto: 'lean/visao_produto.md' - - É - Não É - Faz - Não Faz: 'lean/faz_nao_faz.md' - - Objetivos do Produto: 'lean/objetivos_produto.md' - - Jornada: 'lean/jornada_usuário.md' - - Revisão Técnica, de Negócio e de UX: 'lean/revisao_tecnica.md' - - Sequenciador: 'lean/sequenciador.md' - - Personas: 'lean/personas.md' - - Brainstorm: 'lean/brainstorms_funcionalidades.md' - - Canvas MVP: 'lean/canvas_mvp.md' + From 1ace67c1b74f6352ed7b3d8ffb0aaf7dc2b41f76 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 19:34:56 -0300 Subject: [PATCH 09/22] docs(#142): adicionando o documento de endpoints --- docs/organizacoes/visao-de-endpoints.md | 123 ++++++++++++++++++++++++ mkdocs.yml | 1 + 2 files changed, 124 insertions(+) create mode 100644 docs/organizacoes/visao-de-endpoints.md diff --git a/docs/organizacoes/visao-de-endpoints.md b/docs/organizacoes/visao-de-endpoints.md new file mode 100644 index 0000000..8a4e4a0 --- /dev/null +++ b/docs/organizacoes/visao-de-endpoints.md @@ -0,0 +1,123 @@ +# Endpoints dos Serviços +*** +## 1. Introdução + +Este documento descreve os endpoints dos principais serviços da aplicação *Calculus*, incluindo suas rotas e portas. Os serviços estão segmentados de acordo com suas responsabilidades, como gestão de usuários e gestão de conteúdos. Cada serviço expõe uma série de endpoints RESTful que permitem a interação com a aplicação. Este documento é essencial para assegurar que os diferentes componentes do sistema possam se comunicar de forma eficaz. + +*** +## 2. UserService + +O **UserService** é responsável pela gestão e autenticação dos usuários na plataforma *Calculus*. Este serviço lida com operações como registro, login, gerenciamento de tokens e redefinição de senha. + +### 2.1. Endpoints + +| Método | Rota | Descrição | +|--------|-----------------------|-----------------------------------------------------| +| POST | `/api/v1/users/register` | Registro de novos usuários na plataforma | +| POST | `/api/v1/users/login` | Autenticação de usuários | +| POST | `/api/v1/users/token` | Geração de novos tokens de acesso | +| POST | `/api/v1/users/reset` | Solicitação de redefinição de senha | +| GET | `/api/v1/users/me` | Recupera as informações do usuário autenticado | + +### 2.2. Configuração de Porta + +O **UserService** opera na porta **3000**. Todas as requisições a esse serviço devem ser direcionadas para essa porta no servidor onde o serviço está hospedado. + +```yaml +Host: calculus-dev.eastus2.cloudapp.azure.com +Port: 3000 +``` + +*** +## 3. StudioMakerService + +O **StudioMakerService** é responsável pela criação, edição e gestão dos conteúdos educacionais, incluindo a organização de jornadas e trilhas. Professores utilizam este serviço para gerenciar o conteúdo que será consumido pelos alunos. + +### 3.1. Endpoints + +| Método | Rota | Descrição | +|--------|------------------------------------|----------------------------------------------------------------| +| POST | `/api/v1/contents` | Criação de novos conteúdos | +| GET | `/api/v1/contents/:id` | Recupera um conteúdo específico pelo ID | +| PUT | `/api/v1/contents/:id` | Atualiza um conteúdo existente | +| DELETE | `/api/v1/contents/:id` | Remove um conteúdo existente | +| GET | `/api/v1/journeys` | Recupera todas as jornadas | +| POST | `/api/v1/journeys` | Criação de novas jornadas | +| GET | `/api/v1/journeys/:id` | Recupera uma jornada específica pelo ID | +| PUT | `/api/v1/journeys/:id` | Atualiza uma jornada existente | +| DELETE | `/api/v1/journeys/:id` | Remove uma jornada existente | +| GET | `/api/v1/trails` | Recupera todas as trilhas | +| POST | `/api/v1/trails` | Criação de novas trilhas | +| GET | `/api/v1/trails/:id` | Recupera uma trilha específica pelo ID | +| PUT | `/api/v1/trails/:id` | Atualiza uma trilha existente | +| DELETE | `/api/v1/trails/:id` | Remove uma trilha existente | +| GET | `/api/v1/startpoints` | Recupera todos os pontos de partida | +| POST | `/api/v1/startpoints` | Criação de novos pontos de partida | +| GET | `/api/v1/startpoints/:id` | Recupera um ponto de partida específico pelo ID | +| PUT | `/api/v1/startpoints/:id` | Atualiza um ponto de partida existente | +| DELETE | `/api/v1/startpoints/:id` | Remove um ponto de partida existente | + +### 3.2. Configuração de Porta + +O **StudioMakerService** opera na porta **3002**. As requisições destinadas à criação e gestão de conteúdos educacionais devem ser direcionadas para essa porta. + +```yaml +Host: calculus-dev.eastus2.cloudapp.azure.com +Port: 3002 +``` +*** +## 4. Frontend + +O **Frontend** da aplicação *Calculus* é responsável por fornecer a interface com a qual os usuários interagem. Ele se comunica com os serviços backend (**UserService** e **StudioMakerService**) para fornecer funcionalidades como autenticação, visualização e gestão de conteúdos educacionais. Esta seção descreve as rotas principais do frontend e a configuração da porta onde ele é servido. + +### 4.1. Rotas + +O **Frontend** utiliza várias rotas para organizar as diferentes páginas e funcionalidades acessíveis aos usuários: + +| Rota | Descrição | +|-------------------------|---------------------------------------------------------------------------| +| `/` | Página inicial da aplicação | +| `/login` | Página de login para autenticação de usuários | +| `/register` | Página de registro para novos usuários | +| `/dashboard` | Dashboard do usuário autenticado | +| `/contents` | Página para visualização e gestão dos conteúdos | +| `/journeys` | Página para visualização e gestão de jornadas | +| `/trails` | Página para visualização e gestão de trilhas | +| `/contents/:id` | Página para visualização detalhada de um conteúdo específico | +| `/journeys/:id` | Página para visualização detalhada de uma jornada específica | +| `/trails/:id` | Página para visualização detalhada de uma trilha específica | +| `/profile` | Página de perfil do usuário, para visualização e edição das informações pessoais | + +### 4.2. Configuração de Porta + +O **Frontend** da aplicação é servido na porta **4000**. Os usuários acessam a interface do *Calculus* através desta porta. + +```yaml +Host: calculus-dev.eastus2.cloudapp.azure.com +Port: 4000 +``` + +### 4.3. Comunicação com Backend + +O **Frontend** se comunica com os serviços backend (**UserService** e **StudioMakerService**) através de chamadas HTTP/HTTPS. Todas as interações, como autenticação e gerenciamento de conteúdos, são realizadas via APIs RESTful fornecidas pelos serviços backend. + +
+```mermaid +flowchart TD + A[Frontend] -->|3000| B[UserService] + A -->|3002| C[StudioMakerService] +``` +**Autor:** Calculus Team + +
+ +*** +## 5. Segurança dos Endpoints + +Todos os endpoints expostos pelos serviços do *Calculus* são protegidos por mecanismos de autenticação e autorização. Apenas usuários autenticados podem acessar os endpoints que manipulam dados sensíveis ou críticos. Tokens de autenticação, gerenciados pelo **UserService**, são necessários para acessar a maioria das rotas, garantindo que somente usuários autorizados possam realizar operações. + +## 6. Histórico de Versão + +| Data | Versão | Descrição | Autor(es) | +|------------|--------|-----------------------------------------|---------------------------------------| +| 01/09/2024 | 1.0 | Criação do documento | Paulo Gontijo | diff --git a/mkdocs.yml b/mkdocs.yml index 6987cec..1c298fc 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -48,6 +48,7 @@ nav: - Documento de Arquitetura: 'organizacoes/documento_arquitetura.md' - Estrutura Analítica do Projeto: 'organizacoes/eap.md' - Visão de Dados: 'organizacoes/visao-de-dados.md' + - Visão de Endpoints: 'organizacoes/visao-de-endpoints.md' - Gestão do Projeto: - Quadro de Disponibilidade: 'planejamento/quadro_de_disponibilidade.md' - Quadro de Conhecimento e Pareamento: 'planejamento/conhecimento_pareamento.md' From 490138d4001901e245266c4f69a7f3e45163fe37 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 19:54:48 -0300 Subject: [PATCH 10/22] =?UTF-8?q?docs(#142):=20adicionando=20teamplates=20?= =?UTF-8?q?em=20guia=20de=20contribui=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/guias/guia-contribuicao.md | 263 ++++++++++++++++++++++---------- 1 file changed, 180 insertions(+), 83 deletions(-) diff --git a/docs/guias/guia-contribuicao.md b/docs/guias/guia-contribuicao.md index 353e823..f3bee3a 100644 --- a/docs/guias/guia-contribuicao.md +++ b/docs/guias/guia-contribuicao.md @@ -1,154 +1,251 @@ -# Git Flow -Este documento tem o objetivo de consolidar padrões de uso do git no desenvolvimento de nossa aplicação. +Aqui estão os títulos e subtítulos do documento reescritos com numeração de sumário: + +--- + +# 1. Git Flow + +Este documento tem o objetivo de consolidar padrões de uso do Git no desenvolvimento de nossa aplicação. + *** -## Motivação -Conforme nomeação do documento, neste projeto usaremos uma adaptação do padrão **git flow**. Este conceito tem seu fundamento -na organização de repositórios, atribuindo políticas de uso e restrições de segurança, sempre com objetivo de cumprir com -as práticas mais adequadas, observadas e aperfeiçoadas ao longo do tempo. +## 1.1. Motivação + +Conforme nomeação do documento, neste projeto usaremos uma adaptação do padrão **git flow**. Este conceito tem seu fundamento na organização de repositórios, atribuindo políticas de uso e restrições de segurança, sempre com o objetivo de cumprir com as práticas mais adequadas, observadas e aperfeiçoadas ao longo do tempo. *** -## Políticas de Contribuição +## 1.2. Políticas de Contribuição + *** -### Idioma -Por se tratar de um projeto univesitário do Brasil, por padrão, usaremos o idioma nativo, **Português**. Poŕem, sabe-se -que a área de engenharia de software possui muitos conteúdos e termos em outros idiomas, como o próprio *git flow*, portanto -também será aceito o uso de **terminologias** no idioma **Inglês**. + +### 1.2.1. Idioma + +Por se tratar de um projeto universitário do Brasil, por padrão, usaremos o idioma nativo, **Português**. Porém, sabe-se que a área de engenharia de software possui muitos conteúdos e termos em outros idiomas, como o próprio *git flow*, portanto, também será aceito o uso de **terminologias** no idioma **Inglês**. *** -### Ética -O projeto espera do colaborador bom senso na escrita, além de não permitir a produção contribuições com linguagem ofensiva. -A proposta perpassa pela interação direta com a vivência e moradia de pessoas, portanto também assume-se o compromisso -de não violar o respeito em qualquer aspecto, sobretudo étnico racial, religião e sexualidade. + +### 1.2.2. Ética + +O projeto espera do colaborador bom senso na escrita, além de não permitir a produção de contribuições com linguagem ofensiva. A proposta perpassa pela interação direta com a vivência e moradia de pessoas, portanto também assume-se o compromisso de não violar o respeito em qualquer aspecto, sobretudo étnico racial, religião e sexualidade. *** -## Branches -### Fluxo de Branches -Para garantir um fluxo de trabalho contínuo e de forma padronizada, possibilitando o rastreamento das funcionalidades -desenvolvidas e facilitando o desenvolvimento contínuo. Os conceitos chave para implementação da estratégia serão: -* `Main` -Branch de **produção**, responsável por abrigar o código do último release. +## 1.3. Branches -* `Qas` -Branch de **verificação**, representa uma etapa intermediária entre o processo de desenvolvimento e produção. Nesta etapa -são realizados os eventuais testes e revisões que antecedem o processo de deploy. +### 1.3.1. Fluxo de Branches -* `Dev` -Branch de **desenvolvimento**, tem a função e prioridade de ser a branch mais atualizada, a qual os desenvolvedores utilizaram -de ponto de partida para desenvolver as *features branches*. +Para garantir um fluxo de trabalho contínuo e de forma padronizada, possibilitando o rastreamento das funcionalidades desenvolvidas e facilitando o desenvolvimento contínuo. Os conceitos-chave para implementação da estratégia serão: -* `Feature` -Branch de desenvolvimento de **funcionalidade**, representa a branch de trabalho sob uma determinada funcionalidade, tarefa, -correção de bugs e afins. +- `Main`: Branch de **produção**, responsável por abrigar o código do último release. +- `Qas`: Branch de **verificação**, representa uma etapa intermediária entre o processo de desenvolvimento e produção. Nesta etapa são realizados os eventuais testes e revisões que antecedem o processo de deploy. +- `Dev`: Branch de **desenvolvimento**, tem a função e prioridade de ser a branch mais atualizada, a qual os desenvolvedores utilizarão como ponto de partida para desenvolver as *features branches*. +- `Feature`: Branch de desenvolvimento de **funcionalidade**, representa a branch de trabalho sob uma determinada funcionalidade, tarefa, correção de bugs e afins. +- `Fix`: Branch de **correção**, possibilita aos desenvolvedores corrigirem eventuais funcionalidades quebradas. -* `Fix` -Branch de **correção**, possibilita os desenvolvedores de corrigirem eventuais funcionalidades quebradas. +#### 1.3.1.1. Exemplo do Fluxo de Branches -#### Exemplo do fluxo de branches Abaixo segue a ilustração do fluxo: - -![Figura 1: Fluxo de Branches](../assets/gitflow/diagrama-gitflow.drawio.png) -Figura 1: Fluxo de Branches +![Figura 1: Fluxo de Branches](../assets/gitflow/diagrama-gitflow.drawio.png) +**Figura 1: Fluxo de Branches** Autor: Calculus Team -### Nomenclatura de Branch -É importante que a branch de **funcionalidade** seja criada seguindo o padrão: +### 1.3.2. Nomenclatura de Branch -* **(número-da-issue)-(nome-da-issue)** +É importante que a branch de **funcionalidade** seja criada seguindo o padrão: -e seja criada a partir da branch de desenvolvimento `Dev` e deve-se trocar os espaços no nome para '-'. +- **(número-da-issue)-(nome-da-issue)** -A branch de **correção** deve ser criada no padrão: +Ela deve ser criada a partir da branch de desenvolvimento `Dev` e deve-se trocar os espaços no nome para '-'. -- **fix#(número-da-issue)/nome-da-issue** +A branch de **correção** deve ser criada no padrão: -e originar-se da branch que apresentou o erro, exceto se for a branch `Main`. Em caso de exceção, deve-se crira uma branch a partir de `Dev`. +- **fix#(número-da-issue)/nome-da-issue** +Ela deve originar-se da branch que apresentou o erro, exceto se for a branch `Main`. Em caso de exceção, deve-se criar uma branch a partir de `Dev`. -## Commits +## 1.4. Commits As informações abaixo referem-se aos padrões de escrita de commits do nosso repositório: -### Commits Atômicos -Sempre dividir o trabalho em **pequenos e significativos commits**, de maneira que cada commit implemente apenas uma -funcionalidade. +### 1.4.1. Commits Atômicos + +Sempre dividir o trabalho em **pequenos e significativos commits**, de maneira que cada commit implemente apenas uma funcionalidade. -### Anatomia do Commit -Na estrutura do padrão convencionado, possuímos as variáveis **tipo**, **número da issue**, **assunto** e **corpo**. -A anatomia do commit deve seguir o formato determinado abaixo: +### 1.4.2. Anatomia do Commit + +Na estrutura do padrão convencionado, possuímos as variáveis **tipo**, **número da issue**, **assunto** e **corpo**. A anatomia do commit deve seguir o formato determinado abaixo: ``` [tipo](#número da issue): assunto > corpo ``` -#### Observações +#### 1.4.2.1. Observações + > As opções permitidas para o campo `tipo` são: -> - `feat`: nova funcionalidade -> - `docs`: relacionado a documentação -> - `refact`: refatoração de código -> - `test`: adicionar/refatorar testes -> - `fix`: correções +- `feat`: nova funcionalidade +- `docs`: relacionado à documentação +- `refact`: refatoração de código +- `test`: adicionar/refatorar testes +- `fix`: correções > As regras para o campo `assunto` são: -> - Mensagem curta e sucinta -> - Todo texto deve estar sempre em letras minúsculas +- Mensagem curta e sucinta +- Todo texto deve estar sempre em letras minúsculas > As regras para o campo `corpo` são: -> - Máximo de 100 caracteres -> - Detalhar minimamente as novas alterações -> - Deve conter `o que` e o `por que` foi feito +- Máximo de 100 caracteres +- Detalhar minimamente as novas alterações +- Deve conter `o que` e `por que` foi feito + +### 1.4.3. Exemplo de Commit -### Exemplo de commit: Abaixo segue um exemplo de commit feito no padrão do projeto: + ```git [refact](#25): ajustando página de login Refatoração do método de login pois a execução estava muito lenta. ``` *** -## Pull Request -#### Passo 1 -Por meio do processo de **pull request**, realizado no github, toda nova funcionalidade deve ser integrada à branch de -desenvolvimento, seguindo o fluxo `Feature -> Dev`. -#### Passo 2 -Uma vez que a branch de desenvolvimento esteja com todos os artefatos necessários para se fazer deploy, deve-se criar um -pull request de `Dev -> Qas`. +## 1.5. Pull Request + +### 1.5.1. Passo 1 + +Por meio do processo de **pull request**, realizado no GitHub, toda nova funcionalidade deve ser integrada à branch de desenvolvimento, seguindo o fluxo `Feature -> Dev`. -#### Passo 3 -A branch de validação (qas) deve ser **revisada por todos os membros antes de relizar-se o merge para a branch Main**. -Desta forma pode-se adicionar mais uma camada de validação pré-deploy e conferir mais acertividade nas entregas. Após -concluir a validação, +### 1.5.2. Passo 2 -> Dentre as atividades obrigatórias de um pull request, estão a **revisão em pares** da entrega e **ajuste de eventuais conflitos**. +Uma vez que a branch de desenvolvimento esteja com todos os artefatos necessários para se fazer deploy, deve-se criar um pull request de `Dev -> Qas`. + +### 1.5.3. Passo 3 + +A branch de validação (`Qas`) deve ser **revisada por todos os membros antes de realizar o merge para a branch `Main`**. Desta forma, pode-se adicionar mais uma camada de validação pré-deploy e conferir mais assertividade nas entregas. Após concluir a validação: + +> Dentre as atividades obrigatórias de um pull request, estão a **revisão em pares** da entrega e **ajuste de eventuais conflitos**. > O colaborador que abrir o pull request **não pode mergear o mesmo sem revisões de terceiros**. -Para publicar uma nova versão estável da aplicação na branch `main` é necessário realizar um **Pull Request** da branch `qas` para a `main`. Assim garantido a revisão da nova versão do código. +Para publicar uma nova versão estável da aplicação na branch `Main`, é necessário realizar um **Pull Request** da branch `Qas` para a `Main`. Assim, é garantida a revisão da nova versão do código. + +### 1.5.4. Nomenclatura -### Nomenclatura -Toda branch deve estar necessariamente estar relacionada a uma funcionalidade ou correção, logo a uma _Issue_. O nome da branch deve estar em PORTUGUÊS seguindo o padrão: +Toda branch deve estar necessariamente relacionada a uma funcionalidade ou correção, logo a uma _Issue_. O nome da branch deve estar em PORTUGUÊS seguindo o padrão: - Para funcionalidades: `feat#(número-da-issue)/descrição-curta` - Para correções: `fix#(número-da-issue)/descrição-curta` -Exemplo: `feat#75/criar-jornada` +**Exemplo:** `feat#75/criar-jornada` + +*** + +## 1.6. Templates + +Aqui estão os templates sugeridos para o guia de contribuição, cobrindo **User Stories**, **Pull Requests** e **Issues**. Esses templates podem ser usados para garantir que as contribuições ao projeto *Calculus* sejam consistentes e bem documentadas. + +### 1.6.1. User Story Template + +#### 1.6.1.1. Título: +``` +US$ - Nome da User Story +``` + +#### 1.6.1.2. Descrição: +``` +**Contexto:** +Como [tipo de usuário], eu quero [ação desejada] para [objetivo/motivo]. + +**Tarefas:** +- [ ] Tarefa 1: Detalhe a primeira tarefa que precisa ser concluída. +- [ ] Tarefa 2: Detalhe a segunda tarefa, se aplicável. +- [ ] Tarefa 3: Detalhe outras tarefas necessárias. + +**Critérios de Aceitação:** +- [ ] Critério 1: Detalhe o primeiro critério que deve ser atendido para que a história seja considerada completa. +- [ ] Critério 2: Detalhe o segundo critério, se aplicável. +- [ ] Critério 3: Detalhe qualquer outro critério necessário. +``` + +#### 1.6.1.3. Exemplo: +``` +**Título: US04 - Criar Jornada** + +Como professor, eu quero criar uma nova jornada educacional para organizar meus conteúdos. + +**Tarefas:** +- [ ] Implementar a interface de criação de jornada. +- [ ] Conectar a interface ao backend para salvar a nova jornada. +- [ ] Testar a funcionalidade com diferentes tipos de dados. + + +**Critérios de Aceitação:** +- [ ] O professor deve poder acessar a funcionalidade de criação de jornada a partir do dashboard. +- [ ] O formulário de criação de jornada deve incluir campos para título, descrição e trilhas associadas. +- [ ] A nova jornada deve ser salva no banco de dados e refletida na interface. + +``` *** -## Histórico de Versões -| Versão | Data | Descrição | **Autore(es)** | -|:------:|:----------:|:-------------------------------:|:-----------------------------------------------------------------------------------------------------------:| -| 1.0 |04/02/2024| Criação do documento | Natanael Fernandes | -| 1.1 | 08/07/2024 | Atualização de documento e diagrama | Paulo Gontijo | +Aqui está a seção de Pull Request reescrita com base no template fornecido: + +--- + +### 1.6.2. Pull Request Template + +#### 1.6.2.1. Título: +``` +[Tipo de mudança] Adiciona/modifica [funcionalidade/bugfix] - #[ID da user story ou issue] +``` + +#### 1.6.2.2. Descrição +``` +Este Pull Request implementa/modifica [descrição da funcionalidade ou correção] conforme descrito na user story ou issue #[ID da user story ou issue]. +``` + +#### 1.6.2.3. Revisão +``` +- [x] Descreve a tarefa principal realizada (ex: Cria interface para a nova funcionalidade). +- [x] Detalha outras alterações relevantes (ex: Implementa validações necessárias). +``` + +#### 1.6.2.4. Pre-merge checklist +``` +- [x] O Pull Request refere-se a um único assunto, com um título claro e uma descrição em frases gramaticalmente corretas e completas. +- [x] A branch está atualizada com a branch main. +- [x] Os commits atendem ao padrão especificado na política de contribuição. +``` + +#### 1.6.2.5. Exemplo: +``` +**Título:** +[Feature] Adiciona funcionalidade de criação de jornada - #42 + +**Descrição:** +Este Pull Request implementa a funcionalidade de criação de jornadas para professores, conforme descrito na user story #42. +**Revisão:** +- [x] Cria interface de criação de jornada. +- [x] Implementa validações de unicidade do título. + +**Pre-merge checklist:** +- [x] O Pull Request refere-se a um único assunto, um título claro e uma descrição em frases gramaticalmente corretas e completas. +- [x] A branch está atualizada com a branch main. +- [x] Os commits atendem o padrão especificado na política de contribuição. +``` + +*** +## 1.7. Histórico de Versões +| Versão | Data | Descrição | **Autore(s)** | +|--------|:------:|:-----------:|:-------------------:| +| 1.0 | 04/02/2024 | Criação do documento | Natanael Fernandes | +| 1.1 | 08/07/2024 | Atualização de documento e diagrama | Paulo Gontijo | +| 1.2 | 01/09/2024 | Adição de teamplates | Paulo Gontijo | From 8ec7cca129e790660be963d723e8c0a5c7696aec Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 19:56:06 -0300 Subject: [PATCH 11/22] fix(#142): ajustando erros de escrita --- docs/guias/guia-contribuicao.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/docs/guias/guia-contribuicao.md b/docs/guias/guia-contribuicao.md index f3bee3a..0aa5a36 100644 --- a/docs/guias/guia-contribuicao.md +++ b/docs/guias/guia-contribuicao.md @@ -1,7 +1,3 @@ -Aqui estão os títulos e subtítulos do documento reescritos com numeração de sumário: - ---- - # 1. Git Flow Este documento tem o objetivo de consolidar padrões de uso do Git no desenvolvimento de nossa aplicação. @@ -193,10 +189,6 @@ Como professor, eu quero criar uma nova jornada educacional para organizar meus *** -Aqui está a seção de Pull Request reescrita com base no template fornecido: - ---- - ### 1.6.2. Pull Request Template #### 1.6.2.1. Título: From e8391b0d221dd076285c4a356dbbc9c551fb5eff Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 20:16:14 -0300 Subject: [PATCH 12/22] =?UTF-8?q?docs(#142):=20refatorando=20documento=20d?= =?UTF-8?q?e=20plano=20de=20comunica=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/planejamento/plano_comunicacao.md | 86 ++++++++++++++++++++++++++ mkdocs.yml | 16 +++-- 2 files changed, 93 insertions(+), 9 deletions(-) create mode 100644 docs/planejamento/plano_comunicacao.md diff --git a/docs/planejamento/plano_comunicacao.md b/docs/planejamento/plano_comunicacao.md new file mode 100644 index 0000000..55b2f8c --- /dev/null +++ b/docs/planejamento/plano_comunicacao.md @@ -0,0 +1,86 @@ +# Plano de Comunicação e Agenda de Equipe + +## 1. Objetivo + +O objetivo deste documento é estabelecer diretrizes claras para a comunicação e a organização das atividades da equipe, visando melhorar a eficiência, colaboração e coordenação dos trabalhos. Este plano abrange as metodologias adotadas, rituais semanais e as práticas de comunicação, garantindo que todos os membros da equipe estejam alinhados e comprometidos com os objetivos do projeto. + +## 2. Composição da Equipe + +- **Estudantes EPS:** 4 +- **Estudantes MDS:** 7 + +## 3. Metodologias Adotadas + +A equipe adota uma combinação de metodologias ágeis para garantir uma entrega eficiente e de alta qualidade, promovendo aprendizado contínuo entre os membros. + +- **Lean Inception:** Foco no alinhamento inicial e na definição do MVP para garantir que as funcionalidades desenvolvidas agreguem valor desde o início. +- **Extreme Programming (XP):** Enfatiza a qualidade do software através de práticas como TDD e refatoração contínua. +- **Pair Programming:** Promove a transferência de conhecimento, pareando desenvolvedores experientes com iniciantes. +- **Scrum:** Trabalho em ciclos de desenvolvimento curtos e iterativos, chamados sprints, com duração de 1 semana. + +## 4. Agenda de Rituais + +### 4.1. Segunda-Feira + +- **19:00 - 21:00:** Sprint Planning + - Revisão do backlog, estimativa de tempo e tarefas para a semana. + - Definição das histórias do usuário e critérios de aceite. +- **21:00 - 22:00:** Reunião com PO + - Apresentação dos entregáveis da semana (Sprint Review). + - Definição das histórias do usuário para a próxima sprint. + - Feedback do Product Owner e stakeholders. + +### 4.2. Terça-Feira a Sexta-Feira + +- **20:00 - 20:15:** Daily Stand-up + - Reunião breve para alinhar o progresso das tarefas, identificar obstáculos e planejar o dia. +- **20:15 - 22:00:** Pair Programming + - Formação de pares entre estudantes experientes e iniciantes. + - Desenvolvimento das atividades previstas na sprint. + +### 4.3. Domingo + +- **20:00 - 21:00:** Sprint Retrospective + - Reflexão sobre o que funcionou bem e o que pode ser melhorado. + - Discussão e planejamento de ações de melhoria contínua para a próxima sprint. + +### 4.4. Atividades Contínuas + +- **Kanban Board:** Atualização constante do quadro Kanban para visualizar o progresso das tarefas e ajustar prioridades. +- **Lean Inception:** Aplicação contínua de práticas de Lean Inception para garantir que o desenvolvimento esteja sempre alinhado com o valor entregue ao usuário final. + +## 5. Formas de Comunicação + +A comunicação eficaz é essencial para o sucesso do projeto. As ferramentas e plataformas utilizadas pela equipe foram escolhidas para facilitar a colaboração e garantir que todos os membros estejam informados e alinhados com os objetivos do projeto. + +| Imagem | Ferramenta | Descrição de Uso | +|--------|--------------------|----------------------------------------------------------------------------------| +| | WhatsApp | Comunicação rápida e assertiva para mensagens urgentes e decisões imediatas. | +| | Discord | Chamadas de voz e vídeo, programação em par, discussões técnicas detalhadas. | +| | GitHub (Issues e Pull Requests) | Gestão de projetos, colaboração em código, rastreamento de problemas e solicitações de alteração. | +| | ZenHub | Ferramenta Kanban integrada ao GitHub para gerenciar o fluxo de trabalho da equipe. | +| | Microsoft Teams | Reuniões, gravações, apresentações e colaboração em documentos e projetos. | +||Google Drive| Compartilhamento de arquivos da equipe| + +## 6. Quadro de Disponibilidade +Com o intuito de entender a disponibilidade de horários dos membros da equipe, foi criado um quadro de disponibilidade. Deste modo, é possível saber em quais horários há maior _quorum_ para reuniões, além de ser possível marcar os pareamentos tendo em vista a disponibilidade dos membros. + +Para garantir uma comunicação eficaz, é recomendado que todos os membros estejam disponíveis nas plataformas especificadas durante o horário de trabalho padrão. As reuniões no Microsoft Teams devem ser agendadas com antecedência sempre que possível, considerando a disponibilidade de todos os participantes. + + + + +## 7. Etiqueta de Comunicação + +- **Respeito Mútuo:** Todos os membros devem manter um tom profissional e respeitoso em todas as formas de comunicação. +- **Clareza:** Mensagens devem ser claras e concisas para evitar mal-entendidos. +- **Confidencialidade:** Informações sensíveis devem ser compartilhadas apenas com os membros autorizados da equipe. + +## 8. Histórico de Versão + +| Data | Versão | Descrição | Autor(es) | +|------------|--------|-----------------------------------------|--------------------------------------| +| 03/07/2024 | 1.0 | Criação do Documento | Natanael Fernandes | +| 28/07/2024 | 1.1 | Ajuste de Agenda e Rituais | Paulo Gontijo | +| 05/08/2024 | 1.2 | Unificação com Plano de Comunicação | Natanael Fernandes | +| 01/09/2024 | 1.3 | Atualização e junção dos documentos (Agenda e Plano de comunicação) | Paulo Gontijo | diff --git a/mkdocs.yml b/mkdocs.yml index 1c298fc..4ffb05c 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -50,17 +50,15 @@ nav: - Visão de Dados: 'organizacoes/visao-de-dados.md' - Visão de Endpoints: 'organizacoes/visao-de-endpoints.md' - Gestão do Projeto: - - Quadro de Disponibilidade: 'planejamento/quadro_de_disponibilidade.md' - - Quadro de Conhecimento e Pareamento: 'planejamento/conhecimento_pareamento.md' - - Agenda e Ritual da Equipe: 'planejamento/agenda_ritual.md' - - Planejamento de Comunicação: 'planejamento/comunicacao.md' + - Plano de Comunicação: 'planejamento/plano_comunicacao.md' + - Plano de Qualidade: 'planos/plano_qualidade.md' + - Plano de Custos: 'planos/planos_custos.md' - Analise de Riscos: 'planos/planos_riscos.md' - - Plano de qualidade: 'planos/plano_qualidade.md' - - Plano de custos: 'planos/planos_custos.md' + - Quadro de Conhecimento e Pareamento: 'planejamento/conhecimento_pareamento.md' - Guias: - - Guia de contribuição: 'guias/guia-contribuicao.md' - - Guia de estilo: 'guias/guia-estilo.md' - - Código de conduta: 'guias/codigo-conduta.md' + - Guia de Contribuição: 'guias/guia-contribuicao.md' + - Guia de Estilo: 'guias/guia-estilo.md' + - Código de Conduta: 'guias/codigo-conduta.md' - Dojos: - Dojo Markdown: 'dojo/dojo-markdown.md' - Dojo Git: 'dojo/dojo-git.md' From 90b209e853bb96e4cdaa2f34005375fa7d4fbdc2 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 20:23:02 -0300 Subject: [PATCH 13/22] =?UTF-8?q?docs(#142):=20adicionando=20campo=20em=20?= =?UTF-8?q?plano=20de=20comunica=C3=A7=C3=A3o?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/planejamento/plano_comunicacao.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/docs/planejamento/plano_comunicacao.md b/docs/planejamento/plano_comunicacao.md index 55b2f8c..6752448 100644 --- a/docs/planejamento/plano_comunicacao.md +++ b/docs/planejamento/plano_comunicacao.md @@ -7,7 +7,9 @@ O objetivo deste documento é estabelecer diretrizes claras para a comunicação ## 2. Composição da Equipe - **Estudantes EPS:** 4 + - Responsáveis pela liderança técnica e gestão do projeto. - **Estudantes MDS:** 7 + - Responsáveis por desenvolver a aplicação e testes para a mesma. ## 3. Metodologias Adotadas From 2217e0a147c345daa9ab244489ce32252522b2a0 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Sun, 1 Sep 2024 20:37:31 -0300 Subject: [PATCH 14/22] docs(#142): ajustando plano de qualidade --- docs/planos/plano_qualidade.md | 130 +++++++++++++++++++-------------- 1 file changed, 76 insertions(+), 54 deletions(-) diff --git a/docs/planos/plano_qualidade.md b/docs/planos/plano_qualidade.md index e4cda61..8129e2d 100644 --- a/docs/planos/plano_qualidade.md +++ b/docs/planos/plano_qualidade.md @@ -1,113 +1,135 @@ # Plano de Qualidade - ## 1. Introdução -Um dos fundamentos essenciais de um produto reside na qualidade que ele oferece. Nesse contexto, a ISO 9126 define a qualidade como a "totalidade de características e critérios de um produto ou serviço que emprega suas capacidades para satisfazer as necessidades declaradas ou implícitas". +A qualidade de um produto de software é um dos seus pilares essenciais, garantindo que ele atenda às necessidades dos usuários e ofereça valor real. Segundo a ISO 25010, que substituiu a ISO 9126 em 2011, a qualidade de um software é definida como o grau em que um sistema atende às necessidades expressas e não expressas dos stakeholders, resultando na criação de valor. -Por sua vez, a ISO 25010, lançada em 2011 como uma substituição da ISO 9126, estabelece padrões para a qualidade de produtos de software. Essa norma define qualidade como o grau em que um sistema atende às necessidades expressas e não expressas dos stakeholders, resultando na criação de valor. +A ISO 25010 identifica oito características fundamentais para a qualidade de um produto: adequação funcional, eficiência de desempenho, compatibilidade, usabilidade, confiabilidade, segurança, manutenibilidade e portabilidade. -A ISO 25010 identifica oito características fundamentais para a qualidade de um produto, que são: adequação funcional, eficiência de desempenho, compatibilidade, usabilidade, confiabilidade, segurança, manutenibilidade e portabilidade. +Este documento visa detalhar as ferramentas, métricas e procedimentos que serão utilizados para assegurar a qualidade do produto, com foco na testabilidade e na aderência ao modelo de qualidade Q-Rapids. ## 2. Objetivo -A elaboração deste plano tem como propósito detalhar as ferramentas a serem empregadas e as métricas a serem analisadas pela equipe, visando estabelecer os padrões de qualidade do produto e embasar as decisões a serem tomadas. Com isso, podemos citar os seguintes objetivos específicos deste documento: +Este plano tem como propósito estabelecer as diretrizes de qualidade do projeto, assegurando que todas as etapas do desenvolvimento sejam conduzidas de maneira a garantir um produto final de alta qualidade. Especificamente, os objetivos deste documento são: - Definir os objetivos de qualidade; -- Apresentar formas de atingir os objetivos de qualidade; +- Estabelecer métodos para alcançar os objetivos de qualidade; - Selecionar e coletar métricas de qualidade; - Apresentar a compreensão e a aplicação das métricas para o produto; -- Especificar os procedimentos, técnicas e ferramentas que serão utilizados para a garantia da qualidade do produto. +- Especificar os procedimentos, técnicas e ferramentas que serão utilizados para a garantia da qualidade do produto; +- Incluir práticas de testabilidade para assegurar que o código seja facilmente testável, promovendo a manutenção da qualidade ao longo do tempo. ## 3. Objetivos de Qualidade -No âmbito dos objetivos delineados pela norma ISO 25010:2011, a análise da qualidade do projeto é direcionada a três áreas fundamentais: qualidade interna, qualidade externa e qualidade de uso. - -A avaliação da qualidade interna e externa visa examinar o próprio produto e está centrada em seis características primordiais: funcionalidade, confiabilidade, usabilidade, eficiência, manutenibilidade e portabilidade. Cada uma dessas características engloba diversas subcaracterísticas, as quais se tornam observáveis externamente durante a utilização do software e são influenciadas pelos atributos internos do produto. +Com base na norma ISO 25010:2011, o plano de qualidade do projeto foca em três áreas principais: qualidade interna, qualidade externa e qualidade de uso. -A qualidade de uso, por outro lado, concentra-se em quatro características principais: eficácia, produtividade, segurança e satisfação. Essas características derivam da combinação das seis características de qualidade (interna e externa) previamente definidas pela norma ISO. +- **Qualidade Interna e Externa:** Estas são avaliadas através de características como funcionalidade, confiabilidade, usabilidade, eficiência, manutenibilidade e portabilidade. A qualidade interna se refere aos atributos que são observados durante o processo de desenvolvimento, enquanto a qualidade externa é avaliada quando o produto está em uso. + +- **Qualidade de Uso:** Concentra-se em quatro características principais: eficácia, produtividade, segurança e satisfação. Essas características avaliam a experiência do usuário final, garantindo que o software atenda às suas expectativas. -Durante a análise da qualidade do projeto, são abordados tanto os aspectos internos quanto os externos do software, considerando as seis características de qualidade. Além disso, é avaliada a experiência do usuário final por meio das quatro características específicas de qualidade de uso. Ao adotar essas abordagens complementares, busca-se realizar uma avaliação abrangente da qualidade do produto sob diferentes perspectivas. +Além dessas áreas, a **testabilidade** é considerada um fator crítico para garantir que o produto seja fácil de testar, o que, por sua vez, contribui para a manutenção da qualidade ao longo do ciclo de vida do software. ## 4. Verificação e Validação (V&V) -A verificação e validação são processos essenciais no desenvolvimento de produtos, sistemas ou softwares, desempenhando papéis cruciais na garantia de qualidade e na conformidade com requisitos específicos. +### 4.1. Verificação -### Verificação +A verificação é o processo sistemático de avaliação de um sistema ou componente para determinar se os resultados de uma fase de desenvolvimento atendem aos requisitos estabelecidos para essa fase. Esta abordagem visa garantir que o software esteja sendo construído corretamente, em conformidade com as especificações. -A verificação refere-se à avaliação sistemática de um sistema ou componente para determinar se os resultados esperados estão em conformidade com os requisitos predeterminados. Deste modo, é o processo de checar se o produto está sendo construído corretamente, garantindo que cada etapa do desenvolvimento atenda às especificações e normas estabelecidas. +### 4.2. Validação -### Validação +A validação assegura que o sistema atende às necessidades e expectativas dos usuários finais, garantindo que o produto certo está sendo construído. A validação será realizada de forma contínua ao longo do desenvolvimento, com validações regulares realizadas com os Product Owners. -A validação está relacionada à confirmação de que o sistema atende às necessidades e expectativas do usuário final. É o processo de assegurar que o produto seja útil e eficaz para o propósito a que se destina. Assim, a validação garante que o produto construído é o produto certo, atendendo aos requisitos e proporcionando valor real aos usuários. +### 4.3. Técnicas de V&V -Para alcançar os objetivos de qualidade propostos para o projeto, serão adotadas três técnicas de verificação e validação: +Para alcançar os objetivos de qualidade, serão adotadas as seguintes técnicas: -- **Análise estática do código:** Serão utilizadas as funcionalidades do Sonar Cloud como ferramenta de análise estática de código, visando a obtenção de métricas mensuráveis. Essa ferramenta será capaz de identificar possíveis problemas no código e oferecer informações pertinentes à gestão da qualidade do projeto, promovendo uma contribuição valiosa para a tomada de decisões e a identificação de áreas a serem abordadas pela equipe. +- **Análise Estática do Código:** Utilização do SonarCloud para analisar o código e coletar métricas relacionadas a code smells, duplicações, complexidade e cobertura de testes. A análise estática é fundamental para identificar problemas de qualidade no código que possam comprometer a manutenibilidade e a testabilidade do software. -- **Testes automatizados:** Serão empregados testes automatizados, abrangendo tanto os testes unitários quanto os de integração. Essa abordagem possibilita a validação não apenas dos cenários esperados, mas também das situações de erro, assegurando o correto funcionamento do software em diversas condições. +- **Testes Automatizados:** Implementação de testes unitários e de integração automatizados para garantir que cada componente funcione conforme o esperado e que a integração entre os componentes seja robusta. A cobertura de código será monitorada para assegurar que as áreas críticas do software estão devidamente testadas. -- **Validação com os POs:** Reuniões semanais serão realizadas para validar o progresso e obter feedback. Desta forma, é possível realizar a validação contínua da implementação. +- **Validação com POs:** Reuniões semanais serão realizadas com os Product Owners para validar o progresso e obter feedback. Este processo contínuo de validação ajuda a garantir que o desenvolvimento esteja alinhado com as expectativas dos stakeholders e com os objetivos de qualidade. ## 5. Padrões e Métricas As principais normas e modelos utilizados no projeto são: -- NBR - ISO/IEC 25010 -- Modelo de Qualidade Q-Rapids +- **NBR - ISO/IEC 25010:** Padrão internacional para a qualidade de produtos de software. +- **Modelo de Qualidade Q-Rapids:** Um modelo baseado em métricas de qualidade que permite a avaliação contínua e orientada por dados do software. + +### 5.1. Métricas + +As métricas definidas para monitorar a qualidade do projeto, conforme o modelo Q-Rapids e alinhadas com a testabilidade e qualidade de produto, incluem: + +| Métrica | Descrição | +|-----------------|-------------------------------------------------------------------------------------------------| +| **Reliability** | Quantidade de bugs presentes no código fonte. | +| **Security Rating** | Avaliação de segurança de falhas e vulnerabilidades, conforme as diretrizes de segurança do projeto.| +| **Maintainability** | Quantidade de code smells identificados no código, que podem impactar a manutenibilidade e testabilidade.| +| **Coverage** | Porcentagem de linhas de código cobertas por testes automatizados, com um valor de referência mínimo de 80%.| +| **Duplications** | Densidade de código duplicado em porcentagem, que deve ser mantida abaixo de 5% para facilitar a manutenção.| +| **Size** | Quantidade de linhas de declarações, funções, classes, arquivos e comentários, usada para avaliar a complexidade geral.| +| **Complexity** | Medição da complexidade ciclomática e cognitiva, com foco em manter a complexidade baixa para melhorar a testabilidade.| +| **Issues** | Quantidade de issues abertas, fechadas, reabertas, falsa positiva e "won't fix", usada para monitorar a saúde do projeto.| + +### 5.2. Valores de Referência -### Métricas +Para cada métrica, foram definidos valores de referência que servirão como indicadores de qualidade e auxiliarão na tomada de decisões: -As métricas definidas para o monitoramento de qualidade foram: +- **Coverage:** 80% de cobertura mínima das linhas de código. +- **Duplications:** Menos de 5% de duplicação de código. +- **Complexity:** Manter a complexidade ciclomática abaixo de 10 por método/função. -| Métrica | Descrição | -|-----------------|-----------------------------------------------------| -| Reliability | Quantidade de bugs presentes no código fonte | -| Security Rating | Avaliação de segurança de falhas e vulnerabilidades | -| Maintainability | Quantidade de code smells | -| Coverage | Porcentagem de linhas de código cobertas por testes | -| Duplications | Densidade em porcentagem de código duplicado | -| Size | Quantidade de linhas de declarações, funções, classes, arquivos e comentários | -| Complexity | Quantidade de complexidade ciclomática e cognitiva | -| Issues | Quantidade de issues abertas, fechadas, reabertas, falsa positiva e "won't fix" | +Esses valores de referência são críticos para garantir que o software permaneça testável e de alta qualidade ao longo de seu ciclo de vida. ## 6. Testes -O software é um produto da criatividade humana que envolve alta complexidade e, por isso, pode apresentar falhas e inconsistências. Para garantir que o software funcione conforme o esperado, existem os testes, que são processos que verificam a qualidade do software e evitam que os erros afetem o usuário final. +Os testes desempenham um papel crucial na garantia da qualidade do software. Eles verificam se o software funciona conforme o esperado e ajudam a evitar que erros afetem o usuário final. -Os testes podem ser classificados em diferentes tipos, de acordo com o nível de abstração do software: +### 6.1. Tipos de Testes -- **Testes de unidade:** São testes que verificam uma parte isolada do código, geralmente uma classe ou um método. -- **Testes de integração:** São testes que verificam o funcionamento de uma funcionalidade ou uma transação completa, envolvendo a interação entre diferentes componentes do software. -- **Testes de sistema:** São testes que simulam o uso real do software por um usuário, verificando se o software atende aos requisitos e expectativas. +- **Testes de Unidade:** Verificam a funcionalidade de componentes isolados do sistema, como métodos ou classes, garantindo que cada parte funcione de forma independente. +- **Testes de Integração:** Avaliam a interação entre diferentes componentes do sistema, assegurando que eles funcionem bem em conjunto. +- **Testes de Sistema:** Simulam o uso real do software para verificar se ele atende aos requisitos e expectativas do usuário final. + +### 6.2. Implementação de Testes + +Os testes serão implementados de forma a maximizar a cobertura de código e garantir que todas as funcionalidades críticas sejam validadas. O foco na **testabilidade** garante que o código seja estruturado de maneira a facilitar a criação e execução de testes, permitindo detecção precoce de defeitos. ## 7. Ferramentas -- **Jest:** Framework de testes para JavaScript. -- **ESLint:** Ferramenta para identificar e reportar padrões encontrados no código ECMAScript/JavaScript, com o objetivo de tornar o código mais consistente e evitar bugs. -- **SonarCloud:** Ferramenta de análise de código que verifica a qualidade do código conforme as métricas e regras estabelecidas. +As ferramentas a serem utilizadas para suportar as práticas de qualidade incluem: + +- **Jest:** Framework de testes para JavaScript, utilizado principalmente para testes de unidade. +- **ESLint:** Ferramenta para identificar e reportar padrões inconsistentes no código ECMAScript/JavaScript, contribuindo para a qualidade e manutenibilidade do código. +- **SonarCloud:** Plataforma de análise de código que verifica a qualidade do código conforme as métricas e regras estabelecidas, incluindo cobertura de testes, duplicação, complexidade, entre outros. ## 8. Controle de Código -Para garantir a qualidade dos procedimentos, utilizamos uma combinação de tarefas automáticas e manuais. As tarefas automáticas envolvem documentação, controle de versão, código, commits e testes, que são realizados por ferramentas e sistemas que contribuem para a qualidade do software. Essas tarefas serão realizadas com o auxílio de ferramentas e sistemas, garantindo a qualidade do software. +Para garantir a qualidade dos procedimentos, o controle de código será realizado por meio de tarefas automáticas e manuais, envolvendo: ---- +- **Documentação e Controle de Versão:** Uso de sistemas de controle de versão para gerenciar o histórico de mudanças no código, facilitando o rastreamento de alterações e a colaboração entre membros da equipe. +- **Commits e Pull Requests:** Revisões de código serão realizadas por meio de pull requests, garantindo que todas as mudanças passem por uma análise rigorosa antes de serem integradas ao código base. +- **Testes Automatizados:** Execução de testes automatizados para cada commit, assegurando que novas alterações não introduzam regressões. -Esse plano de qualidade fornece uma visão abrangente das metas, métodos e ferramentas necessários para assegurar a qualidade do produto de software. A adesão a essas diretrizes garantirá que o software atenda aos padrões exigidos e satisfaça as necessidades dos usuários finais. ## 9. Referências +> Quality-aware Rapid Software Development Project: The Q-Rapids Project. FRANCH X.; LOPEZ L.; FERNÁNDEZ S. M.; ORIOL M.; RODRÍGUEZ P.; TRENDOWICZ A. + +> ISO/IEC 25010. ISO 25000. Software and data quality. 2011. Disponível em: https://iso25000.com/index.php -> Quality-aware Rapid Software Development Project: The Q-Rapids Project. FRANCH X.; LOPEZ L.; FERNÁNDEZ S. M.; ORIOL M.; RODRÍGUEZ P.; TRENDOWICZ A. +> Quality-aware Rapid Software Development Project: The Q-Rapids Project. FRANCH X.; LOPEZ L.; FERNÁNDEZ S. M.; ORIOL M.; RODRÍGUEZ P.; TRENDOWICZ A. -> ISO/IEC 25010. ISO 25000. Software and data quality. 2011. Disponível em: https://iso25000.com/index.php/en/iso-25000-standards/iso-25010. +> ISO/IEC 25010. ISO 25000. Software and data quality. 2011. Disponível em: https://iso25000.com/index.php/en/iso-25000-standards/iso-25010. -> Metric Definitions. SonarQube. Disponível em: https://docs.sonarqube.org/latest/user-guide/metric-definitions/ +> Metric Definitions. SonarQube. Disponível em: https://docs.sonarqube.org/latest/user-guide/metric-definitions/ -> A Quality Model for Actionable Analytics in Rapid Software Development. FERNÁNDEZ S. M.; JEDLITSCHKA A.; GUZMÁN L.; VOLLMER A. M. Kaiserslautern, Alemanha. +> A Quality Model for Actionable Analytics in Rapid Software Development. FERNÁNDEZ S. M.; JEDLITSCHKA A.; GUZMÁN L.; VOLLMER A. M. Kaiserslautern, Alemanha. +--- -## 4. Histórico de versão +## 10. Histórico de Versão -|**Data**|**Descrição**|**Autor(es)**| -|--------|-------------|--------------| -|03/07/2024| Criação do Documento | Davi Matheus | +| **Data** | **Versão** | **Descrição** | **Autor(es)** | +|------------|------------|-------------------------------------------------------------------------|-------------------| +| 03/07/2024 | 1.0 | Criação do documento | Davi Matheus | +| 01/09/2024 | 1.1 | Revisão e aperfeiçoamento com foco em testabilidade e qualidade | Paulo Gontijo | From ae02c97a38ef2aa72fdd67e3c1671b1d23f75858 Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Thu, 5 Sep 2024 19:39:12 -0300 Subject: [PATCH 15/22] docs(#142): ajustando doc de visao de dados --- docs/organizacoes/visao-de-dados.md | 164 ++++++++++++++++------------ 1 file changed, 97 insertions(+), 67 deletions(-) diff --git a/docs/organizacoes/visao-de-dados.md b/docs/organizacoes/visao-de-dados.md index 835d6a3..709418b 100644 --- a/docs/organizacoes/visao-de-dados.md +++ b/docs/organizacoes/visao-de-dados.md @@ -19,6 +19,8 @@ O modelo conceitual do *Calculus* reflete a estrutura de dados fundamental que c - **Conteúdo**: O nível mais granular, criado e gerido por professores, e consumido por alunos. Cada conteúdo pertence a uma trilha. +- **Pontos de Partida**: Um startpoint (ou "ponto de partida") pode ser definido como um marco inicial no aprendizado. Sua estrutura é tal que contém jornadas que contemplam o mesmo campo de estudo. +
```mermaid @@ -47,6 +49,11 @@ erDiagram string trilhaId string professorId } + PontosDePartida { + string id + string name + string description + } Usuario ||--o{ Jornada : "inscreve-se" Jornada ||--o{ Trilha : "composta por" @@ -54,6 +61,7 @@ erDiagram Usuario ||--o{ Conteudo : "cria/edita/visualiza" Usuario ||--o{ Jornada : "cria/edita/visualiza" Usuario ||--o{ Trilha : "cria/edita/visualiza" + PontosDePartida || --o{ Jornada : "contém" ``` **Autor:** Calculus Team
@@ -64,7 +72,7 @@ erDiagram - **Jornada** é composta por várias **Trilhas**, que por sua vez contêm **Conteúdos**. - **Usuários** desempenham diferentes funções (**Aluno**, **Professor**, **Administrador**), e suas interações com a plataforma são mediadas por suas permissões: - - **Alunos** podem se inscrever em **Jornadas** e acessar os conteúdos dentro delas. + - **Alunos** podem se inscrever em **Jornadas** e acessar todas as **Trilhas** dentro delas. - **Professores** criam e gerenciam **Conteúdos** dentro das **Trilhas** e **Jornadas** às quais estão associados. ### 2.2. Modelo Lógico @@ -103,6 +111,11 @@ classDiagram +String trilhaId FK +String professorId FK } + class PontosDePartida { + +String id PK + +String name + +String description + } Usuario "1" --> "0..*" Jornada : se inscreve @@ -111,6 +124,7 @@ classDiagram Usuario "1" --> "0..*" Conteudo : cria/edita/visualiza Usuario "1" --> "0..*" Trilha : cria/edita/visualiza Usuario "1" --> "0..*" Jornada : cria/edita/visualiza + PontosDePartida "1" --> "0..*" Jornada : "contém" ``` **Autor:** Calculus Team @@ -123,56 +137,91 @@ classDiagram ### 2.3. Modelo Físico -O modelo físico traduz a lógica dos dados para a implementação real no banco de dados, definindo tabelas, colunas, tipos de dados, e relacionamentos. +O modelo físico traduz a lógica dos dados para a implementação real no banco de dados. Aplicado ao projeto do _Calculus_, a realidade é de uma modelagem não relacional, portanto trabalha-se com [Databases -> Collections -> Documents]. No diagrama abaixo pode-se visualizar a organização das nossas collections com o schema de um documento genérico:
```mermaid classDiagram - class tb_users { + class users { +String id PK - +String nome + +String name +String email UNIQUE - +String senha + +String username UNIQUE + +String password + +String verificationToken + +Boolean isVerified +String role + +ObjectId[] points FK + +ObjectId[] subscribedJourneys FK + +ObjectId[] completedTrails FK + +Date createdAt + +Date updatedAt } - class tb_journeys { + + class journeys { +String id PK - +String titulo - +String descricao + +String title + +String description + +ObjectId point FK + +ObjectId[] trails FK + +Number order + +Date createdAt + +Date updatedAt } - class tb_trails { + class trails { +String id PK - +String titulo - +String descricao - +String jornada_id FK + +String name + +ObjectId journey FK + +ObjectId[] contents FK + +Number order + +Date createdAt + +Date updatedAt } - class tb_contents { + class contents { +String id PK - +String titulo - +String descricao - +String trilha_id FK - +String professor_id FK + +String title + +String content + +ObjectId trail FK + +Number order + +Date createdAt + +Date updatedAt } + class startpoints { + +String id PK + +String name + +String description + +ObjectId user FK + +ObjectId[] journeys FK + +Number order + +Date createdAt + +Date updatedAt + } + + + users "1" --> "0..*" journeys : se inscreve + journeys "1" --> "0..*" trails : contém + trails "1" --> "0..*" contents : agrupa + users "1" --> "0..*" contents : cria/edita + users "1" --> "0..*" journeys : cria/edita + users "1" --> "0..*" trails : cria/edita + startpoints "1" --> "0..*" journeys: contém - tb_users "1" --> "0..*" tb_journeys : se inscreve - tb_journeys "1" --> "0..*" tb_trails : contém - tb_trails "1" --> "0..*" tb_contents : agrupa - tb_users "1" --> "0..*" tb_contents : cria/edita - tb_users "1" --> "0..*" tb_journeys : cria/edita - tb_users "1" --> "0..*" tb_trails : cria/edita ``` + +> *OBS.: É importante ressaltar que cada Database refere-se a um ambiente (DEV, QAS e PRD). + **Autor:** Calculus Team
#### Descrição -- **tb_users**: Armazena informações de login e funções dos usuários na plataforma. -- **tb_journeys**, **tb_trails**, **tb_contents**: Tabelas que estruturam a hierarquia de conteúdos educacionais. +- **users**: Armazena informações de login e funções dos usuários na plataforma. +- **journeys**, **trails**, **contents**: Tabelas que estruturam a hierarquia de conteúdos educacionais. *** @@ -215,14 +264,15 @@ flowchart TD - **UserService** interage com as collections **users**, **refreshtokens**, e **resettokens**: - - **users**: Armazena informações de usuários, como credenciais e perfis. - - **refreshtokens**: Gera e armazena tokens usados para manter a sessão do usuário. - - **resettokens**: Armazena tokens temporários para redefinição de senhas. + - **users**: Armazena informações de usuários, como credenciais e perfis. + - **refreshtokens**: Gera e armazena tokens usados para manter a sessão do usuário. + - **resettokens**: Armazena tokens temporários para redefinição de senhas. + - **StudioMakerService** interage com as collections **contents**, **journeys**, **trails**, e **startpoints**: - - **contents**: Armazena os materiais educacionais criados pelos professores. - - **journeys**: Armazena informações sobre jornadas, que agrupam trilhas educacionais. - - **trails**: Armazena trilhas, que são compostas por conteúdos. - - **startpoints**: Registra pontos de partida ou progresso em trilhas e jornadas. + - **contents**: Armazena os materiais educacionais criados pelos professores. + - **journeys**: Armazena informações sobre jornadas, que agrupam trilhas educacionais. + - **trails**: Armazena trilhas, que são compostas por conteúdos. + - **startpoints**: Registra pontos de partida ou progresso em trilhas e jornadas. ### 3.2. Fontes de Dados @@ -238,16 +288,16 @@ Cada serviço possui suas próprias collections no MongoDB, organizando os dados O armazenamento dos dados no *Calculus* é realizado por meio de collections específicas em instâncias de MongoDB Atlas. Cada serviço possui suas próprias collections dedicadas para manter os dados organizados e seguros. #### Estrutura de Armazenamento: -- **UserDB (MongoDB Atlas)**: Armazena dados relacionados a usuários e autenticação. - - **users**: Dados do usuário, como credenciais e roles. - - **refreshtokens**: Tokens de sessão do usuário. - - **resettokens**: Tokens para redefinição de senhas. +- **UserService**: Armazena dados relacionados a usuários e autenticação. + - **users**: Dados do usuário, como credenciais e roles. + - **refreshtokens**: Tokens de sessão do usuário. + - **resettokens**: Tokens para redefinição de senhas. -- **ContentDB (MongoDB Atlas)**: Armazena dados relacionados a conteúdos educacionais. - - **contents**: Materiais educacionais criados pelos professores. - - **journeys**: Estrutura de jornadas que agrupam trilhas. - - **trails**: Conjunto de trilhas associadas às jornadas. - - **startpoints**: Marca o progresso ou o início em trilhas e jornadas. +- **StudioMakerService**: Armazena dados relacionados a conteúdos educacionais. + - **contents**: Materiais educacionais criados pelos professores. + - **journeys**: Estrutura de jornadas que agrupam trilhas. + - **trails**: Conjunto de trilhas associadas às jornadas. + - **startpoints**: Marca o progresso ou o início em trilhas e jornadas. Abaixo segue um diagrama que resume o conceito apresentado visualmente: @@ -260,8 +310,7 @@ flowchart TD E[(refreshtokens)] --> B F[(resettokens)] --> B - G[(contents)] --> C[StudioMakerService] - H[(journeys)] --> C + H[(journeys)] --> C[StudioMakerService] I[(trails)] --> C J[(startpoints)] --> C end @@ -270,7 +319,6 @@ flowchart TD B -.->|Leitura e Escrita| E B -.->|Leitura e Escrita| F - C -.->|Leitura e Escrita| G C -.->|Leitura e Escrita| H C -.->|Leitura e Escrita| I C -.->|Leitura e Escrita| J @@ -280,7 +328,6 @@ flowchart TD - Cada serviço (UserService, StudioMakerService) está conectado às suas respectivas collections no MongoDB Atlas. -- **UserDB** e **ContentDB**: Cada um possui suas collections específicas, garantindo organização, segurança e eficiência no gerenciamento dos dados. Considerações de Armazenamento: @@ -298,7 +345,7 @@ A governança de dados no *Calculus* é fundamental para garantir que todas as i As políticas de segurança do *Calculus* são desenhadas para proteger os dados contra acessos não autorizados, garantir a integridade das informações e assegurar a disponibilidade dos dados para os usuários legítimos. - **Autenticação e Autorização**: Todos os acessos à aplicação são controlados por um sistema robusto de autenticação e autorização. Os usuários devem se autenticar via credenciais seguras, e os tokens de sessão são gerenciados através das collections **refreshtokens** e **resettokens** no MongoDB. -- **Criptografia**: Dados sensíveis, como senhas de usuário e tokens de autenticação, são criptografados tanto em trânsito quanto em repouso. A comunicação entre o frontend e o backend é realizada via HTTPS para garantir a proteção dos dados em trânsito. +- **Criptografia**: Dados sensíveis, como senhas de usuário e tokens de autenticação, são criptografados em repouso (armazenamento). - **Backup e Recuperação**: Rotinas de backup são implementadas para garantir que os dados possam ser recuperados em caso de falha. O MongoDB Atlas oferece recursos avançados de backup e recuperação de desastres.
@@ -331,32 +378,15 @@ flowchart TD **Autor:** Calculus Team
-### 4.3. Conformidade e Regulamentação - -O *Calculus* está comprometido em cumprir todas as leis e regulamentações aplicáveis relacionadas à proteção de dados e privacidade. As práticas descritas abaixo garantem que a aplicação esteja em conformidade com normas como a GDPR (General Data Protection Regulation) e a LGPD (Lei Geral de Proteção de Dados). - -- **Anonimização e Pseudonimização**: Dados pessoais dos usuários, quando não necessários para a operação direta do sistema, são anonimizados ou pseudonimizados para proteger a privacidade dos usuários. -- **Gestão de Consentimento**: Os usuários são informados sobre como seus dados serão usados e devem fornecer consentimento explícito para o processamento de suas informações. As preferências de consentimento são gerenciadas e registradas no sistema. -- **Direitos dos Usuários**: Os usuários têm o direito de acessar, corrigir, ou excluir seus dados pessoais conforme as leis aplicáveis. O sistema implementa mecanismos para que esses direitos possam ser exercidos de maneira simples e eficaz. - -
-```mermaid -flowchart TD - A[Coleta de Dados] --> B[Anonimizacao] - B --> C[Armazenamento de Dados] - C --> D[Revisao de Conformidade] -``` -**Autor:** Calculus Team -
- -## 6. Revisão Bibliográfica +## 5. Revisão Bibliográfica > Inmon, W. H., Strauss, D., & Neushloss, G. (2010). *DW 2.0: The Architecture for the Next Generation of Data Warehousing*. Morgan Kaufmann. > ISO/IEC 27001 (2013). *Information technology — Security techniques — Information security management systems — Requirements*. -## 7. Histórico de Versão +## 6. Histórico de Versão | Data | Versão | Descrição | Autor(es) | |------------|--------|-----------------------------------------|--------------------------------------| -| 01/09/2024 | 1.0 | Criação do documento | Paulo Gontijo | \ No newline at end of file +| 01/09/2024 | 1.0 | Criação do documento | Paulo Gontijo | +| 05/09/2024 | 1.1 | Ajustes de texto e diagramas | Paulo Gontijo, João Bisinotti | \ No newline at end of file From 2183ee23a58035bbf87049d7b1410837f0094acc Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Thu, 5 Sep 2024 19:40:29 -0300 Subject: [PATCH 16/22] docs(#142): ajustando doc de visao de endpoints --- docs/organizacoes/visao-de-endpoints.md | 110 +++++++++++++----------- 1 file changed, 62 insertions(+), 48 deletions(-) diff --git a/docs/organizacoes/visao-de-endpoints.md b/docs/organizacoes/visao-de-endpoints.md index 8a4e4a0..39e2579 100644 --- a/docs/organizacoes/visao-de-endpoints.md +++ b/docs/organizacoes/visao-de-endpoints.md @@ -11,13 +11,30 @@ O **UserService** é responsável pela gestão e autenticação dos usuários na ### 2.1. Endpoints -| Método | Rota | Descrição | -|--------|-----------------------|-----------------------------------------------------| -| POST | `/api/v1/users/register` | Registro de novos usuários na plataforma | -| POST | `/api/v1/users/login` | Autenticação de usuários | -| POST | `/api/v1/users/token` | Geração de novos tokens de acesso | -| POST | `/api/v1/users/reset` | Solicitação de redefinição de senha | -| GET | `/api/v1/users/me` | Recupera as informações do usuário autenticado | +| Método | Rota | Descrição | +|--------|------------------------------------------|----------------------------------------------------------------| +| POST | `/api/v1/users` | Criação de um novo usuário | +| GET | `/api/v1/users/verify` | Verificação de conta de usuário por token | +| GET | `/api/v1/users/:userId/subscribedJourneys` | Recupera as jornadas inscritas do usuário | +| GET | `/api/v1/users` | Lista todos os usuários | +| PATCH | `/api/v1/users/:id/add-point` | Adiciona um ponto ao usuário | +| POST | `/api/v1/users/:userId/subscribe/:journeyId` | Inscreve o usuário em uma jornada | +| DELETE | `/api/v1/users/:userId/unsubscribe/:journeyId` | Remove o usuário de uma jornada | +| POST | `/api/v1/users/:userId/complete/:trailId` | Marca uma trilha como completa para o usuário | +| GET | `/api/v1/users/:userId/completedTrails` | Recupera as trilhas completadas do usuário | +| GET | `/api/v1/users/:id` | Recupera informações de um usuário específico | +| DELETE | `/api/v1/users/:id` | Deleta um usuário específico | +| PATCH | `/api/v1/users/:id/role` | Atualiza o papel de um usuário (requer permissão de administrador) | +| POST | `/api/v1/auth/login` | Autenticação de usuário (login) | +| GET | `/api/v1/auth/google` | Inicia autenticação com Google | +| GET | `/api/v1/auth/google/callback` | Callback da autenticação com Google | +| GET | `/api/v1/auth/microsoft` | Inicia autenticação com Microsoft | +| GET | `/api/v1/auth/microsoft/callback` | Callback da autenticação com Microsoft | +| GET | `/api/v1/auth/validate-token` | Valida um token de acesso | +| POST | `/api/v1/auth/refresh` | Geração de um novo token de acesso através de um refresh token | +| PUT | `/api/v1/auth/change-password` | Troca a senha do usuário autenticado | +| POST | `/api/v1/auth/forgot-password` | Solicita redefinição de senha | +| PUT | `/api/v1/auth/reset-password` | Reseta a senha do usuário | ### 2.2. Configuração de Porta @@ -35,27 +52,41 @@ O **StudioMakerService** é responsável pela criação, edição e gestão dos ### 3.1. Endpoints -| Método | Rota | Descrição | -|--------|------------------------------------|----------------------------------------------------------------| -| POST | `/api/v1/contents` | Criação de novos conteúdos | -| GET | `/api/v1/contents/:id` | Recupera um conteúdo específico pelo ID | -| PUT | `/api/v1/contents/:id` | Atualiza um conteúdo existente | -| DELETE | `/api/v1/contents/:id` | Remove um conteúdo existente | -| GET | `/api/v1/journeys` | Recupera todas as jornadas | -| POST | `/api/v1/journeys` | Criação de novas jornadas | -| GET | `/api/v1/journeys/:id` | Recupera uma jornada específica pelo ID | -| PUT | `/api/v1/journeys/:id` | Atualiza uma jornada existente | -| DELETE | `/api/v1/journeys/:id` | Remove uma jornada existente | -| GET | `/api/v1/trails` | Recupera todas as trilhas | -| POST | `/api/v1/trails` | Criação de novas trilhas | -| GET | `/api/v1/trails/:id` | Recupera uma trilha específica pelo ID | -| PUT | `/api/v1/trails/:id` | Atualiza uma trilha existente | -| DELETE | `/api/v1/trails/:id` | Remove uma trilha existente | -| GET | `/api/v1/startpoints` | Recupera todos os pontos de partida | -| POST | `/api/v1/startpoints` | Criação de novos pontos de partida | -| GET | `/api/v1/startpoints/:id` | Recupera um ponto de partida específico pelo ID | -| PUT | `/api/v1/startpoints/:id` | Atualiza um ponto de partida existente | -| DELETE | `/api/v1/startpoints/:id` | Remove um ponto de partida existente | +| Método | Rota | Descrição | +|--------|------------------------------------------|------------------------------------------------------------------| +| POST | `/api/v1/contents` | Criação de um novo conteúdo | +| GET | `/api/v1/contents/:id` | Recupera um conteúdo pelo ID | +| GET | `/api/v1/contents` | Lista todos os conteúdos | +| GET | `/api/v1/contents/trail/:id` | Recupera todos os conteúdos de uma trilha | +| PATCH | `/api/v1/contents/:id` | Atualiza um conteúdo pelo ID | +| DELETE | `/api/v1/contents/:id` | Exclui um conteúdo pelo ID | +| PATCH | `/api/v1/contents/order/update-order` | Atualiza a ordem dos conteúdos | +| POST | `/api/v1/trails` | Criação de uma nova trilha | +| GET | `/api/v1/trails/:id` | Recupera uma trilha pelo ID | +| GET | `/api/v1/trails` | Lista todas as trilhas | +| GET | `/api/v1/trails/journey/:id` | Recupera todas as trilhas de uma jornada | +| PUT | `/api/v1/trails/:id` | Atualiza uma trilha pelo ID | +| PUT | `/api/v1/trails/:id/addContent` | Adiciona um conteúdo a uma trilha | +| PUT | `/api/v1/trails/:id/removeContent` | Remove um conteúdo de uma trilha | +| DELETE | `/api/v1/trails/:id` | Exclui uma trilha pelo ID | +| PATCH | `/api/v1/trails/update-trail-order` | Atualiza a ordem das trilhas | +| POST | `/api/v1/journeys` | Criação de uma nova jornada | +| GET | `/api/v1/journeys` | Lista todas as jornadas | +| GET | `/api/v1/journeys/point/:id` | Recupera as jornadas associadas a um ponto | +| GET | `/api/v1/journeys/:id` | Recupera uma jornada pelo ID | +| PUT | `/api/v1/journeys/:id` | Atualiza uma jornada pelo ID | +| DELETE | `/api/v1/journeys/:id` | Exclui uma jornada pelo ID | +| PATCH | `/api/v1/journeys/:id/add-trail` | Adiciona uma trilha a uma jornada | +| PATCH | `/api/v1/journeys/update-journeys-order` | Atualiza a ordem das jornadas | +| POST | `/api/v1/points` | Criação de um novo ponto | +| GET | `/api/v1/points` | Lista todos os pontos | +| GET | `/api/v1/points/user/:id` | Recupera os pontos associados a um usuário | +| GET | `/api/v1/points/:id` | Recupera um ponto pelo ID | +| PUT | `/api/v1/points/:id` | Atualiza um ponto pelo ID | +| DELETE | `/api/v1/points/:id` | Exclui um ponto pelo ID | +| PATCH | `/api/v1/points/:id/add-journey` | Adiciona uma jornada a um ponto | +| GET | `/api/v1/points/:pointId/journeys` | Recupera as jornadas associadas a um ponto | +| PATCH | `/api/v1/points/update-point-order` | Atualiza a ordem dos pontos | ### 3.2. Configuração de Porta @@ -70,25 +101,7 @@ Port: 3002 O **Frontend** da aplicação *Calculus* é responsável por fornecer a interface com a qual os usuários interagem. Ele se comunica com os serviços backend (**UserService** e **StudioMakerService**) para fornecer funcionalidades como autenticação, visualização e gestão de conteúdos educacionais. Esta seção descreve as rotas principais do frontend e a configuração da porta onde ele é servido. -### 4.1. Rotas - -O **Frontend** utiliza várias rotas para organizar as diferentes páginas e funcionalidades acessíveis aos usuários: - -| Rota | Descrição | -|-------------------------|---------------------------------------------------------------------------| -| `/` | Página inicial da aplicação | -| `/login` | Página de login para autenticação de usuários | -| `/register` | Página de registro para novos usuários | -| `/dashboard` | Dashboard do usuário autenticado | -| `/contents` | Página para visualização e gestão dos conteúdos | -| `/journeys` | Página para visualização e gestão de jornadas | -| `/trails` | Página para visualização e gestão de trilhas | -| `/contents/:id` | Página para visualização detalhada de um conteúdo específico | -| `/journeys/:id` | Página para visualização detalhada de uma jornada específica | -| `/trails/:id` | Página para visualização detalhada de uma trilha específica | -| `/profile` | Página de perfil do usuário, para visualização e edição das informações pessoais | - -### 4.2. Configuração de Porta +### 4.1. Configuração de Porta O **Frontend** da aplicação é servido na porta **4000**. Os usuários acessam a interface do *Calculus* através desta porta. @@ -97,7 +110,7 @@ Host: calculus-dev.eastus2.cloudapp.azure.com Port: 4000 ``` -### 4.3. Comunicação com Backend +### 4.2. Comunicação com Backend O **Frontend** se comunica com os serviços backend (**UserService** e **StudioMakerService**) através de chamadas HTTP/HTTPS. Todas as interações, como autenticação e gerenciamento de conteúdos, são realizadas via APIs RESTful fornecidas pelos serviços backend. @@ -121,3 +134,4 @@ Todos os endpoints expostos pelos serviços do *Calculus* são protegidos por me | Data | Versão | Descrição | Autor(es) | |------------|--------|-----------------------------------------|---------------------------------------| | 01/09/2024 | 1.0 | Criação do documento | Paulo Gontijo | +| 05/09/2024 | 1.1 | Adicionando mais endpoints | Paulo Gontijo | From db82d17c20f0eb1dab74f45bf6ef04226b786e2f Mon Sep 17 00:00:00 2001 From: paulohgontijoo Date: Thu, 5 Sep 2024 19:41:27 -0300 Subject: [PATCH 17/22] docs(#142): ajustando doc de plano de qualidade --- docs/planos/plano_qualidade.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/docs/planos/plano_qualidade.md b/docs/planos/plano_qualidade.md index 8129e2d..779388d 100644 --- a/docs/planos/plano_qualidade.md +++ b/docs/planos/plano_qualidade.md @@ -74,8 +74,8 @@ As métricas definidas para monitorar a qualidade do projeto, conforme o modelo Para cada métrica, foram definidos valores de referência que servirão como indicadores de qualidade e auxiliarão na tomada de decisões: -- **Coverage:** 80% de cobertura mínima das linhas de código. -- **Duplications:** Menos de 5% de duplicação de código. +- **Coverage:** 90% de cobertura mínima das linhas de código. +- **Duplications:** Menos de 0% de duplicação de código. - **Complexity:** Manter a complexidade ciclomática abaixo de 10 por método/função. Esses valores de referência são críticos para garantir que o software permaneça testável e de alta qualidade ao longo de seu ciclo de vida. @@ -133,3 +133,4 @@ Para garantir a qualidade dos procedimentos, o controle de código será realiza |------------|------------|-------------------------------------------------------------------------|-------------------| | 03/07/2024 | 1.0 | Criação do documento | Davi Matheus | | 01/09/2024 | 1.1 | Revisão e aperfeiçoamento com foco em testabilidade e qualidade | Paulo Gontijo | +| 05/09/2024 | 1.2 | Ajuste das métricas | Paulo Gontijo | From 9c61301cc775c05b33d1e94a5dbbe6e8b5dbec9f Mon Sep 17 00:00:00 2001 From: DaviMatheus Date: Sun, 8 Sep 2024 21:02:52 -0300 Subject: [PATCH 18/22] =?UTF-8?q?doc(#142):=20cria=C3=A7=C3=A3o=5Fmanual?= =?UTF-8?q?=5Finstru=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../manual_de_instru\303\247\303\265es.md" | 140 ++++++++++++++++++ 1 file changed, 140 insertions(+) create mode 100644 "docs/organizacoes/manual_de_instru\303\247\303\265es.md" diff --git "a/docs/organizacoes/manual_de_instru\303\247\303\265es.md" "b/docs/organizacoes/manual_de_instru\303\247\303\265es.md" new file mode 100644 index 0000000..b3646d2 --- /dev/null +++ "b/docs/organizacoes/manual_de_instru\303\247\303\265es.md" @@ -0,0 +1,140 @@ +# Manual de Instalação do Projeto + +## Visão Geral + +Calculus é uma plataforma de aprendizado, 100% feita por estudantes da UnB, projetada para tornar o estudo de várias disciplinas escolares uma experiência envolvente e eficaz. Inspirado nos modelos de sucesso do Duolingo e Brilliant, o Calculus oferece uma abordagem inovadora para o aprendizado de matérias escolares, tornando-o acessível, divertido e altamente personalizado. + +Este projeto adota uma arquitetura de microserviços, dividida em 3 repositórios distintos que colaboram para oferecer uma solução coesa e escalável. Cada repositório tem um papel específico e interage com os outros serviços para compor a aplicação completa. Abaixo está uma visão geral detalhada de cada componente: + + + +## Repositórios + +- [2024.1-CALCULUS-Frontend](https://github.com/fga-eps-mds/2024.1-CALCULUS-Frontend) : A interface do usuário (UI) +- [2024.1-CALCULUS-UserService](https://github.com/fga-eps-mds/2024.1-CALCULUS-UserService) Serviço responsável pelo gerenciamento de usuários. +- [2024.1-CALCULUS-StudioMaker](https://github.com/fga-eps-mds/2024.1-CALCULUS-StudioMaker) Serviço responsável pelo gerenciamento das Jornadas/Conteudos. +Todos os repositórios são dockerizados, garantindo que os serviços possam ser facilmente configurados e executados. + +### Pré-requisitos + +Antes de iniciar o processo de instalação, certifique-se de que os seguintes softwares estejam instalados: + +- [Git](https://git-scm.com/) +- [Docker](https://www.docker.com/get-started) +- [Docker Compose](https://docs.docker.com/compose/install/) + +Para fazer alterações na documentação é necessário que se tenha python instalado. Com o python instalado siga orientações a baixo: + + +--- + +## Setup da Instalação + +### 1. Clonar os Repositórios + +Clone os repositórios do projeto para diretórios separados, conforme indicado abaixo: + +```bash + + +# Clonar o backend do UserService +$ git clone https://github.com/fga-eps-mds/2024.1-CALCULUS-UserService.git + +# Clonar o backend do StudioMaker +$ git clone https://github.com/fga-eps-mds/2024.1-CALCULUS-StudioMaker.git + +# Clonar o frontend +$ git clone https://github.com/fga-eps-mds/2024.1-CALCULUS-Frontend.git + +``` + +### 2. Configurar Variáveis de Ambiente + +Para cada serviço, crie ou edite um arquivo .env na raiz do repositório correspondente e configure as variáveis de ambiente necessárias. Em cada projeto ja possui um arquivo chamado .env.dev que mostra a configuração da .env de cada repositorio. +Abaixo está um exemplo de configuração genérica para cada serviço: + +``` +# Exemplo de .env +MONGODB_URI='' +EMAIL_USER="" +EMAIL_PASS="" +SENDGRID_API_KEY="" +JWT_SECRET="" +JWT_EXPIRATION="" +GOOGLE_CLIENT_ID="" +GOOGLE_CLIENT_SECRET="" +GOOGLE_CALLBACK_URL="" +MICROSOFT_CLIENT_ID="" +MICROSOFT_CLIENT_SECRET="" +MICROSOFT_TENANT_ID="" +MICROSOFT_CALLBACK_URL="" +FRONTEND_URL="" +EMAIL_LINK="" +``` + +Certifique-se de que as variáveis estejam corretamente configuradas em cada microserviço. + +### 3. Subir os Containers com Docker + +Vá até o diretório de cada serviço e execute os comandos abaixo para iniciar os containers com Docker. A seguir, você encontrará o passo a passo para cada serviço: + + +#### 3.2 Backend - Usuários + +Entre na pasta do backend de usuários e execute: + +```bash +$ cd 2024.1-CALCULUS-UserService +$ docker-compose up --build +``` + +Este serviço estará disponível na porta como http://localhost:3000. + +#### 3.3 Backend - StudioMaker + +Entre na pasta do backend do Studio e execute: + +```bash +$ cd 2024.1-CALCULUS-StudioMaker +$ docker-compose up --build +``` + +Este serviço estará disponível na porta configurada no .env, como http://localhost:3002. + + +#### 3.1 Frontend + +Entre na pasta do frontend e execute os seguintes comandos: + +```bash +$ cd 2024.1-CALCULUS-Frontend +$ docker-compose up --build +``` + +O frontend estará disponível em: http://localhost:4000 + +## Monitoramento dos Containers + +Você pode verificar o status de todos os containers em execução utilizando o comando: + +```bash +$ docker ps +``` + +Caso queira parar todos os serviços, navegue até cada repositório e execute: + +```bash +$ docker-compose down --volumes +``` + +Para remover containers que não estão mais em execução criados pelos docker-compose: + +``` +$ docker-compose rm -f +``` + +## Histórico de Versões + +| Alteração | Data | Autor | +| -------------------- | -------- | --------------- | +| Criação do documento | 08/09/24 | Davi Matheus | From 88e25648b773d40815471cb4ae9b1d392e8ea9f5 Mon Sep 17 00:00:00 2001 From: DaviMatheus Date: Sun, 8 Sep 2024 21:05:17 -0300 Subject: [PATCH 19/22] =?UTF-8?q?doc(#142):=20cria=C3=A7=C3=A3o=5Fmanual?= =?UTF-8?q?=5Finstru=C3=A7=C3=B5es?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- mkdocs.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/mkdocs.yml b/mkdocs.yml index ae9305e..0b0ef0e 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -49,6 +49,7 @@ nav: - Estrutura Analítica do Projeto: 'organizacoes/eap.md' - Visão de Dados: 'organizacoes/visao-de-dados.md' - Visão de Endpoints: 'organizacoes/visao-de-endpoints.md' + - Manual de Instruções: 'organizacoes/manual_de_instruções.md' - Gestão do Projeto: - Plano de Comunicação: 'planejamento/plano_comunicacao.md' - Plano de Qualidade: 'planos/plano_qualidade.md' From d4ab1c6310fdedc1b4041977480bfbcc7d1597ab Mon Sep 17 00:00:00 2001 From: Paulo Gontijo Date: Sun, 8 Sep 2024 21:34:14 -0300 Subject: [PATCH 20/22] =?UTF-8?q?docs(#142):=20cria=C3=A7=C3=A3o=20do=20po?= =?UTF-8?q?st-mortem?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/encerramento/post-mortem.md | 105 +++++++++++++++++++++++++++++++ docs/organizacoes/tap.md | 4 ++ mkdocs.yml | 2 + 3 files changed, 111 insertions(+) create mode 100644 docs/encerramento/post-mortem.md diff --git a/docs/encerramento/post-mortem.md b/docs/encerramento/post-mortem.md new file mode 100644 index 0000000..ef4f9e4 --- /dev/null +++ b/docs/encerramento/post-mortem.md @@ -0,0 +1,105 @@ +# Post Mortem + +## 1. Resumo do Projeto + +**Nome do Projeto:** Calculus +**Data de Início:** 19/03/2024 +**Data de Conclusão:** 09/09/2024 +**Objetivo:** +O objetivo do projeto Calculus era desenvolver uma plataforma de aprendizado onde professores pudessem criar conteúdos por meio de um estúdio virtual e hospedá-los na internet. A plataforma deveria ser acessível para alunos, com uma interface que permitisse aos professores gerenciar usuários, estruturar aulas e criar conteúdos facilmente. + +--- + +## 2. Resultados Esperados vs Resultados Alcançados + +| Funcionalidade | Resultado Esperado | Resultado Alcançado | Comentários | +|-----------------------------|--------------------------------------------------------|------------------------------------------------------|----------------------------------------------------------| +| **US01 - Criar Conta** | Permitir que novos usuários criem contas | Entregue e validado | Não é possível criar conta via Microsoft na aplicação pois o deployment está em http | +| **US02 - Login** | Login de usuários com autenticação segura | Entregue e validado | O login via microsoft só funcionará no deploy quando a hospedagem passar de http para https | +| **US03 - Gerenciar Roles** | Sistema de gerenciamento de papéis de usuários | Entregue e validado | Atende às expectativas | +| **US04 - Recuperar Conta** | Recuperação de senhas via e-mail | Entregue e validado | Sem problemas | +| **US05 - Estúdio de Criação**| Ambiente virtual para criação de aulas | Entregue e validado | Atende as necessidades do produto, porém o PO deixou o comentário de que a interface poderia ser mais bonita, mesmo assim ele aceitou a história de usuário | +| **US06 - Gerenciar Jornada** | Permitir que professores criem jornadas de aprendizagem| Entregue e validado | Usabilidade dentro do esperado | +| **US07 - Gerenciar Trilha** | Gestão de trilhas de aprendizagem | Entregue e validado | Funcionalidade implementada com sucesso | +| **US08 - Visualização de Trilhas**| Alunos visualizarem suas trilhas de aprendizado | Entregue e validado | Sem falhas encontradas | +| **US09 - Visualizar HomePage**| Página inicial para usuários | Entregue e validado | Interface intuitiva | +| **US10 - Visualizar Conteúdo**| Acesso ao conteúdo de aprendizagem | Entregue e validado | Todos os recursos funcionais | +| **US11 - Gerenciar Pontos de Partida**| Gestão dos pontos de início em jornadas | Entregue e validado | Implementado corretamente | + +**Conclusão sobre os Resultados:** +Todas as funcionalidades planejadas foram entregues e validadas pelo Product Owner (PO). O projeto atendeu às expectativas sem falhas críticas. + +--- + +## 3. Aspectos Positivos + +1. **Proatividade da Equipe:** + Os membros do time mostraram grande compromisso em relação ao projeto, buscando resolver problemas de forma independente. + +2. **Melhoria na Comunicação:** + Embora a comunicação tenha sido um desafio no início, houve uma evolução significativa durante o projeto, especialmente nas fases finais. + +3. **Ferramentas Apropriadas:** + As tecnologias escolhidas, como Nest.js, Next.js, MongoDB, Docker, e SonarQube, foram eficazes no desenvolvimento da aplicação e controle da qualidade do código. + +--- + +## 4. Aspectos Negativos + +1. **Greve Acadêmica:** + Uma greve que durou aproximadamente 45 dias impactou gravemente o andamento do projeto, atrasando o cronograma e paralisando os trabalhos por um longo período. + +2. **Falta de Engajamento Inicial:** + No início, houve uma falta de engajamento por parte de alguns membros da equipe, o que prejudicou a velocidade do desenvolvimento. Este problema foi parcialmente resolvido na fase final. + +3. **Atrasos no Escopo:** + Alterações no escopo de algumas histórias, especialmente próximo à release MVP, causaram atrasos na entrega. A mudança no escopo da última sprint foi significativa e levou a uma reavaliação das prioridades. + +4. **Problemas Técnicos:** + Alguns integrantes não tinham equipamentos adequados no início do projeto, o que dificultou o desenvolvimento inicial da aplicação. + +5. **Falta de Orçamento:** + Muitos recursos utilizados, especialmente os relacionados ao deploy, eram pagos. Como o projeto não tinha orçamento, os custos foram cobertos pelos próprios membros da equipe, o que limitou algumas escolhas tecnológicas. + +--- + +## 5. Lições Aprendidas + +1. **Comunicação é Fundamental:** + Um dos maiores aprendizados foi que uma comunicação eficaz é crucial para o sucesso de qualquer projeto. Melhorar esse aspecto mais cedo poderia ter evitado vários problemas. + +2. **Engajamento Antecipado:** + O esforço para engajar todos os membros da equipe desde o início é essencial para garantir que o trabalho seja distribuído de forma mais equitativa e que o projeto avance conforme o planejado. + +3. **Reuniões Constantes com o PO:** + As reuniões frequentes com o Product Owner (PO) foram fundamentais para alinhar as expectativas e garantir que as histórias estivessem bem definidas, além de ajudar a ajustar o escopo quando necessário. + +--- + +## 6. Oportunidades de Melhoria + +1. **Escopo de Testes:** + Mais atenção poderia ser dada ao planejamento de testes, especialmente testes automatizados, para garantir maior qualidade e evitar problemas na fase de deploy. + +2. **Orçamento para o Deploy:** + Uma estratégia de deploy mais robusta poderia ser implementada caso houvesse um orçamento alocado para essa parte do projeto, o que tornaria o processo mais eficiente. + +3. **Incluir um Especialista em UX/UI:** + A adição de um membro focado exclusivamente em UX/UI traria uma experiência de usuário mais refinada e ajudaria a tornar a plataforma mais atraente visualmente. + +--- + +## 7. Conclusão + +Apesar dos desafios enfrentados, o projeto Calculus foi considerado um sucesso. Todas as funcionalidades planejadas foram entregues e validadas, e a equipe conseguiu superar problemas técnicos, organizacionais e financeiros. As lições aprendidas durante este processo serão fundamentais para futuros projetos. + +--- + +## 8. Agradecimentos + +Gostaríamos de expressar nossa gratidão aos professores **Vinicius Rispolli** e **Hilmer Neri**, que acompanharam o desenvolvimento deste projeto e forneceram orientações valiosas para seu sucesso. Também gostaríamos de agradecer pela participação e comprometimento de todos da equipe de EPS e MDS, responsáveis por desenvolver e gerenciar a aplicação fim-a-fim. Por último, agradecer a Universidade de Brasília por condicionar o ambiente de aprendizado. + +## 9. Histórico de Versão +| Data | Versão | Descrição | Autor(es) | +|------------|--------|-----------------------|------------------------------------| +| 08/09/2024 | 1.0 | Criação do Documento | Paulo Henrique Gontijo | diff --git a/docs/organizacoes/tap.md b/docs/organizacoes/tap.md index 6b1a471..3340e2d 100644 --- a/docs/organizacoes/tap.md +++ b/docs/organizacoes/tap.md @@ -89,6 +89,10 @@ Para uma visão detalhada sobre o plano de riscos do projeto, por favor, consult - 29/07/2024 +**Release 2** + +- 19/08/2024 + **Release Final** - 09/09/2024 diff --git a/mkdocs.yml b/mkdocs.yml index ae9305e..8893784 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -65,4 +65,6 @@ nav: - Dojo Git: 'dojo/dojo-git.md' - Dojo Docker: 'dojo/dojo-docker.md' - Dojo Frontend: 'dojo/dojo-frontend.md' + - Encerramento: + - Post Mortem: 'encerramento/post-mortem.md' From 3363bb7ab3f4e049b4dc96358b771981fdb82e7e Mon Sep 17 00:00:00 2001 From: Paulo Gontijo Date: Sun, 8 Sep 2024 21:59:16 -0300 Subject: [PATCH 21/22] docs(#142): adicionando melhorias --- docs/encerramento/post-mortem.md | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/docs/encerramento/post-mortem.md b/docs/encerramento/post-mortem.md index ef4f9e4..4e52773 100644 --- a/docs/encerramento/post-mortem.md +++ b/docs/encerramento/post-mortem.md @@ -87,6 +87,13 @@ Todas as funcionalidades planejadas foram entregues e validadas pelo Product Own 3. **Incluir um Especialista em UX/UI:** A adição de um membro focado exclusivamente em UX/UI traria uma experiência de usuário mais refinada e ajudaria a tornar a plataforma mais atraente visualmente. +4. **US06 - Gerenciar Jornada e US11 - Gerenciar Pontos de Partida** + Ambas histórias de usuário, em sua interface, existe um espaço que foi designado para se colocar imagens. Hoje, na entrega do projeto, este campo está com uma imagem genérica, não permitindo a mudança pela usuário. Uma oportunidade de melhoria seria adicionar uma funcionalidade para que o usuário possa adicionar qualquer imagem às jornadas e aos pontos de partida. + +5. **Troca de protocólo de comunicação** + A aplicação está sendo entregue com seu deployment feito a partir de uma máquina virtual, hospedada no Microsoft Azure. Dito isso, foi feita uma abertura de rede e exposição dessa máquina na internet, para que usuários externos possam interagir com a aplicação. Esta abertura de portas e rotas para intenet foi executada de tal forma que só é possível se comunicar com a aplicação por meio do protocólo HTTP. Isso abre espaço para adição de um certificado SSL/TLS, o que permitirá comunicação segura com a porta 443 (padrão TCP/IP) e consequentemente o uso do protocólo HTTPS. + + --- ## 7. Conclusão From 87c5ce7ad2d743163f80d88fd4c7dc38097e77c4 Mon Sep 17 00:00:00 2001 From: Paulo Gontijo Date: Sun, 8 Sep 2024 22:08:00 -0300 Subject: [PATCH 22/22] =?UTF-8?q?fix(#142):=20corre=C3=A7=C3=A3o=20gramati?= =?UTF-8?q?cal?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/encerramento/post-mortem.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docs/encerramento/post-mortem.md b/docs/encerramento/post-mortem.md index 4e52773..21c9b99 100644 --- a/docs/encerramento/post-mortem.md +++ b/docs/encerramento/post-mortem.md @@ -79,7 +79,7 @@ Todas as funcionalidades planejadas foram entregues e validadas pelo Product Own ## 6. Oportunidades de Melhoria 1. **Escopo de Testes:** - Mais atenção poderia ser dada ao planejamento de testes, especialmente testes automatizados, para garantir maior qualidade e evitar problemas na fase de deploy. + Mais atenção poderia ser dada ao planejamento de testes, especialmente testes de usabilidade, para garantir maior qualidade do produto e satisfação do usuário. 2. **Orçamento para o Deploy:** Uma estratégia de deploy mais robusta poderia ser implementada caso houvesse um orçamento alocado para essa parte do projeto, o que tornaria o processo mais eficiente.