Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
33 changes: 33 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
HELP.md
target/
!.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
19 changes: 19 additions & 0 deletions .mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
# Licensed to the Apache Software Foundation (ASF) under one
# or more contributor license agreements. See the NOTICE file
# distributed with this work for additional information
# regarding copyright ownership. The ASF licenses this file
# to you under the Apache License, Version 2.0 (the
# "License"); you may not use this file except in compliance
# with the License. You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing,
# software distributed under the License is distributed on an
# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
# KIND, either express or implied. See the License for the
# specific language governing permissions and limitations
# under the License.
wrapperVersion=3.3.2
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.9/apache-maven-3.9.9-bin.zip
172 changes: 104 additions & 68 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,79 +1,115 @@
### FCamara 🚀
## Projeto Spring Boot - Sistema de Gestão de Estacionamento
API REST para gerecenciamento de estacionamento de veículos (carros e motos), com funcionalidades de cadastro de estabelecimentos, veículos e controle de entrada e saída.
Também foi adicionada funcionalidades de autenticação básica do Spring Security e geração de relatório básico em PDF, com detalhes e sumário de entrada e saída de veículos.

*"Queremos ser como uma árvore, crescer um pouco todos os dias e tentar tocar o céu, sem perder a solidez de nossas raízes."*
Conheça: www.fcamara.com.br
## Tecnologias Utilizadas
- Java 17
- Spring Boot 3.3.3
- Spring Data JPA
- Spring Validation
- Spring Web
- Spring Security
- Postgres
- Lombok
- IText para geração de PDFs.

## Teste para vaga de Desenvolvedor Back-end
Criar uma API REST para gerenciar um estacionamento de carros e motos.
## Endpoints da API
## Autenticação
http://localhost:8080/parking-api/login
user comum: pedro.lucas
password: 1234
user admin: admin
password: 9876

## Cadastro de estabelecimento
Criar um cadastro da empresa com os seguintes campos:
- Nome;
- CNPJ;
- Endereço;
- Telefone;
- Quantidade de vagas para motos;
- Quantidade de vagas para carros.
## Swagger
http://localhost:8080/vehicle-api/swagger-ui/index.html

**Todos** os campos são de preenchimento obrigatório.
## Configuração para Execução
## Pré-requisitos
- Java 17 SDK

## Cadastro de veículos
Criar um cadastro de veículos com os seguintes campos:
- Marca;
- Modelo;
- Cor;
- Placa;
- Tipo.

**Todos** os campos são de preenchimento obrigatório.

## Funcionalidades
- **Estabelecimento:** CRUD;
- **Veículos:** CRUD;
- **Controle de entrada e saída de veículos.**

## Requisitos
- Modelagem de dados;
- O retorno deverá ser em formato JSON e XML;
- Requisições GET, POST, PUT ou DELETE, conforme a melhor prática;
- A persistência dos dados pode ser realizada da maneira que preferir;
- Criar README do projeto descrevendo as tecnologias utilizadas, chamadas dos serviços e configurações necessário para executar a aplicação.

## Ganha mais pontos
- Desenvolver utilizando TDD;
- Criar API de relatório;
- Sumário da quantidade de entrada e saída;
- Sumário da quantidade de entrada e saída de veículos por hora;
- Criar uma solução de autenticação.
## Como Executar
- Clone o repositório:
`git clone https://github.com/pedrolucas557/backend-test-java.git`
- Clicar com botão direito na classe ParkingApiApplication.java e selecionar 'Run ParkingApiApplication.main()'

