From 4bc256a65dc3ff7e27f60f4f757a1a202394b35d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Di=C3=AAgo=20de=20Barros?= Date: Sat, 28 Mar 2026 16:30:28 -0300 Subject: [PATCH 1/5] chore(docker): set up development environment with Docker Compose, PostgreSQL, RabbitMQ, and Spring Boot --- .idea/workspace.xml | 70 ++++++++++++++++- Dockerfile | 10 +++ docker-compose.yml | 77 +++++++++++++++++++ pom.xml | 4 +- src/main/resources/application.dev.properties | 15 ++++ src/main/resources/application.properties | 18 ++--- 6 files changed, 182 insertions(+), 12 deletions(-) create mode 100644 Dockerfile create mode 100644 docker-compose.yml create mode 100644 src/main/resources/application.dev.properties diff --git a/.idea/workspace.xml b/.idea/workspace.xml index 1ac928b..5afaaf4 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,4 +1,72 @@ - {} + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 1774725312415 + + + \ No newline at end of file diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..21a13e9 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,10 @@ +FROM eclipse-temurin:21-jdk-alpine + +WORKDIR /app + +COPY pom.xml . +RUN apk add --no-cache maven && mvn dependency:go-offline -B + +COPY src src + +CMD ["mvn", "spring-boot:run", "-Dspring-boot.run.profiles=docker"] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..ef16da4 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,77 @@ +version: '3.8' + +services: + postgres: + image: postgres:15 + container_name: orderflow-postgres + environment: + POSTGRES_DB: orderflow + POSTGRES_USER: orderflow + POSTGRES_PASSWORD: orderflow123 + ports: + - "5432:5432" + volumes: + - postgres_data:/var/lib/postgresql/data + networks: + - orderflow-network + healthcheck: + test: ["CMD-SHELL", "pg_isready -U orderflow"] + interval: 10s + timeout: 5s + retries: 5 + + rabbitmq: + image: rabbitmq:3-management + container_name: orderflow-rabbitmq + environment: + RABBITMQ_DEFAULT_USER: orderflow + RABBITMQ_DEFAULT_PASS: orderflow123 + ports: + - "5672:5672" + - "15672:15672" + volumes: + - rabbitmq_data:/var/lib/rabbitmq + networks: + - orderflow-network + healthcheck: + test: ["CMD", "rabbitmq-diagnostics", "ping"] + interval: 10s + timeout: 5s + retries: 5 + + app: + build: + context: . + dockerfile: Dockerfile + container_name: orderflow-app + environment: + SPRING_PROFILES_ACTIVE: docker + SPRING_DATASOURCE_URL: jdbc:postgresql://postgres:5432/orderflow + SPRING_DATASOURCE_USERNAME: orderflow + SPRING_DATASOURCE_PASSWORD: orderflow123 + SPRING_RABBITMQ_HOST: rabbitmq + SPRING_RABBITMQ_PORT: 5672 + SPRING_RABBITMQ_USERNAME: orderflow + SPRING_RABBITMQ_PASSWORD: orderflow123 + ports: + - "8080:8080" + volumes: + - ./src:/app/src # <-- código fonte sincronizado + - ./pom.xml:/app/pom.xml # <-- pom sincronizado + - maven-repo:/root/.m2 # <-- cache das dependências + depends_on: + postgres: + condition: service_healthy + rabbitmq: + condition: service_healthy + networks: + - orderflow-network + +volumes: + postgres_data: + rabbitmq_data: + maven-repo: + +networks: + orderflow-network: + driver: bridge \ No newline at end of file diff --git a/pom.xml b/pom.xml index 064182a..f04a0d3 100644 --- a/pom.xml +++ b/pom.xml @@ -32,8 +32,8 @@ - com.h2database - h2 + org.postgresql + postgresql runtime diff --git a/src/main/resources/application.dev.properties b/src/main/resources/application.dev.properties new file mode 100644 index 0000000..57ded54 --- /dev/null +++ b/src/main/resources/application.dev.properties @@ -0,0 +1,15 @@ +spring.profiles.active=dev + +spring.datasource.url=jdbc:postgresql://postgres:5432/orderflow +spring.datasource.username=orderflow +spring.datasource.password=orderflow123 +spring.datasource.driver-class-name=org.postgresql.Driver + +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect + +spring.rabbitmq.host=rabbitmq +spring.rabbitmq.port=5672 +spring.rabbitmq.username=orderflow +spring.rabbitmq.password=orderflow123 \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f780901..b03a5ad 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,13 +1,13 @@ -# H2 Database -spring.datasource.url=jdbc:h2:mem:orderflowdb -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password= +spring.datasource.url=jdbc:postgresql://postgres:5432/orderflow +spring.datasource.username=orderflow +spring.datasource.password=orderflow123 +spring.datasource.driver-class-name=org.postgresql.Driver -# JPA -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.h2.console.enabled=true -spring.h2.console.path=/h2-console \ No newline at end of file +spring.rabbitmq.host=rabbitmq +spring.rabbitmq.port=5672 +spring.rabbitmq.username=orderflow +spring.rabbitmq.password=orderflow123 \ No newline at end of file From 8f84ff2e6162344c2b16ee93756919e0be9058ec Mon Sep 17 00:00:00 2001 From: gio448 Date: Sat, 28 Mar 2026 21:09:07 -0300 Subject: [PATCH 2/5] feat: add cart models and repositories for ecommerce flow --- .../ecommerce/controllers/CartController.java | 47 +++++++++++++++++++ .../orderflow/ecommerce/entities/Cart.java | 35 ++++++++++++++ .../ecommerce/entities/CartItem.java | 31 ++++++++++++ .../repositories/CartItemRepository.java | 9 ++++ .../repositories/CartRepository.java | 9 ++++ src/main/resources/application.properties | 4 +- 6 files changed, 133 insertions(+), 2 deletions(-) create mode 100644 src/main/java/com/orderflow/ecommerce/controllers/CartController.java create mode 100644 src/main/java/com/orderflow/ecommerce/entities/Cart.java create mode 100644 src/main/java/com/orderflow/ecommerce/entities/CartItem.java create mode 100644 src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java create mode 100644 src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java diff --git a/src/main/java/com/orderflow/ecommerce/controllers/CartController.java b/src/main/java/com/orderflow/ecommerce/controllers/CartController.java new file mode 100644 index 0000000..2e0a81b --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/controllers/CartController.java @@ -0,0 +1,47 @@ +package com.orderflow.ecommerce.controllers; + +import com.orderflow.ecommerce.entities.CartItem; +import com.orderflow.ecommerce.repositories.CartRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +import static org.springframework.data.jpa.domain.AbstractPersistable_.id; + +@RestController +@RequestMapping("/api/cart") +public class CartController { + + @Autowired + private CartRepository repository; + + @GetMapping + public List listCart() { + return repository.findAll(); + } + + @PostMapping + public CartItem addItem(@RequestBody CartItem item) { + return repository.save(item); + } + + @DeleteMapping("/{id}") + public void removeItem(@PathVariable Long id) { + repository.deleteById(id); + } + + @PutMapping("/{id}") + public CartItem updateItem(@PathVariable Long id, @RequestBody CartItem itemDetails) { + CartItem item = repository.findById(id) + .orElseThrow(() -> new RuntimeException("Item não encontrado com id: " + id)); + + item.setQuantity(itemDetails.getQuantity()); + return repository.save(item); + } + + @DeleteMapping("/clear") + public void clearCart() { + repository.deleteAll(); + } +} diff --git a/src/main/java/com/orderflow/ecommerce/entities/Cart.java b/src/main/java/com/orderflow/ecommerce/entities/Cart.java new file mode 100644 index 0000000..4ac60a4 --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/entities/Cart.java @@ -0,0 +1,35 @@ +package com.orderflow.ecommerce.entities; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import lombok.NoArgsConstructor; +import lombok.AllArgsConstructor; +import lombok.EqualsAndHashCode; +import java.io.Serial; +import java.io.Serializable; +import java.time.Instant; +import java.util.ArrayList; +import java.util.List; +import java.util.Objects; + +@Entity +@Table(name = "tb_cart") +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +public class Cart implements Serializable { + @Serial + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @EqualsAndHashCode.Include + private Long id; + + private Instant createdAt = Instant.now(); + + @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL) + private List items = new ArrayList<>(); +} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/entities/CartItem.java b/src/main/java/com/orderflow/ecommerce/entities/CartItem.java new file mode 100644 index 0000000..9c0173a --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/entities/CartItem.java @@ -0,0 +1,31 @@ +package com.orderflow.ecommerce.entities; + +import jakarta.persistence.*; +import lombok.*; +import java.io.Serializable; + +@Entity +@Table(name = "tb_cart_item") +@Getter @Setter +@NoArgsConstructor +@AllArgsConstructor +@EqualsAndHashCode(onlyExplicitlyIncluded = true) +public class CartItem implements Serializable { + private static final long serialVersionUID = 1L; + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @EqualsAndHashCode.Include + private Long id; + + private Integer quantity; + private Double price; + + @ManyToOne + @JoinColumn(name = "cart_id") + private Cart cart; + + @ManyToOne + @JoinColumn(name = "product_id") + private Product product; +} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java b/src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java new file mode 100644 index 0000000..43bc50e --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java @@ -0,0 +1,9 @@ +package com.orderflow.ecommerce.repositories; + +import com.orderflow.ecommerce.entities.CartItem; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CartItemRepository extends JpaRepository { +} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java b/src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java new file mode 100644 index 0000000..04bffdf --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java @@ -0,0 +1,9 @@ +package com.orderflow.ecommerce.repositories; + +import com.orderflow.ecommerce.entities.CartItem; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +@Repository +public interface CartRepository extends JpaRepository { +} diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index b03a5ad..84ba200 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,4 +1,4 @@ -spring.datasource.url=jdbc:postgresql://postgres:5432/orderflow +spring.datasource.url=jdbc:postgresql://localhost:5432/orderflow spring.datasource.username=orderflow spring.datasource.password=orderflow123 spring.datasource.driver-class-name=org.postgresql.Driver @@ -7,7 +7,7 @@ spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.rabbitmq.host=rabbitmq +spring.rabbitmq.host=localhost spring.rabbitmq.port=5672 spring.rabbitmq.username=orderflow spring.rabbitmq.password=orderflow123 \ No newline at end of file From a39c8502c9f9ffb6155ccea67aab98ccda156c63 Mon Sep 17 00:00:00 2001 From: gio448 Date: Wed, 1 Apr 2026 21:34:12 -0300 Subject: [PATCH 3/5] feat: complete user crud and database integration with postgresql --- .../ecommerce/controllers/CartController.java | 47 --------------- .../controllers/CategoryController.java | 53 ----------------- .../controllers/ProductController.java | 53 ----------------- .../ecommerce/controllers/UserController.java | 46 +++++++++++++++ .../ecommerce/dtos/UserRequestDTO.java | 4 ++ .../orderflow/ecommerce/entities/Cart.java | 35 ------------ .../ecommerce/entities/CartItem.java | 31 ---------- .../ecommerce/entities/Category.java | 20 ------- .../orderflow/ecommerce/entities/Product.java | 33 ----------- .../orderflow/ecommerce/entities/User.java | 26 +++++++++ .../repositories/CartItemRepository.java | 9 --- .../repositories/CartRepository.java | 9 --- .../repositories/CategoryRepository.java | 9 --- .../repositories/ProductRepository.java | 9 --- .../repositories/UserRepository.java | 12 ++++ .../ecommerce/services/UserService.java | 57 +++++++++++++++++++ src/main/resources/application.properties | 15 ++--- 17 files changed, 151 insertions(+), 317 deletions(-) delete mode 100644 src/main/java/com/orderflow/ecommerce/controllers/CartController.java delete mode 100644 src/main/java/com/orderflow/ecommerce/controllers/CategoryController.java delete mode 100644 src/main/java/com/orderflow/ecommerce/controllers/ProductController.java create mode 100644 src/main/java/com/orderflow/ecommerce/controllers/UserController.java create mode 100644 src/main/java/com/orderflow/ecommerce/dtos/UserRequestDTO.java delete mode 100644 src/main/java/com/orderflow/ecommerce/entities/Cart.java delete mode 100644 src/main/java/com/orderflow/ecommerce/entities/CartItem.java delete mode 100644 src/main/java/com/orderflow/ecommerce/entities/Category.java delete mode 100644 src/main/java/com/orderflow/ecommerce/entities/Product.java create mode 100644 src/main/java/com/orderflow/ecommerce/entities/User.java delete mode 100644 src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java delete mode 100644 src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java delete mode 100644 src/main/java/com/orderflow/ecommerce/repositories/CategoryRepository.java delete mode 100644 src/main/java/com/orderflow/ecommerce/repositories/ProductRepository.java create mode 100644 src/main/java/com/orderflow/ecommerce/repositories/UserRepository.java create mode 100644 src/main/java/com/orderflow/ecommerce/services/UserService.java diff --git a/src/main/java/com/orderflow/ecommerce/controllers/CartController.java b/src/main/java/com/orderflow/ecommerce/controllers/CartController.java deleted file mode 100644 index 2e0a81b..0000000 --- a/src/main/java/com/orderflow/ecommerce/controllers/CartController.java +++ /dev/null @@ -1,47 +0,0 @@ -package com.orderflow.ecommerce.controllers; - -import com.orderflow.ecommerce.entities.CartItem; -import com.orderflow.ecommerce.repositories.CartRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -import static org.springframework.data.jpa.domain.AbstractPersistable_.id; - -@RestController -@RequestMapping("/api/cart") -public class CartController { - - @Autowired - private CartRepository repository; - - @GetMapping - public List listCart() { - return repository.findAll(); - } - - @PostMapping - public CartItem addItem(@RequestBody CartItem item) { - return repository.save(item); - } - - @DeleteMapping("/{id}") - public void removeItem(@PathVariable Long id) { - repository.deleteById(id); - } - - @PutMapping("/{id}") - public CartItem updateItem(@PathVariable Long id, @RequestBody CartItem itemDetails) { - CartItem item = repository.findById(id) - .orElseThrow(() -> new RuntimeException("Item não encontrado com id: " + id)); - - item.setQuantity(itemDetails.getQuantity()); - return repository.save(item); - } - - @DeleteMapping("/clear") - public void clearCart() { - repository.deleteAll(); - } -} diff --git a/src/main/java/com/orderflow/ecommerce/controllers/CategoryController.java b/src/main/java/com/orderflow/ecommerce/controllers/CategoryController.java deleted file mode 100644 index 7d1292d..0000000 --- a/src/main/java/com/orderflow/ecommerce/controllers/CategoryController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.orderflow.ecommerce.controllers; - -import com.orderflow.ecommerce.entities.Category; -import com.orderflow.ecommerce.repositories.CategoryRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping(value = "/categories") -public class CategoryController { - - @Autowired - private CategoryRepository repository; - - @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok().body(repository.findAll()); - } - - @GetMapping(value = "/{id}") - public ResponseEntity findById(@PathVariable Long id) { - - - return repository.findById(id) - .map(obj -> ResponseEntity.ok().body(obj)) - .orElse(ResponseEntity.notFound().build()); - } - - @PostMapping - public ResponseEntity insert(@RequestBody Category obj) { - return ResponseEntity.ok().body(repository.save(obj)); - } - - @DeleteMapping(value = "/{id}") - public ResponseEntity delete(@PathVariable Long id) { - repository.deleteById(id); - return ResponseEntity.noContent().build(); - } - - @PutMapping(value = "/{id}") - public ResponseEntity update(@PathVariable Long id, @RequestBody Category obj) { - return repository.findById(id) - .map(entity -> { - entity.setName(obj.getName()); - Category updated = repository.save(entity); - return ResponseEntity.ok().body(updated); - }) - .orElse(ResponseEntity.notFound().build()); - } -} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/controllers/ProductController.java b/src/main/java/com/orderflow/ecommerce/controllers/ProductController.java deleted file mode 100644 index 8c14bb0..0000000 --- a/src/main/java/com/orderflow/ecommerce/controllers/ProductController.java +++ /dev/null @@ -1,53 +0,0 @@ -package com.orderflow.ecommerce.controllers; - -import com.orderflow.ecommerce.entities.Product; -import com.orderflow.ecommerce.repositories.ProductRepository; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; - -import java.util.List; - -@RestController -@RequestMapping(value = "/products") -public class ProductController { - - @Autowired - private ProductRepository repository; - - @GetMapping - public ResponseEntity> findAll() { - return ResponseEntity.ok().body(repository.findAll()); - } - - @GetMapping(value = "/{id}") - public ResponseEntity findById(@PathVariable Long id) { - return repository.findById(id) - .map(obj -> ResponseEntity.ok().body(obj)) - .orElse(ResponseEntity.notFound().build()); - } - - @PostMapping - public ResponseEntity insert(@RequestBody Product obj) { - return ResponseEntity.ok().body(repository.save(obj)); - } - - @DeleteMapping(value = "/{id}") - public ResponseEntity delete(@PathVariable Long id) { - repository.deleteById(id); - return ResponseEntity.noContent().build(); - } - - @PutMapping(value = "/{id}") - public ResponseEntity update(@PathVariable Long id, @RequestBody Product obj) { - Product entity = repository.findById(id).get(); - entity.setName(obj.getName()); - entity.setDescription(obj.getDescription()); - entity.setPrice(obj.getPrice()); - entity.setStockQuantity(obj.getStockQuantity()); - entity.setCategory(obj.getCategory()); - System.out.println("aavavvvv"); - return ResponseEntity.ok().body(repository.save(entity)); - - } -} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/controllers/UserController.java b/src/main/java/com/orderflow/ecommerce/controllers/UserController.java new file mode 100644 index 0000000..32a8d33 --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/controllers/UserController.java @@ -0,0 +1,46 @@ +package com.orderflow.ecommerce.controllers; + +import com.orderflow.ecommerce.dtos.UserRequestDTO; +import com.orderflow.ecommerce.services.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/users") +public class UserController { + + @Autowired + private UserService userService; + + @PostMapping + public ResponseEntity createUser(@RequestBody UserRequestDTO dto) { + UserRequestDTO savedUser = userService.create(dto); + return ResponseEntity.status(HttpStatus.CREATED).body(savedUser); + } + + @GetMapping + public ResponseEntity> getAllUsers() { + List users = userService.findAll(); + return ResponseEntity.ok(users); + } + + @GetMapping("/{id}") + public ResponseEntity getUserById(@PathVariable Long id) { + return ResponseEntity.ok(userService.findById(id)); + } + + @PutMapping("/{id}") + public ResponseEntity updateUser(@PathVariable Long id, @RequestBody UserRequestDTO dto) { + return ResponseEntity.ok(userService.update(id, dto)); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteUser(@PathVariable Long id) { + userService.delete(id); + return ResponseEntity.noContent().build(); + } +} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/dtos/UserRequestDTO.java b/src/main/java/com/orderflow/ecommerce/dtos/UserRequestDTO.java new file mode 100644 index 0000000..975623d --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/dtos/UserRequestDTO.java @@ -0,0 +1,4 @@ +package com.orderflow.ecommerce.dtos; + +public record UserRequestDTO(Long id, String name, String email, String password) { +} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/entities/Cart.java b/src/main/java/com/orderflow/ecommerce/entities/Cart.java deleted file mode 100644 index 4ac60a4..0000000 --- a/src/main/java/com/orderflow/ecommerce/entities/Cart.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.orderflow.ecommerce.entities; - -import jakarta.persistence.*; -import lombok.Getter; -import lombok.Setter; -import lombok.NoArgsConstructor; -import lombok.AllArgsConstructor; -import lombok.EqualsAndHashCode; -import java.io.Serial; -import java.io.Serializable; -import java.time.Instant; -import java.util.ArrayList; -import java.util.List; -import java.util.Objects; - -@Entity -@Table(name = "tb_cart") -@Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) -public class Cart implements Serializable { - @Serial - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @EqualsAndHashCode.Include - private Long id; - - private Instant createdAt = Instant.now(); - - @OneToMany(mappedBy = "cart", cascade = CascadeType.ALL) - private List items = new ArrayList<>(); -} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/entities/CartItem.java b/src/main/java/com/orderflow/ecommerce/entities/CartItem.java deleted file mode 100644 index 9c0173a..0000000 --- a/src/main/java/com/orderflow/ecommerce/entities/CartItem.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.orderflow.ecommerce.entities; - -import jakarta.persistence.*; -import lombok.*; -import java.io.Serializable; - -@Entity -@Table(name = "tb_cart_item") -@Getter @Setter -@NoArgsConstructor -@AllArgsConstructor -@EqualsAndHashCode(onlyExplicitlyIncluded = true) -public class CartItem implements Serializable { - private static final long serialVersionUID = 1L; - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @EqualsAndHashCode.Include - private Long id; - - private Integer quantity; - private Double price; - - @ManyToOne - @JoinColumn(name = "cart_id") - private Cart cart; - - @ManyToOne - @JoinColumn(name = "product_id") - private Product product; -} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/entities/Category.java b/src/main/java/com/orderflow/ecommerce/entities/Category.java deleted file mode 100644 index 3c08a5e..0000000 --- a/src/main/java/com/orderflow/ecommerce/entities/Category.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.orderflow.ecommerce.entities; - -import jakarta.persistence.*; -import lombok.*; - -@Entity -@Table(name = "tb_category") -@Getter @Setter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@EqualsAndHashCode(of = "id") -public class Category { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false, unique = true) - private String name; -} diff --git a/src/main/java/com/orderflow/ecommerce/entities/Product.java b/src/main/java/com/orderflow/ecommerce/entities/Product.java deleted file mode 100644 index e72b010..0000000 --- a/src/main/java/com/orderflow/ecommerce/entities/Product.java +++ /dev/null @@ -1,33 +0,0 @@ -package com.orderflow.ecommerce.entities; - -import jakarta.persistence.*; -import lombok.*; -import java.math.BigDecimal; - -@Entity -@Table(name = "tb_product") -@Getter @Setter -@NoArgsConstructor(access = AccessLevel.PROTECTED) -@AllArgsConstructor -@EqualsAndHashCode(of = "id") -public class Product { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; - - @Column(nullable = false) - private String name; - - @Column(columnDefinition = "TEXT") - private String description; - - @Column(nullable = false) - private BigDecimal price; - - private Integer stockQuantity; - - @ManyToOne - @JoinColumn(name = "category_id") - private Category category; -} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/entities/User.java b/src/main/java/com/orderflow/ecommerce/entities/User.java new file mode 100644 index 0000000..30bf19b --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/entities/User.java @@ -0,0 +1,26 @@ +package com.orderflow.ecommerce.entities; + +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Data; +import lombok.NoArgsConstructor; + +@Entity +@Table(name = "tb_users") +@Data +@NoArgsConstructor +@AllArgsConstructor +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + + @Column(unique = true, nullable = false) + private String email; + + @Column(nullable = false) + private String password; +} diff --git a/src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java b/src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java deleted file mode 100644 index 43bc50e..0000000 --- a/src/main/java/com/orderflow/ecommerce/repositories/CartItemRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.orderflow.ecommerce.repositories; - -import com.orderflow.ecommerce.entities.CartItem; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CartItemRepository extends JpaRepository { -} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java b/src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java deleted file mode 100644 index 04bffdf..0000000 --- a/src/main/java/com/orderflow/ecommerce/repositories/CartRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.orderflow.ecommerce.repositories; - -import com.orderflow.ecommerce.entities.CartItem; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CartRepository extends JpaRepository { -} diff --git a/src/main/java/com/orderflow/ecommerce/repositories/CategoryRepository.java b/src/main/java/com/orderflow/ecommerce/repositories/CategoryRepository.java deleted file mode 100644 index cebc3c0..0000000 --- a/src/main/java/com/orderflow/ecommerce/repositories/CategoryRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.orderflow.ecommerce.repositories; - -import com.orderflow.ecommerce.entities.Category; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface CategoryRepository extends JpaRepository { -} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/repositories/ProductRepository.java b/src/main/java/com/orderflow/ecommerce/repositories/ProductRepository.java deleted file mode 100644 index d49a9fe..0000000 --- a/src/main/java/com/orderflow/ecommerce/repositories/ProductRepository.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.orderflow.ecommerce.repositories; - -import com.orderflow.ecommerce.entities.Product; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -@Repository -public interface ProductRepository extends JpaRepository { -} diff --git a/src/main/java/com/orderflow/ecommerce/repositories/UserRepository.java b/src/main/java/com/orderflow/ecommerce/repositories/UserRepository.java new file mode 100644 index 0000000..0f11998 --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/repositories/UserRepository.java @@ -0,0 +1,12 @@ +package com.orderflow.ecommerce.repositories; + +import com.orderflow.ecommerce.entities.User; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; +import java.util.Optional; + +@Repository +public interface UserRepository extends JpaRepository { + + Optional findByEmail(String email); +} \ No newline at end of file diff --git a/src/main/java/com/orderflow/ecommerce/services/UserService.java b/src/main/java/com/orderflow/ecommerce/services/UserService.java new file mode 100644 index 0000000..716adff --- /dev/null +++ b/src/main/java/com/orderflow/ecommerce/services/UserService.java @@ -0,0 +1,57 @@ +package com.orderflow.ecommerce.services; + +import com.orderflow.ecommerce.dtos.UserRequestDTO; +import com.orderflow.ecommerce.entities.User; +import com.orderflow.ecommerce.repositories.UserRepository; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.stream.Collectors; + +@Service +public class UserService { + + @Autowired + private UserRepository userRepository; + + public UserRequestDTO create(UserRequestDTO dto) { + User user = new User(); + user.setName(dto.name()); + user.setEmail(dto.email()); + user.setPassword(dto.password()); + + user = userRepository.save(user); + // Retornamos com o ID que o banco gerou + return new UserRequestDTO(user.getId(), user.getName(), user.getEmail(), null); + } + + public List findAll() { + return userRepository.findAll().stream().map(user -> + new UserRequestDTO(user.getId(), user.getName(), user.getEmail(), null) + ).collect(Collectors.toList()); + } + + public UserRequestDTO findById(Long id) { + User user = userRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Usuário não encontrado")); + return new UserRequestDTO(user.getId(), user.getName(), user.getEmail(), null); + } + + public UserRequestDTO update(Long id, UserRequestDTO dto) { + User user = userRepository.findById(id) + .orElseThrow(() -> new RuntimeException("Usuário não encontrado")); + + user.setName(dto.name()); + user.setEmail(dto.email()); + // Se quiser atualizar a senha também, descomente a linha abaixo: + // user.setPassword(dto.password()); + + userRepository.save(user); + return new UserRequestDTO(user.getId(), user.getName(), user.getEmail(), null); + } + + public void delete(Long id) { + userRepository.deleteById(id); + } +} \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index f780901..817efdf 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,13 +1,10 @@ -# H2 Database -spring.datasource.url=jdbc:h2:mem:orderflowdb -spring.datasource.driverClassName=org.h2.Driver -spring.datasource.username=sa -spring.datasource.password= +spring.datasource.url=jdbc:postgresql://localhost:5433/orderflow_db +spring.datasource.username=postgres +spring.datasource.password=123 +spring.datasource.driverClassName=org.postgresql.Driver -# JPA -spring.jpa.database-platform=org.hibernate.dialect.H2Dialect spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true +spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.h2.console.enabled=true -spring.h2.console.path=/h2-console \ No newline at end of file +spring.jpa.properties.hibernate.jdbc.time_zone=UTC \ No newline at end of file From 87ff915136c32190ba74082c36492eb960a16566 Mon Sep 17 00:00:00 2001 From: gio448 Date: Thu, 9 Apr 2026 16:12:36 -0300 Subject: [PATCH 4/5] Update application.properties and database connection settings --- src/main/resources/application.properties | 17 ++++++++++++----- 1 file changed, 12 insertions(+), 5 deletions(-) diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 817efdf..842455d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,10 +1,17 @@ -spring.datasource.url=jdbc:postgresql://localhost:5433/orderflow_db -spring.datasource.username=postgres -spring.datasource.password=123 -spring.datasource.driverClassName=org.postgresql.Driver +spring.datasource.url=jdbc:postgresql://postgres:5432/orderflow +spring.datasource.username=orderflow +spring.datasource.password=orderflow123 +spring.datasource.driver-class-name=org.postgresql.Driver spring.jpa.hibernate.ddl-auto=update spring.jpa.show-sql=true spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect -spring.jpa.properties.hibernate.jdbc.time_zone=UTC \ No newline at end of file +spring.rabbitmq.host=rabbitmq + +spring.rabbitmq.port=5672 +spring.rabbitmq.username=orderflow +spring.rabbitmq.password=orderflow123 + +spring.devtools.restart.poll-interval=2s +spring.devtools.restart.quiet-period=1s \ No newline at end of file From 721b2a318ca18d8e714c55fe99b169c21ddcce04 Mon Sep 17 00:00:00 2001 From: gio448 Date: Thu, 9 Apr 2026 18:41:29 -0300 Subject: [PATCH 5/5] test: add unit test for User entity --- pom.xml | 16 ++++++++++++++++ .../orderflow/ecommerce/entities/UserTest.java | 16 ++++++++++++++++ 2 files changed, 32 insertions(+) create mode 100644 src/test/java/com/orderflow/ecommerce/entities/UserTest.java diff --git a/pom.xml b/pom.xml index a4d8bf9..f3e049e 100644 --- a/pom.xml +++ b/pom.xml @@ -50,6 +50,22 @@ 1.18.30 provided + + junit + junit + test + + + org.testng + testng + RELEASE + test + + + org.junit.jupiter + junit-jupiter + test + diff --git a/src/test/java/com/orderflow/ecommerce/entities/UserTest.java b/src/test/java/com/orderflow/ecommerce/entities/UserTest.java new file mode 100644 index 0000000..a696976 --- /dev/null +++ b/src/test/java/com/orderflow/ecommerce/entities/UserTest.java @@ -0,0 +1,16 @@ +package com.orderflow.ecommerce.entities; + +import org.junit.jupiter.api.Test; + +import static org.junit.jupiter.api.Assertions.assertEquals; + +class UserTest { + + @Test + void shouldCreateUserCorrectly() { + User user = new User(null, "Giovanna", "gi@email.com", "123456"); + + assertEquals("Giovanna", user.getName()); + assertEquals("gi@email.com", user.getEmail()); + } +} \ No newline at end of file