From 7f9c439b711d698f82621e4ba1ddc3ea0de8e3fc Mon Sep 17 00:00:00 2001 From: alexZ7000 <78627928+alexZ7000@users.noreply.github.com> Date: Thu, 10 Oct 2024 15:11:48 -0300 Subject: [PATCH] feat: RESTful API finished, some adjutments needed --- .../core/controller/CategoryController.java | 44 +++++++++++++++- .../core/controller/ProductController.java | 51 +++++++++++++++++-- .../example/comerce/core/dto/AddressDTO.java | 5 ++ .../example/comerce/core/dto/CategoryDTO.java | 16 ++++++ .../example/comerce/core/dto/OrderDTO.java | 31 +++++++++++ .../example/comerce/core/dto/ProductDTO.java | 43 ++++++++++++++++ .../comerce/core/entities/Category.java | 5 -- .../example/comerce/core/entities/Order.java | 8 --- .../comerce/core/entities/Product.java | 16 ++++-- .../core/services/CategoryService.java | 28 ++++++++++ .../comerce/core/services/ProductService.java | 32 ++++++++++++ 11 files changed, 258 insertions(+), 21 deletions(-) diff --git a/src/main/java/com/example/comerce/core/controller/CategoryController.java b/src/main/java/com/example/comerce/core/controller/CategoryController.java index effe73e..a930578 100644 --- a/src/main/java/com/example/comerce/core/controller/CategoryController.java +++ b/src/main/java/com/example/comerce/core/controller/CategoryController.java @@ -1,10 +1,50 @@ package com.example.comerce.core.controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.example.comerce.core.dto.CategoryDTO; +import com.example.comerce.core.entities.Category; +import com.example.comerce.core.entities.Product; +import com.example.comerce.core.services.CategoryService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; @RestController @RequestMapping("/api/category") public class CategoryController { + @Autowired + private CategoryService categoryService; + + @GetMapping + public ResponseEntity> getAllCategories() { + List categories = categoryService.findAll(); + return ResponseEntity.ok(categories); + } + + @GetMapping("/{id}") + public ResponseEntity getCategoryById(@PathVariable UUID id) { + Optional category = Optional.ofNullable(categoryService.findById(id)); + return category.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity createCategory(@RequestBody CategoryDTO categoryDTO) { + Category savedCategory = categoryService.save(categoryDTO.toEntity()); + return ResponseEntity.ok(savedCategory); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteCategory(@PathVariable UUID id) { + categoryService.delete(id); + return ResponseEntity.noContent().build(); + } + @PutMapping("/{id}") + public ResponseEntity updateCategory(@PathVariable UUID id, @RequestBody CategoryDTO categoryDTO) { + Category updatedCategory = categoryService.update(id, categoryDTO.toEntity()); + return ResponseEntity.ok(updatedCategory); + } } diff --git a/src/main/java/com/example/comerce/core/controller/ProductController.java b/src/main/java/com/example/comerce/core/controller/ProductController.java index 7930ed3..bf4b5ac 100644 --- a/src/main/java/com/example/comerce/core/controller/ProductController.java +++ b/src/main/java/com/example/comerce/core/controller/ProductController.java @@ -1,10 +1,55 @@ package com.example.comerce.core.controller; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import com.example.comerce.core.dto.ProductDTO; +import com.example.comerce.core.entities.Product; +import com.example.comerce.core.services.ProductService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; @RestController -@RequestMapping("/api/product") +@RequestMapping("/api/products") public class ProductController { + @Autowired + private ProductService productService; + + @GetMapping + public ResponseEntity> getAllProducts() { + List products = productService.findAll(); + return ResponseEntity.ok(products); + } + + @GetMapping("/{id}") + public ResponseEntity getProductById(@PathVariable UUID id) { + Optional product = productService.findById(id); + return product.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + } + + @GetMapping("/products/{category}/{id}") + public ResponseEntity getProductByCategoryAndId(@PathVariable String category, @PathVariable UUID id) { + Optional product = productService.findById(id); + return product.map(ResponseEntity::ok).orElseGet(() -> ResponseEntity.notFound().build()); + } + + @PostMapping + public ResponseEntity createProduct(@RequestBody ProductDTO productDTO) { + Product savedProduct = productService.save(productDTO); + return ResponseEntity.ok(savedProduct); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteProduct(@PathVariable UUID id) { + productService.delete(id); + return ResponseEntity.noContent().build(); + } + @PutMapping("/{id}") + public ResponseEntity updateProduct(@PathVariable UUID id, @RequestBody ProductDTO productDTO) { + Product updatedProduct = productService.update(id, productDTO); + return ResponseEntity.ok(updatedProduct); + } } diff --git a/src/main/java/com/example/comerce/core/dto/AddressDTO.java b/src/main/java/com/example/comerce/core/dto/AddressDTO.java index 8d2bd18..aabbb4d 100644 --- a/src/main/java/com/example/comerce/core/dto/AddressDTO.java +++ b/src/main/java/com/example/comerce/core/dto/AddressDTO.java @@ -20,6 +20,9 @@ public class AddressDTO { @NotBlank(message = "Bairro não pode estar em branco") private String neighborhood; + @NotBlank(message = "Complemento não pode estar em branco") + private String complement; + @NotBlank(message = "Cidade não pode estar em branco") private String city; @@ -31,6 +34,7 @@ public Address toEntity() { address.setPostal_code(this.postal_code); address.setStreet(this.street); address.setNumber(this.number); + address.setComplement(this.complement); address.setNeighborhood(this.neighborhood); address.setCity(this.city); address.setState(this.state); @@ -42,6 +46,7 @@ public static AddressDTO toDTO(Address address) { addressDTO.setPostal_code(address.getPostal_code()); addressDTO.setStreet(address.getStreet()); addressDTO.setNumber(address.getNumber()); + addressDTO.setComplement(address.getComplement()); addressDTO.setNeighborhood(address.getNeighborhood()); addressDTO.setCity(address.getCity()); addressDTO.setState(address.getState()); diff --git a/src/main/java/com/example/comerce/core/dto/CategoryDTO.java b/src/main/java/com/example/comerce/core/dto/CategoryDTO.java index 0961987..93fbc50 100644 --- a/src/main/java/com/example/comerce/core/dto/CategoryDTO.java +++ b/src/main/java/com/example/comerce/core/dto/CategoryDTO.java @@ -1,5 +1,7 @@ package com.example.comerce.core.dto; +import com.example.comerce.core.entities.Category; +import jakarta.validation.constraints.Size; import lombok.Getter; import lombok.Setter; @@ -7,4 +9,18 @@ @Setter public class CategoryDTO { + @Size(min = 10, max = 255, message = "A descrição da categoria deve ter entre 10 e 255 caracteres") + private String description; + + public Category toEntity() { + Category category = new Category(); + category.setDescription(this.description); + return category; + } + + public static CategoryDTO toDTO(CategoryDTO category) { + CategoryDTO categoryDTO = new CategoryDTO(); + categoryDTO.setDescription(category.getDescription()); + return categoryDTO; + } } diff --git a/src/main/java/com/example/comerce/core/dto/OrderDTO.java b/src/main/java/com/example/comerce/core/dto/OrderDTO.java index 6911fa6..30a3d6c 100644 --- a/src/main/java/com/example/comerce/core/dto/OrderDTO.java +++ b/src/main/java/com/example/comerce/core/dto/OrderDTO.java @@ -1,10 +1,41 @@ package com.example.comerce.core.dto; +import com.example.comerce.core.entities.Order; +import jakarta.validation.constraints.FutureOrPresent; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Positive; import lombok.Getter; import lombok.Setter; +import java.util.Date; + @Getter @Setter public class OrderDTO { + @NotNull(message = "Data do pedido não pode ser null") + @FutureOrPresent(message = "Data do pedido deve ser no presente ou no futuro") + private Date date; + + @Positive(message = "O desconto deve ser um valor positivo") + private double discount; + + @Positive(message = "O valor total deve ser um valor positivo") + private double total_price; + + public Order toEntity() { + Order order = new Order(); + order.setDate(this.date); + order.setDiscount(this.discount); + order.setDiscount(this.total_price); + return order; + } + + public static OrderDTO toDTO(OrderDTO order) { + OrderDTO orderDTO = new OrderDTO(); + orderDTO.setDate(order.getDate()); + orderDTO.setDiscount(order.getDiscount()); + orderDTO.setTotal_price(order.getDiscount()); + return orderDTO; + } } diff --git a/src/main/java/com/example/comerce/core/dto/ProductDTO.java b/src/main/java/com/example/comerce/core/dto/ProductDTO.java index 9b21532..d98bf03 100644 --- a/src/main/java/com/example/comerce/core/dto/ProductDTO.java +++ b/src/main/java/com/example/comerce/core/dto/ProductDTO.java @@ -1,10 +1,53 @@ package com.example.comerce.core.dto; +import com.example.comerce.core.entities.Product; +import jakarta.validation.constraints.*; import lombok.Getter; import lombok.Setter; +import java.util.Date; + @Getter @Setter public class ProductDTO { + @NotBlank(message = "O nome do produto não pode estar em branco") + private String name; + + @Positive(message = "A quantidade em estoque deve ser positiva") + private int stock_quantity; + + @PositiveOrZero(message = "O preço de custo do produto deve ser zero ou positivo") + private double cost_price; + + @PositiveOrZero(message = "O preço de venda do produto deve ser zero ou positivo") + private double sell_price; + + @FutureOrPresent(message = "A data de criação do produto deve ser no presente ou no futuro") + private Date created_at; + + @PositiveOrZero(message = "O preço do produto deve ser zero ou positivo") + private double price; + + public Product toEntity() { + Product product = new Product(); + product.setName(this.name); + product.setStock_quantity(this.stock_quantity); + product.setCost_price(this.cost_price); + product.setSell_price(this.sell_price); + product.setCreated_at(this.created_at); + product.setPrice(this.price); + return product; + } + + public static ProductDTO toDTO(ProductDTO product) { + ProductDTO productDTO = new ProductDTO(); + productDTO.setName(product.getName()); + productDTO.setStock_quantity(product.getStock_quantity()); + productDTO.setCost_price(product.getCost_price()); + productDTO.setSell_price(product.getSell_price()); + productDTO.setCreated_at(product.getCreated_at()); + productDTO.setPrice(product.getPrice()); + return productDTO; + } } diff --git a/src/main/java/com/example/comerce/core/entities/Category.java b/src/main/java/com/example/comerce/core/entities/Category.java index f61cef6..d24ae1a 100644 --- a/src/main/java/com/example/comerce/core/entities/Category.java +++ b/src/main/java/com/example/comerce/core/entities/Category.java @@ -1,11 +1,8 @@ package com.example.comerce.core.entities; import jakarta.persistence.*; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Size; import lombok.Getter; import lombok.Setter; -import lombok.Singular; import java.util.Set; import java.util.UUID; @@ -19,11 +16,9 @@ public class Category { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "category_id", nullable = false, unique = true, updatable = false, length = 36) - @NotNull(message = "Category ID não pode ser null") private UUID category_id; @Column - @Size(min = 10, max = 255, message = "A descrição da categoria deve ter entre 10 e 255 caracteres") private String description; @ManyToMany(mappedBy = "categories") diff --git a/src/main/java/com/example/comerce/core/entities/Order.java b/src/main/java/com/example/comerce/core/entities/Order.java index 776f11b..bedee9e 100644 --- a/src/main/java/com/example/comerce/core/entities/Order.java +++ b/src/main/java/com/example/comerce/core/entities/Order.java @@ -1,9 +1,6 @@ package com.example.comerce.core.entities; import jakarta.persistence.*; -import jakarta.validation.constraints.FutureOrPresent; -import jakarta.validation.constraints.NotNull; -import jakarta.validation.constraints.Positive; import lombok.Getter; import lombok.Setter; @@ -19,7 +16,6 @@ public class Order { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "order_id", nullable = false, unique = true, updatable = false, length = 36) - @NotNull(message = "Order ID não pode ser null") private UUID order_id; @ManyToOne @@ -27,16 +23,12 @@ public class Order { private User user; @Column(nullable = false) - @NotNull(message = "Data do pedido não pode ser null") - @FutureOrPresent(message = "Data do pedido deve ser no presente ou no futuro") private Date date; @Column - @Positive(message = "O desconto deve ser um valor positivo") private double discount; @Column(nullable = false) - @Positive(message = "O valor total deve ser um valor positivo") private double total_price; @OneToMany(mappedBy = "order", cascade = CascadeType.ALL) diff --git a/src/main/java/com/example/comerce/core/entities/Product.java b/src/main/java/com/example/comerce/core/entities/Product.java index 6ee835b..44b5df6 100644 --- a/src/main/java/com/example/comerce/core/entities/Product.java +++ b/src/main/java/com/example/comerce/core/entities/Product.java @@ -6,6 +6,7 @@ import lombok.Getter; import lombok.Setter; +import java.util.Date; import java.util.List; import java.util.Set; import java.util.UUID; @@ -19,15 +20,24 @@ public class Product { @Id @GeneratedValue(strategy = GenerationType.AUTO) @Column(name = "product_id", nullable = false, unique = true, updatable = false, length = 36) - @NotNull(message = "Product ID não pode ser null") private UUID product_id; @Column(nullable = false) - @NotNull(message = "O nome do produto não pode ser null") private String name; @Column(nullable = false) - @Positive(message = "O preço do produto deve ser positivo") + private int stock_quantity; + + @Column(nullable = false) + private double cost_price; + + @Column(nullable = false) + private double sell_price; + + @Column(nullable = false) + private Date created_at; + + @Column(nullable = false) private double price; @ManyToMany diff --git a/src/main/java/com/example/comerce/core/services/CategoryService.java b/src/main/java/com/example/comerce/core/services/CategoryService.java index 3926819..d50a187 100644 --- a/src/main/java/com/example/comerce/core/services/CategoryService.java +++ b/src/main/java/com/example/comerce/core/services/CategoryService.java @@ -1,8 +1,36 @@ package com.example.comerce.core.services; +import com.example.comerce.core.entities.Category; +import com.example.comerce.core.repository.CategoryRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.UUID; + @Service public class CategoryService { + @Autowired + private CategoryRepository categoryRepository; + + public List findAll() { + return categoryRepository.findAll(); + } + + public Category save(Category category) { + return categoryRepository.save(category); + } + + public void delete(UUID categoryId) { + categoryRepository.deleteById(categoryId); + } + + public Category update(UUID categoryId, Category category) { + category.setCategory_id(categoryId); + return categoryRepository.save(category); + } + public Category findById(UUID categoryId) { + return categoryRepository.findById(categoryId).orElse(null); + } } diff --git a/src/main/java/com/example/comerce/core/services/ProductService.java b/src/main/java/com/example/comerce/core/services/ProductService.java index 5fc0708..e5558e4 100644 --- a/src/main/java/com/example/comerce/core/services/ProductService.java +++ b/src/main/java/com/example/comerce/core/services/ProductService.java @@ -1,8 +1,40 @@ package com.example.comerce.core.services; +import com.example.comerce.core.dto.ProductDTO; +import com.example.comerce.core.entities.Product; +import com.example.comerce.core.repository.ProductRepository; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; +import java.util.Optional; +import java.util.UUID; + @Service public class ProductService { + @Autowired + private ProductRepository productRepository; + + public List findAll() { + return productRepository.findAll(); + } + + public Optional findById(UUID productId) { + return productRepository.findById(productId); + } + + public Product save(ProductDTO productDTO) { + Product product = productDTO.toEntity(); + return productRepository.save(product); + } + + public void delete(UUID productId) { + productRepository.deleteById(productId); + } + public Product update(UUID productId, ProductDTO productDTO) { + Product product = productDTO.toEntity(); + product.setProduct_id(productId); + return productRepository.save(product); + } }