Iza Car
Backend
Simples como viajar
A Iza Car é uma empresa que proporciona o aluguel de veículos aos seus usuários, sem burocracia. Assim como o slogan diz, simples como viajar. Promove uma experiência única aos seus clientes através das locações para que estes se sintam satisfeitos e excedam suas expectativas.
Este projeto é uma demonstração teórica e prática no que se refere a desenvolvimento de softwares corporativos abordando a linguagem Java e suas tecnologias e frameworks.
Pré-requisitos
- Noções de UML
- Noções de Git e Git Hub
- Noções de Banco de dados
- Noções de Maven
- Noções de JUnit
- Noções de JPA e Hibernate
- Noções de Spring Boot
- Fundamentos e recursos da linguagem Java, Essential
Ferramentas
- Design UML
- Postgres ou similar
- DBeaver
- IntelliJ ou similar
- Github desktop
Expert
- Segurança com Spring Security
- Padrões de Projetos Design Pattern
- Domain-Driven Design DDD
- Deploy com Railway Cloud
Vídeos
Aula 14 - Obtenha parte do código clicando aqui.
Aula 26 - O conteúdo deste vídeo não possui áudio
application.properties
spring.application.name=iza-car-api
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.format_sql=false
spring.datasource.url=jdbc:postgresql://localhost:5432/izacar_db
spring.datasource.username=postgres
spring.datasource.password=postgres
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=update
Código Aula 14
import org.springframework.cglib.proxy.UndeclaredThrowableException;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.context.request.WebRequest;
import org.springframework.web.servlet.mvc.method.annotation.ResponseEntityExceptionHandler;
import tec.iza.car.infra.business.BusinessException;
import tec.iza.car.infra.http.Response;
import tec.iza.car.infra.http.ResponseFactory;
@RestControllerAdvice
public class GlobalExceptionHandler extends ResponseEntityExceptionHandler {
@ExceptionHandler(Exception.class)
private ResponseEntity<Object> handleGeneral(Exception e, WebRequest request) {
String message = "";
if (e.getClass().isAssignableFrom(UndeclaredThrowableException.class)) {
UndeclaredThrowableException exception = (UndeclaredThrowableException) e;
Class<? extends Throwable> exceptionClass = exception.getUndeclaredThrowable().getClass();
return handleBusinessException((BusinessException) exception.getUndeclaredThrowable(), request);
} else {
BusinessMessage be = BusinessMessage.E501;
Response error = ResponseFactory.error(Integer.valueOf(HttpStatus.INTERNAL_SERVER_ERROR.value()), be.getMessage().concat(message), be.getSuggestion());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
return handleExceptionInternal(e, error, headers, HttpStatus.INTERNAL_SERVER_ERROR, request);
}
}
@ExceptionHandler({BusinessException.class})
private ResponseEntity<Object> handleBusinessException(BusinessException be, WebRequest request) {
Response error = ResponseFactory.error(be.getId(), be.getMessage(), be.getSuggestion());
HttpHeaders headers = new HttpHeaders();
headers.setContentType(MediaType.APPLICATION_JSON);
ResponseEntity response = handleExceptionInternal(be, error, headers, HttpStatus.resolve(be.getHttpStatus()), request);
return response;
}
}
Código Template
Ao longo do seu envolvimento com implementações de funcionalidades de qualquer projeto de negócio, você perceberá uma singularidade e modelo de desenvolvimento.
Abaixo, segue uma das abordagens muito utilizadas em projetos do dia-a-dia seguindo as representações como:
Entity
, DTO
, Request
, Response
, Repository
, Service
, Controller
e etc.package tec.iza.car.model.marca;
import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Data;
import lombok.Getter;
import lombok.Setter;
@Entity
@Table(name = "tab_marca")
@Data
public class MarcaEntity {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Setter(AccessLevel.NONE)
private Integer id;
@Column(nullable = false, length = 30)
private String nome;
@Column(nullable = true)
private boolean excluido;
}
package tec.iza.car.repository;
import org.springframework.data.jpa.repository.JpaRepository;
import tec.iza.car.model.marca.MarcaEntity;
import java.util.List;
public interface MarcaRepository extends JpaRepository <MarcaEntity, Integer> {
List<MarcaEntity> findByExcluidoFalse();
}