## Questionário para Avaliação de Competências
## 1. GraphQL (Implementação BFF - Backend For Frontend)
- Pergunta 1: Explique o que é o GraphQL e como ele se diferencia de uma API REST tradicional.
- Pergunta 2: Descreva como você implementaria o uso do GraphQL como BFF (Backend for Frontend) neste projeto de
gerenciamento de estacionamento. Forneça exemplos práticos.
- Pergunta 3: Quais são os benefícios de utilizar GraphQL em relação à flexibilidade das consultas?
Cite possíveis desafios ao utilizá-lo.
- - -
- Resposta(Pergunta 1.1): GraphQL é uma forma de consultar APIs onde o cliente (frontend) pode pedir exatamente os dados
que precisa, sem mais nem menos. APIs REST geralmente têm vários endpoints (ex.: /users, /posts). No GraphQL, há apenas
um endpoint, e todas as consultas (queries) são feitas nele.
- Resposta(Pergunta 1.2): Implementação de Queries e Mutations:
Exemplo de Query:
type Query {
veiculoPorPlaca(placa: String!): Veiculo
veiculosPorMarca(marca: String!): [Veiculo]
estabelecimentos: [Estabelecimento]
}
Exemplo de Mutation:
type Mutation {
cadastrarVeiculo(marca: String!, modelo: String!, cor: String!, placa: String!, tipo: String!): Veiculo
cadastrarEstabelecimento(nome: String!, cnpj: String!, endereco: String!, telefone: String!, vagasMotos: Int!, vagasCarros: Int!): Estabelecimento
}
- Resposta(Pergunta 1.3): Alguns benefícios em relação a flexibilidade é que você pede só o que precisa com GraphQL,
consulta única para dados relacionados e facilidade de
evolução. Alguns dos possíveis desafios ao utilizá-lo são a complexidade na configuração inicial, perfomance de
consultas ea segurança.

### 1. GraphQL (Implementação BFF - Backend For Frontend)
- **Implementação:** Crie um BFF com GraphQL localmente para permitir as operações de CRUD e controle de entrada e saída de veículos. O BFF deve expor as operações e lidar com as interações entre o front-end e o back-end.
- **Disponibilização:** Após implementar o BFF, disponibilize o projeto publicamente no GitHub, com um link no README para o repositório.
- **Documentação:** Explique no README os benefícios de usar GraphQL no contexto do projeto, descrevendo também como configurar e rodar o BFF localmente.
- **Questões:** Além da implementação, responda às seguintes perguntas no README:
- **Pergunta 1**: Explique o que é o GraphQL e como ele se diferencia de uma API REST tradicional.
- **Pergunta 2**: Descreva como você implementaria o uso do GraphQL como BFF (Backend for Frontend) neste projeto de gerenciamento de estacionamento. Forneça exemplos práticos.
- **Pergunta 3**: Quais são os benefícios de utilizar GraphQL em relação à flexibilidade das consultas? Cite possíveis desafios ao utilizá-lo.

### 2. Banco de Dados (Nível Básico)
- **Pergunta 1**: Explique os principais conceitos de um banco de dados relacional, como tabelas, chaves primárias e estrangeiras.
- **Pergunta 2**: No contexto de uma aplicação de gerenciamento de estacionamento, como você organizaria a modelagem de dados para suportar as funcionalidades de controle de entrada e saída de veículos?
- **Pergunta 3**: Quais seriam as vantagens e desvantagens de utilizar um banco de dados NoSQL neste projeto?

### 3. Agilidade (Nível Básico)
- **Pergunta 1**: Explique o conceito de metodologias ágeis e como elas impactam o desenvolvimento de software.
- **Pergunta 2**: No desenvolvimento deste projeto, como você aplicaria princípios ágeis para garantir entregas contínuas e com qualidade?
- **Pergunta 3**: Qual a importância da comunicação entre as equipes em um ambiente ágil? Dê exemplos de boas práticas.
## 2. Banco de Dados (Nível Básico)
- Pergunta 1: Explique os principais conceitos de um banco de dados relacional, como tabelas,
chaves primárias e estrangeiras.
- Pergunta 2: No contexto de uma aplicação de gerenciamento de estacionamento, como você organizaria a modelagem
de dados para suportar as funcionalidades de controle de entrada e saída de veículos?
- Pergunta 3: Quais seriam as vantagens e desvantagens de utilizar um banco de dados NoSQL neste projeto?
- - -
- Resposta(Pergunta 2.1): Uma tabela em um banco de dados relacional é como uma planilha que você usa para organizar
informações. Ela armazena dados sobre um determinado assunto (por exemplo, "veículos" ou "estacionamento"),
de forma que cada linha da tabela representa um item ou registro, e cada coluna descreve um detalhe desse item.
- Resposta(Pergunta 2.2): A chave primária é um campo especial dentro da tabela que serve como identificador único de
cada registro. É como um RG ou CPF para cada linha da tabela, garantindo que cada registro seja único. Geralmente,
é um número (ID), mas pode ser qualquer coisa que identifique um item sem repetir.
- Resposta(Pergunta 2.3): Algumas vantagens seriam à flexibilidade no modelo de dados, a escalabilidade horizontal e a
alta perfomance com grandes volumes.
Algumas desvantagens seriam à falta de relacionamentos complexos, consistência eventual e menos ferramentas de análise
de dados.

