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/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/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/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.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 8685680..842455d 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -8,6 +8,7 @@ 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 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