Skip to content

rcsim/tech-challenge-fase3

Repository files navigation

tech-challenge-fase3

Repositório para o Tech Challenge - Grupo 30

Este repositório contém o código-fonte e a documentação para o Tech Challenge - Fase 3, desenvolvido pelo Grupo 30.

O projeto consiste em uma API RESTful para gerenciamento de estacionamento. A API permite criar um usuário, fazer checkin e checkout de um veículo estacionado, e realizar o pagamento por Cartão ou Pix.

1- Relatório Técnico

Tecnologias e ferramentas utilizadas

  • Linguagem de programação:

    • Java 17
  • Framework:

    • Spring Boot 3.1.3
  • Bibliotecas:

    • Spring Web
    • Spring Mail
    • Spring Job Runner
    • OpenAPI
    • IText Core
    • Lombok
  • Banco de dados:

    • PostgreSQL
  • Outras ferramentas:

    • Docker

Configurações da solução

Banco de Dados

Configuração de teste utilizando o H2:

# Dados de conexao com o banco H2
spring.datasource.driverClassName=org.h2.Driver
spring.datasource.url=jdbc:h2:mem:testdb
spring.datasource.username=sa
spring.datasource.password=

Configuração de produção utilizando o PostgreSQL

# Dados de conexão com o banco PostgreSQL
spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=none
spring.jpa.hibernate.show-sql=true
spring.datasource.url=jdbc:postgresql://localhost:5432/parkingmeter_db
spring.datasource.username=compose-postgres
spring.datasource.password=compose-postgres

Relacionamento entre as entidades:

image

Container

Criamos um container para aplicação e outro para o banco de dados e uma rede no modo bridge para ter acesso ao containers via localhost:

version: "3"
services:
db:
image: postgres
volumes:
- ./01-schema.sql:/docker-entrypoint-initdb.d/01-schema.sql
- ./02-seed.sql:/docker-entrypoint-initdb.d/02-seed.sql
environment:
- POSTGRES_USER=compose-postgres
- POSTGRES_PASSWORD=compose-postgres
ports:
- "5432:5432"
networks:
- my-networks
app:
depends_on:
- db
build: .
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/parkingmeter_db
- SPRING_DATASOURCE_USERNAME=compose-postgres
- SPRING_DATASOURCE_PASSWORD=compose-postgres
- SPRING_JPA_HIBERNATE_DDL_AUTO=update
- SPRING_PROFILES_ACTIVE=dev
ports:
- "8080:8080"
networks:
- my-networks
networks:
my-networks:
driver: bridge

Também adicionamos o arquivo Dockerfile que gerencia o processo de build da aplicação através do Maven e JDK, já inicializando a aplicação:

FROM maven:3.9.1 AS MAVEN_BUILD
COPY ./ ./
RUN mvn clean package
FROM openjdk:17-alpine AS builder
COPY --from=MAVEN_BUILD target/*.jar application.jar
RUN java -Djarmode=layertools -jar application.jar extract
FROM openjdk:17-alpine
EXPOSE 8080
COPY --from=builder dependencies/ ./
COPY --from=builder snapshot-dependencies/ ./
COPY --from=builder spring-boot-loader/ ./
COPY --from=builder application/ ./
ENTRYPOINT ["java", "org.springframework.boot.loader.JarLauncher"]

Para criação dos container, compilar e rodar a applicação é necessário apenas o comando:

docker-compose up -d

image

Documentação das APIS

Adicionamos a geração automática da documentação através da biblioteca SpringDoc OpenAPI, a documentação pode ser acessada enquanto a aplicação estiver rodando em http://localhost:8080/swagger-ui/index.html#/:

image image image

Arquivo POSTMAN

Disponibilizamos um arquivo JSON com todas as requisições Postman para testar a API, disponível no seguinte link:

https://github.com/rcsim/tech-challenge-fase3/blob/main/src/main/resources/postman/Tech-challenge-3.postman_collection.json

Envio de notificações

Conforme solicitado no documento de requisitos, implementamos o envio de notificações nos seguintes casos:

1- Envio de notificação 30 minutes antes do encerramento do período fixo contratado ou 30 minutos antes de completar a próxima hora: image

2- Envio do recibo ao final do período, seja após o checkout pelo usuário ou ao completar o período fixo já pago.

image

Também é enviado ao usuário o recibo em formato de pdf:

image

Deploy AWS

Elaboramos um arquivo "build.bat" com o propósito de facilitar o processo de implantação das imagens Docker no Amazon Elastic Container Registry (ECR). Ao ajustar os parâmetros neste arquivo, você pode provisionar tanto o contêiner da aplicação quanto o do banco de dados. Para orquestrar a execução desses contêineres no cluster ECS que foi criado, configuramos uma definição de tarefa (task definition). Além disso, montamos um ambiente ECS baseado em infraestrutura EC2, fornecendo instâncias que serão encarregadas de executar os contêineres. Estas instâncias são fundamentais para a operação e funcionamento adequado de nossas aplicações e este conjunto de ações garante uma estrutura sólida e escalável para a execução de seus contêineres Docker no ambiente AWS.

Arquitetura Aws

Evidencias em fotos na pasta: Aws

Conclusões

O projeto foi desenvolvido com sucesso, atendendo aos requisitos do desafio. As tecnologias e ferramentas utilizadas foram adequadas para o propósito do projeto e contribuíram para o desenvolvimento eficiente e robusto do sistema.

Principais dificuldades encontradas foram relacionadas ao deploy na AWS, entre elas a dificuldade de selecionar o melhor serviço para atender ao requisito do aumento exponencial da demana em períodos específicos do ano e a escolher recursos gratuitos visto que este não é um projeto comercial. Além disso, dedicamos tempo no entendimento das regras de negócio do projeto, que por serem complexas exigiram um entendimento cuidadoso dos mesmos.

Outro problema enfrentado se refere ao envio de email utilizando um serviço gratuito fornecido por uma empresa terceira. Esse serviço tem uma performance abaixo do esperado, quando utilizado no plano gratuito, (5 segundos por requisição de envio) o que poderia comprometer o requisito de performance solicitado. Para resolver este problema utilizamos duas bibliotecas (Job Runner e Spring Scheduller) para fazer o scheduling das requisições de envio de email.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages