Baseado na escalabilidade necessária para melhor funcionamento dos sistemas da DPMG, de forma integrada, foi definido a utilização do JAVA e toda sua stack para implementações de aplicações robustas.
Java é uma linguagem de programação e plataforma computacional lançada pela pela Sun Microsystems em 1995. Existem muitas aplicações cujo funcionamento estão condicionados à presença do Java instalado. Java é uma linguagem gratuita, está entre as linguagens mundialmente mais usadas e atualmente é mantida pela Oracle.
Principais características do Java:
Os sistemas comunicam entre si através de “cliente-servidor”, onde as aplicações frontends (cliente) realizam requisições na API Gateway (servidor) para manipulações e consultas de dados. As API’s são responsáveis por receber as request de microsserviços, validar o acesso aos endpoints via permissão do usuário, manipular o dado e retornar a informação solicitada via response.
Os microsserviços possuem definições a serem seguidas, como por exemplo a implementação de rollbacks em todos os métodos que utilize transação. Também deverão ser serviços simples e objetivos. Todos os endpoints devem ser documentados através do Swagger e com o SCSDP corretamente configurado.
Esse projeto foi criado para facilitar a criação de novos projetos JAVA na DPMG.
Todos os padrões no desenvolvimento serão mantidos nesse projeto para melhorar a integração de novos participantes na equipe e até mesmo a criação de projetos no dia a dia.
Esse projeto só precisará ser clonado caso queira contribuir com o archetype, fora isso não é necessário para criação de novos projetos
Execute o comando na pasta onde deseja criar o projeto.
mvn archetype:generate -DarchetypeGroupId=br.def.mg.defensoria -DarchetypeArtifactId=archetype-backend -DarchetypeVersion=2.1.9 -Dprojeto=nome-projeto
Ps: Caso o settings do maven não esteja na pasta padrão deverá adicionar o seguinte atributo
-s /diretorio/arquivoSettings.xml
Ao gerar esse comando será gerado um projeto maven multi-modules com a camada de persistência e serviço, um modulo de dependências também será gerado com as dependências mais utilizadas nos projetos
O projeto gerado será montado com a seguinte Stack de tecnologias
As configurações de charset e encode já serão realizadas.
O pacote de todos os modulos já definidos por padrão com o seguinte valor:
br.def.mg.defensoria.nomeProjeto
O groupId é definido pelo padrão da defensoria:
br.def.mg.defensoria
Observação: O pacote default gerado deve ser alterado caso o nome do projeto seja composto, alterando para nome.projeto não é possível automatizar essa parte trocando “-” por “.”
Foi configurado os testes para conseguir analisar qual a porcentagem de coverage do código fonte.
Baseado em organização dos códigos para garantir melhor leitura e manutenção de serviços, foi definido uma arquitetura de forma que seus módulos possuam baixo acoplamento
entre si e de fácil compreensão, permitindo um desenvolvimento ágil.
A arquitetura base é composta por 1 projeto “pai” que agrupa 4 projetos “filhos”. Estes 4 projetos são definidos como módulos, e eles são separados em: Dependencies, Migration, Persistence e Service. Em casos específicos em que o projeto tenha automações, poderá ser incluído os módulos chamados de Job e Shared.
Este modulo é responsável por gerenciar as bibliotecas utilizadas pelos demais módulos da aplicação. A imagem abaixo é um exemplo de como devem ser importadas as bibliotecas.
O modulo de migration é responsável pela gestão dos scripts de banco de dados que deverão ser executados para o correto funcionamento do módulo Persistence. Os scripts
são organizados em pasta de estrutura e pasta de dados. Os dados devem ser separados por ambiente (Desenvolvimento, Homologação e Produção). Os scripts de estrutura
são executados pelo flyway ao rodar a pipeline.
Este modulo é responsável pelas classes Java de mapeamento objeto relacional das tabelas e seus relacionamentos. No persistence deve ter duas pastas, entities,
onde ficam as entidades mapeadas, e enums, onde ficam os enumerados.
Neste modulo contém todo o fluxo de desenvolvimento das regras de negócio da aplicação. É nele que deve ser criado as Controllers (para serviços REST), os DTOs
(para objetos JSON), os EJB’s (para codificações das regras de negócio) e os DAOs (para persistir ou buscar no banco de dados).
Este modulo possibilita o agendamento de tarefas, as quais serão executadas em horários pré-definidos. Lembrando que este modulo deverá existir somente em uma instância do WildFly, com isso evitará que as tarefas sejam executadas mais de uma vez devido as instâncias.
Seu objetivo é evitar que o Módulo Job tenha que fazer uma integração para acessar a serviços remotos dentro do projeto. Neste modulo é utilizado JNDI (Java Naming and Directory Interface), que é uma API que permite acesso à recursos externos através de um nome utilizando o conceito de lookup.
Projeto que centralizar as funcionalidades básicas de todos os sistemas.
Utilizada para recupera os parâmetros do sistema.
Classe utilitária para a realização de integrações
Onde:
Parâmetro | Tipo dado | Default | Exemplo |
---|---|---|---|
URL | String | http://dev-gerais.defensoria.mg.def.br/unidade/find-all | |
TIMEOUT (segundos) | int | 5 | 10 |
OBJETO | Object | new Usuario() |
Onde:
Parâmetro | Tipo dado | Default | Exemplo |
---|---|---|---|
URL | String | http://dev-gerais.defensoria.mg.def.br/unidade/find-all | |
TIMEOUT (segundos) | int | 5 | 10 |
OBJETO | Object | new Usuario() |
Onde:
Parâmetro | Tipo dado | Default | Exemplo |
---|---|---|---|
URL | String | http://dev-gerais.defensoria.mg.def.br/unidade/find-all | |
TIMEOUT (segundos) | int | 5 | 10 |
Onde:
Parâmetro | Tipo dado | Default | Exemplo |
---|---|---|---|
TOKEN | String | Bearer eyJhbGciOiJIUzUxMiIsInR5cCI6IkpXVCJ9.eyJzdWIiOiIxMjM0NTY3ODkwIiwibmFtZSI6IkJydW5vIiwiaWF0IjoxNTE2MjM5MDIyfQ.YDN0wJHLzyzmqdwycv4wgh-RMBwQR4C_0uehWmo_77ZrAB46YnPYmzJJ2Lb36GyyDXDwRP9Bt759hcVmUiGWEg |
Os projetos Front-End da instituição DPMG e baseado no padrão de arquitetura “MVC” que melhora a conexão entre camadas de dados regras de negócio e a interação com usuário,
também seguimos os princípios do “SOLID“com ênfase nos dois primeiros princípios “S – Single-responsibility Principle (Princípio da responsabilidade única)” e
“O – Open-closed Principle (Princípio do aberto-fechado)”.
O padrão para criar aplicações VueJS v2.x e o “class component” que é estendido da pasta “data”, já no VueJS v3.x utilizamos o composition api o arquivo da pasta “data” e
declarado como uma constante.
Exemplo imagem VueJS v2.x e v3.x:
VueJS 2:
VueJS 3:
As rotas são definidas com plugin vue-router para VueJS v2.x e v3.x.
O plugin de armazenamento de estado para VueJS v2.x e vuex, enquanto no VueJS v3.x e o Pinia.
O vue-i18n plugin de internacionalização do VueJS utilizado somente nas versões 3.x do vue.
Os plugins de front-end utilizados são Vuetify para VueJS v2.x e Quasar para v3.x.
Os plugins para criação de formulários para versão 3.x do Vue, será o Vee-validate em conjunto com Yup e Pinia.
Todas as pastas e arquivos são criados com letras minúsculas e separadas com hífen.
Todos arquivos com funções especificas como entity devem ser terminados com ponto seguido do nome da pasta, somente no caso de arquivos typescript.
Toda estrutura pode sofre adições de pasta como “assets”, “util” ou “@types” entre outras necessárias para facilitar o desenvolvimento, porém sempre
mantendo a estrutura base e seguindo os padrões estabelecidos.
Exemplo na imagem abaixo.
É importante que os layouts, botões, fontes e ícones estejam de acordo com a Paleta de Cor da DPMG.
Partes de telas que serão utilizadas em mais de um lugar, deverão ser componentizadas, para tornar a manutenibilidade mais eficaz;
As aplicações de média e grande complexidade vêm tomando a Clean Architecture como uma das melhores soluções, de modo a criar uma arquitetura que seja facilmente escalável, testável e manutenível. Sendo assim, entendemos ser a melhor opção para aplicar nos projetos mobiles da DPMG.
A arquitetura se divide basicamente, nas seguintes camadas:
API / Local / DB → Remoto / Local (DataSource) → Repositório → Casos de Uso → BLoC → View
A arquitetura segue as regras de que, cada camada deve se comunicar apenas com seu componente imediato, desta forma, segue conforme o esquema abaixo:
São representadas nesta camada, pelas Views e BLoC:
A composição desta camada, é feita pelos UseCases e Repositories:
Nesta camada se encontram os dados e de onde eles podem ser acessados.
O DataSource é a fonte de dados propriamente dita, ou seja, é o que a implementação executa, para acessar os dados.
O node e utilizado como microsserviços e websockets, a versão do node e a v18.x/v20.x. Framework escolhido para trabalhar com mesmo foi NestJS pois ele tem como proposta
facilitar o desenvolvimento de aplicações back-end independente do protocolo de comunicação que elas utilizem, segundo fator e sua documentação que nos traz diferentes
formas de estruturar a aplicação NestJS além de ser rica em detalhes e exemplos, a tornando de fácil entendimento. O ORM escolhido foi o Prisma. Toda projeto desenvolvido deve possuir documentação que e gerada com Swagger. Parte de segurança foi gerar com guard’s que e mesmo conceito dos “guard’s”
do Angular. O desenvolvimento e baseado na arquitetura “MVC” sendo aplicado também os conceitos do “S.O.L.I.D”.
Exemplo da estrutura de pasta: