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