From 15b01f5b7a6b68164ad786107c3006b801f1970a Mon Sep 17 00:00:00 2001 From: Carlos Eduardo Rosa Portella Date: Sat, 17 Dec 2022 22:07:10 -0300 Subject: [PATCH] All tests working --- .../bds02/controllers/CityController.java | 47 +++++++++++++ .../bds02/controllers/EventController.java | 27 ++++++++ .../exceptions/ResourceExceptionHandler.java | 41 +++++++++++ .../controllers/exceptions/StandardError.java | 68 +++++++++++++++++++ .../bds02/repositories/CityRepository.java | 9 +++ .../bds02/repositories/EventRepository.java | 11 +++ .../bds02/services/CityService.java | 50 ++++++++++++++ .../bds02/services/EventService.java | 36 ++++++++++ .../exceptions/DatabaseException.java | 10 +++ .../exceptions/ResourceNotFoundException.java | 9 +++ 10 files changed, 308 insertions(+) create mode 100644 src/main/java/com/devsuperior/bds02/controllers/CityController.java create mode 100644 src/main/java/com/devsuperior/bds02/controllers/EventController.java create mode 100644 src/main/java/com/devsuperior/bds02/controllers/exceptions/ResourceExceptionHandler.java create mode 100644 src/main/java/com/devsuperior/bds02/controllers/exceptions/StandardError.java create mode 100644 src/main/java/com/devsuperior/bds02/repositories/CityRepository.java create mode 100644 src/main/java/com/devsuperior/bds02/repositories/EventRepository.java create mode 100644 src/main/java/com/devsuperior/bds02/services/CityService.java create mode 100644 src/main/java/com/devsuperior/bds02/services/EventService.java create mode 100644 src/main/java/com/devsuperior/bds02/services/exceptions/DatabaseException.java create mode 100644 src/main/java/com/devsuperior/bds02/services/exceptions/ResourceNotFoundException.java diff --git a/src/main/java/com/devsuperior/bds02/controllers/CityController.java b/src/main/java/com/devsuperior/bds02/controllers/CityController.java new file mode 100644 index 00000000..71845682 --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/controllers/CityController.java @@ -0,0 +1,47 @@ +package com.devsuperior.bds02.controllers; + +import java.net.URI; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.DeleteMapping; +import org.springframework.web.bind.annotation.GetMapping; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; +import org.springframework.web.servlet.support.ServletUriComponentsBuilder; + +import com.devsuperior.bds02.dto.CityDTO; +import com.devsuperior.bds02.services.CityService; + +@RestController +@RequestMapping(value = "/cities") +public class CityController { + + @Autowired + private CityService service; + + @GetMapping + public ResponseEntity> findAll() { + + List list = service.findAll(); + return ResponseEntity.ok().body(list); + } + + @PostMapping + public ResponseEntity insert(@RequestBody CityDTO dto) { + dto = service.insert(dto); + URI uri = ServletUriComponentsBuilder.fromCurrentRequest().path("/{id}") + .buildAndExpand(dto.getId()).toUri(); + return ResponseEntity.created(uri).body(dto); + } + + @DeleteMapping(value = "/{id}") + public ResponseEntity delete(@PathVariable Long id) { + service.delete(id); + return ResponseEntity.noContent().build(); + } +} diff --git a/src/main/java/com/devsuperior/bds02/controllers/EventController.java b/src/main/java/com/devsuperior/bds02/controllers/EventController.java new file mode 100644 index 00000000..4bee31ac --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/controllers/EventController.java @@ -0,0 +1,27 @@ +package com.devsuperior.bds02.controllers; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PathVariable; +import org.springframework.web.bind.annotation.PutMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RestController; + +import com.devsuperior.bds02.dto.EventDTO; +import com.devsuperior.bds02.services.EventService; + +@RestController +@RequestMapping(value = "/events") +public class EventController { + + @Autowired + private EventService service; + + + @PutMapping(value = "/{id}") + public ResponseEntity update(@PathVariable Long id, @RequestBody EventDTO dto) { + dto = service.update(id, dto); + return ResponseEntity.ok().body(dto); + } +} diff --git a/src/main/java/com/devsuperior/bds02/controllers/exceptions/ResourceExceptionHandler.java b/src/main/java/com/devsuperior/bds02/controllers/exceptions/ResourceExceptionHandler.java new file mode 100644 index 00000000..879d5cfd --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/controllers/exceptions/ResourceExceptionHandler.java @@ -0,0 +1,41 @@ +package com.devsuperior.bds02.controllers.exceptions; + +import java.time.Instant; + +import javax.servlet.http.HttpServletRequest; + +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.ControllerAdvice; +import org.springframework.web.bind.annotation.ExceptionHandler; + +import com.devsuperior.bds02.services.exceptions.DatabaseException; +import com.devsuperior.bds02.services.exceptions.ResourceNotFoundException; + +@ControllerAdvice +public class ResourceExceptionHandler { + + @ExceptionHandler(ResourceNotFoundException.class) + public ResponseEntity entityNotFound(ResourceNotFoundException e, HttpServletRequest request){ + HttpStatus status = HttpStatus.NOT_FOUND; + StandardError err = new StandardError(); + err.setTimestamp(Instant.now()); + err.setStatus(status.value()); + err.setError("Resource not found"); + err.setMessage(e.getMessage()); + err.setPath(request.getRequestURI()); + return ResponseEntity.status(status).body(err); + } + + @ExceptionHandler(DatabaseException.class) + public ResponseEntity database(DatabaseException e, HttpServletRequest request){ + HttpStatus status = HttpStatus.BAD_REQUEST; + StandardError err = new StandardError(); + err.setTimestamp(Instant.now()); + err.setStatus(status.value()); + err.setError("Database Exception"); + err.setMessage(e.getMessage()); + err.setPath(request.getRequestURI()); + return ResponseEntity.status(status).body(err); + } +} diff --git a/src/main/java/com/devsuperior/bds02/controllers/exceptions/StandardError.java b/src/main/java/com/devsuperior/bds02/controllers/exceptions/StandardError.java new file mode 100644 index 00000000..f02e06b1 --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/controllers/exceptions/StandardError.java @@ -0,0 +1,68 @@ +package com.devsuperior.bds02.controllers.exceptions; + +import java.io.Serializable; +import java.time.Instant; + +public class StandardError implements Serializable{ + + private static final long serialVersionUID = 1L; + private Instant timestamp; + private Integer status; + private String error; + private String message; + private String path; + + public StandardError() { + } + + public StandardError(Instant timestamp, Integer status, String error, String message, String path) { + this.timestamp = timestamp; + this.status = status; + this.error = error; + this.message = message; + this.path = path; + } + + public Instant getTimestamp() { + return timestamp; + } + + public void setTimestamp(Instant timestamp) { + this.timestamp = timestamp; + } + + public Integer getStatus() { + return status; + } + + public void setStatus(Integer status) { + this.status = status; + } + + public String getError() { + return error; + } + + public void setError(String error) { + this.error = error; + } + + public String getMessage() { + return message; + } + + public void setMessage(String message) { + this.message = message; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + + +} diff --git a/src/main/java/com/devsuperior/bds02/repositories/CityRepository.java b/src/main/java/com/devsuperior/bds02/repositories/CityRepository.java new file mode 100644 index 00000000..9fa822ef --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/repositories/CityRepository.java @@ -0,0 +1,9 @@ +package com.devsuperior.bds02.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; + +import com.devsuperior.bds02.entities.City; + +public interface CityRepository extends JpaRepository { + +} diff --git a/src/main/java/com/devsuperior/bds02/repositories/EventRepository.java b/src/main/java/com/devsuperior/bds02/repositories/EventRepository.java new file mode 100644 index 00000000..21458977 --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/repositories/EventRepository.java @@ -0,0 +1,11 @@ +package com.devsuperior.bds02.repositories; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import com.devsuperior.bds02.entities.Event; + +@Repository +public interface EventRepository extends JpaRepository { + +} diff --git a/src/main/java/com/devsuperior/bds02/services/CityService.java b/src/main/java/com/devsuperior/bds02/services/CityService.java new file mode 100644 index 00000000..4eee727f --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/services/CityService.java @@ -0,0 +1,50 @@ +package com.devsuperior.bds02.services; + +import java.util.List; +import java.util.stream.Collectors; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.dao.DataIntegrityViolationException; +import org.springframework.dao.EmptyResultDataAccessException; +import org.springframework.data.domain.Sort; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.devsuperior.bds02.dto.CityDTO; +import com.devsuperior.bds02.entities.City; +import com.devsuperior.bds02.repositories.CityRepository; +import com.devsuperior.bds02.services.exceptions.DatabaseException; +import com.devsuperior.bds02.services.exceptions.ResourceNotFoundException; + +@Service +public class CityService { + + @Autowired + private CityRepository repository; + + @Transactional + public List findAll() { + List list = repository.findAll(Sort.by("name")); + return list.stream().map(x -> new CityDTO(x)).collect(Collectors.toList()); + } + + @Transactional + public CityDTO insert(CityDTO dto) { + City entity = new City(); + entity.setName(dto.getName()); + entity = repository.save(entity); + return new CityDTO(entity); + } + + + public void delete(Long id) { + try { + repository.deleteById(id); + } catch(EmptyResultDataAccessException e) { + throw new ResourceNotFoundException("Id not found " + id); + } catch(DataIntegrityViolationException e) { + throw new DatabaseException("Integrity violation"); + } + } + +} diff --git a/src/main/java/com/devsuperior/bds02/services/EventService.java b/src/main/java/com/devsuperior/bds02/services/EventService.java new file mode 100644 index 00000000..71a66ebb --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/services/EventService.java @@ -0,0 +1,36 @@ +package com.devsuperior.bds02.services; + +import javax.persistence.EntityNotFoundException; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import com.devsuperior.bds02.dto.EventDTO; +import com.devsuperior.bds02.entities.City; +import com.devsuperior.bds02.entities.Event; +import com.devsuperior.bds02.repositories.EventRepository; +import com.devsuperior.bds02.services.exceptions.ResourceNotFoundException; + +@Service +public class EventService { + + @Autowired + private EventRepository repository; + + @Transactional + public EventDTO update(Long id, EventDTO dto) { + try { + Event entity = repository.getOne(id); + entity.setName(dto.getName()); + entity.setDate(dto.getDate()); + entity.setUrl(dto.getUrl()); + entity.setCity(new City(dto.getCityId(), null)); + entity = repository.save(entity); + return new EventDTO(entity); + } catch (EntityNotFoundException e) { + throw new ResourceNotFoundException("Id not found " + id); + } + } + +} diff --git a/src/main/java/com/devsuperior/bds02/services/exceptions/DatabaseException.java b/src/main/java/com/devsuperior/bds02/services/exceptions/DatabaseException.java new file mode 100644 index 00000000..fd59971b --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/services/exceptions/DatabaseException.java @@ -0,0 +1,10 @@ +package com.devsuperior.bds02.services.exceptions; + +public class DatabaseException extends RuntimeException{ + + private static final long serialVersionUID = 1L; + + public DatabaseException(String msg) { + super(msg); + } +} diff --git a/src/main/java/com/devsuperior/bds02/services/exceptions/ResourceNotFoundException.java b/src/main/java/com/devsuperior/bds02/services/exceptions/ResourceNotFoundException.java new file mode 100644 index 00000000..08e4d8b6 --- /dev/null +++ b/src/main/java/com/devsuperior/bds02/services/exceptions/ResourceNotFoundException.java @@ -0,0 +1,9 @@ +package com.devsuperior.bds02.services.exceptions; + +public class ResourceNotFoundException extends RuntimeException { + private static final long serialVersionUID = 1L; + + public ResourceNotFoundException(String msg) { + super(msg); + } +}