<h1 align="center"> ChegaJá </h1>
Nessa página você encontrará as informações sobre a arquitetura de software do projeto.
* [Visão Geral](##Visão-geral)
* [Detalhamento dos módulos](##Detalhamento-dos-módulos)
* [Diagrama de implantação](##Diagrama-de-implantação)
* [Definição Tecnológica](##Definição-Tecnológica)
## Visão geral
O padrão arquitetural escolhido para a implementação do ChegaJá é o de camadas, no qual será acrescentada uma nova camada entre a camada de aplicação e a camada de negócios que é a camada implementada pelo padrão de projeto Facade.
Por tanto, a arquitetura será constituída de 4 camadas: Apresentação, Fachada, Negócios e Dados. A camada de Apresentação se comunicará com a fachada, que por sua vez se comunica com a camada de negócios, apresentando uma versão simplificada para a sua camada superior. A camada de negócios, além de se comunicar com a camada da fachada também se comunicará com a camada de dados.
Além disso, para realizar o rastreamento dos entregadores, haverá uma integração entre a camada de fachada e a API do Google Maps que irá intermediar a comunicação desta API com a camada de apresentação repassando a localização para que a camada de apresentação mostre essa informação na tela. Outro recurso externo utilizado é a Api do fireBase que se comunicará indiretamente com as camadas de apresentação e negócios passando pela camada da fachada.
<div style="text-align: center">
<img src="https://i.imgur.com/EPZO67D.png" width="50%">
</div>
## Detalhamento dos módulos
**Camada de Apresentação**
A camada de apresentação será a responsável pelas interações do cliente com a aplicação. Esta camada está subdividida em dois módulos principais que representam os dois tipos de usuários que irão interagir com a aplicação:A Empresa e o Entregador.
<div style="text-align: center">
<img src="https://i.imgur.com/26EPdjL.png" width="70%">
</div>
**Camada de Fachada**
A camada fachada implementada pelo padrão de projeto **Facade** intermediará as requisições das API's(camada de negócio e Plataforma Google Maps) para a camada de apresentação, desse modo ela disponibilizará uma interface simples com o conjunto de funcionalides específicas para cada tipo de usuário do **ChegaJá** (Empresa, Entregador).
**Camada de Negócio**
Esta camada conterá uma REST API que será responsável por promover a comunicação entre as camadas do lado do cliente(Apresentação e Fachada) com a camada de dados. E para representação externa de dados será utilizado o formato JSON.
**Camada de Dados**
A camada de dados compreende a tecnologia de banco de dados reponsável por armazenar e gerenciar os dados relacionados a empresas, entregadores, entregas, etc.
## Diagrama de implantação
A implantação do projeto é dividida em três partes (**Cliente**, **API** e **Banco de Dados**), como podemos ver na imagem abaixo:
<div style="text-align: center">
<img src="https://i.imgur.com/Dv0MCcp.png" width="70%">
</div>
A aplicação mobile do Cliente deverá se comunicar com a API do sistema, através de requisições realizadas, com o protocolo HTTP (*Hypertext Transfer Protocol*) e o protocolo de internet TCP IP.
Nas requisições HTTP, usam-se os HTTP Verbs (ou verbos HTTP). Esses verbos são *GET*, *POST*, *PUT*, *DELETE*. A tabela abaixo especifica o que cada tipo de requisição significa:
<div style="width: 50% !important;margin: auto;">
| Requisição | Descrição |
|------------|-------------------------------------------------------------|
| GET | Solicita determinado recurso. Retorna dados para o cliente. |
| POST | Envia determinado recurso ou dado para a API. |
| PUT | Substitui determinado recurso. |
| DELETE | Apaga um recurso ou dado. |
</div>
A API, ao receber essas requisições, deve se comunicar com o banco de dados, intermediando a interação entre Cliente e Base de Dados, realizando as operações desejadas.
## Definição Tecnológica
Nossa proposta é desenvolver uma aplicação que funcione no ambiente de dispositivos móveis, tanto no sistema Android como no sistema iOS, pela praticidade que estes dispositivos oferecem tanto para o entregador quanto para a empresa.
Para tanto decidimos utilizar o framework Flutter, que utiliza a linguagem Dart, que nos possibilita a construção de aplicativos híbridos (que funcionam nas duas principais plataformas mobile) utilizando apenas uma base de código.
Junto a isso teremos uma API que cuidará de toda a regra de negócio e nos servirá os dados que precisaremos no aplicativo por meio de uma RESTFull API. Esta será construída por meio do framework Spring, que utiliza a linguagem Java. A utilização deste framework nos auxiliará no desenvolvimento por conter muitos padrões pré-definidos que nos trarão agilidade e produtividade, aliados a robustez e confiabilidade. (biblioteca de testes??)
Quanto ao banco de dados, decidimos utilizar o PostgreSQL que ficará instalado no servidor web junto com a API. Novamente sua escolha se justifica por ser um serviço de banco de dados amplamente utilizado em aplicações pelo mundo, de fácil utilização, implantação e escalabilidade de base de dados relacionais.
Abaixo temos um resumo geral dos frameworks e linguagens utilizados:
<div style="width: 50% !important;margin: auto;">
| | Tecnologia | Linguagem |
| -------------- |:----------:|:---------:|
| Cliente | Flutter | Dart |
| API | Spring | Java |
| Banco de Dados | PostgreSQL | SQL |
</div>
Além disso, usaremos outros recursos de desenvolvimento:
<div style="width: 50% !important;margin: auto;">
| | Recurso |
|----------------------------|:------------:|
| Edição de código Flutter | VSCode |
| Controle de versão | Git e Github |
|Edição de código Spring |Inteliji |
|Implantação de API |Heroku |
</div>
## Resumo
Resumindo os tópicos mais importantes da arquitetura do projeto ChegaJá, temos:
- Arquitetura de Camadas: Apresentação (Cliente), Fachada, Negócios e Dados;
- Uso de dois padrões de projetos: Facade e Chain of Responsibility;
- Uso das tecnologias Flutter, PostgreeAQL e Spring;
- Implantações no Heroku.