### 4. DevOps (Nível Básico)
- **Pergunta 1**: O que é DevOps e qual a sua importância para o ciclo de vida de uma aplicação?
- **Pergunta 2**: Descreva como você integraria práticas de DevOps no desenvolvimento desta aplicação de estacionamento. Inclua exemplos de CI/CD.
- **Pergunta 3**: Cite as ferramentas que você usaria para automatizar o processo de deploy e monitoramento da aplicação.
## 3. Agilidade (Nível Básico)

## Submissão
Crie um fork do teste para acompanharmos o seu desenvolvimento através dos seus commits.
- Pergunta 1: Explique o conceito de metodologias ágeis e como elas impactam o desenvolvimento de software.
- Pergunta 2: No desenvolvimento deste projeto, como você aplicaria princípios ágeis para garantir entregas contínuas
e com qualidade?
- Pergunta 3: Qual a importância da comunicação entre as equipes em um ambiente ágil? Dê exemplos de boas práticas.
- - -
- Resposta(Pergunta 3.1):
As metodologias ágeis são uma forma mais dinâmica e flexível de gerenciar projetos, especialmente no desenvolvimento
de software. A ideia central é dividir o trabalho em pequenas partes, chamadas de sprints ou ciclos curtos,
que geralmente duram de 1 a 4 semanas.
- Resposta(Pergunta 3.2): Dividir o Projeto em Pequenas Tarefas (Sprints), Sprint 1: Criar o cadastro de veículos.
Sprint 2: Implementar a funcionalidade de reserva de vagas.
Sprint 3: Integrar a autenticação de usuários.
- Resposta(Pergunta 3.3): A comunicação entre as equipes em um ambiente ágil é fundamental para o sucesso do projeto.
Como as metodologias ágeis são baseadas em ciclos curtos de desenvolvimento e em entregas contínuas, a colaboração
e o alinhamento constante entre todos os membros da equipe garantem que todos estejam na mesma página, evitando
retrabalhos e problemas de integração. Alguns bons exemplos: Reuniões diárias mais conhecidas como Daily, ferramentas
de colaboração como Jira, Trello e outros.

## Obrigado!
Agradecemos sua participação no teste. Boa sorte! 😄
## 4. DevOps (Nível Básico)
- Pergunta 1: O que é DevOps e qual a sua importância para o ciclo de vida de uma aplicação?
- Pergunta 2: Descreva como você integraria práticas de DevOps no desenvolvimento desta aplicação de estacionamento.
Inclua exemplos de CI/CD.
- Pergunta 3: Cite as ferramentas que você usaria para automatizar o processo de deploy e monitoramento da aplicação.
- - -
- Resposta(Pergunta 4.1): DevOps é uma maneira de aproximar as equipes de desenvolvimento (Dev) e operações (Ops)
para que elas trabalhem juntas de forma mais integrada e ágil. No DevOps, muita coisa é automatizada, como os testes e
a implantação do código.
- Resposta(Pergunta 4.2): Integrar práticas de DevOps no desenvolvimento da aplicação de estacionamento pode acelerar
as entregas, melhorar a qualidade do código e facilitar o gerenciamento da infraestrutura. Alguns exemplos:
Automação do Build e Testes (CI - Integração Contínua), entrega contínua e monitoramento e feedback contínuo.
- Resposta(Pergunta 4.3): Algumas ferramentas que eu usaria seriam: Jenkins, GitLab CI/CD, AWS CodePipeline, CircleCI e
GitHub Actions.
Loading