From 2ae3ff4d0cf948c24284abf0112e4d018f14cab0 Mon Sep 17 00:00:00 2001 From: Benedek Kisvari <22137812-benedekkisvari@users.noreply.gitlab.com> Date: Sun, 4 May 2025 16:01:05 +0200 Subject: [PATCH] Updating backend structure --- backend/settings.gradle | 2 +- .../java/hu/ignis/BackendApplication.java | 11 ++ .../main/java/hu/ignis/config/RestConfig.java | 20 +++ .../ignis/config}/WebConfig.java | 2 +- .../ignis/controller}/AuthController.java | 6 +- .../main/java/hu/ignis/dto/LoginRequest.java | 31 +++++ .../ignis/dto/LoginResponse.java} | 35 +---- .../backend => hu/ignis/model}/Order.java | 2 +- .../backend => hu/ignis/model}/OrderItem.java | 2 +- .../backend => hu/ignis/model}/Product.java | 2 +- .../backend => hu/ignis/model}/User.java | 2 +- .../repository}/OrderItemRepository.java | 5 +- .../ignis/repository}/OrderRepository.java | 5 +- .../ignis/repository}/ProductRepository.java | 5 +- .../ignis/repository}/UserRepository.java | 3 +- .../kisbe32/backend/BackendApplication.java | 27 ---- .../java/hu/ignis/dto/LoginRequestTest.java | 29 ++++ .../kisbe32/backend/ApiIntegrationTest.java | 126 ------------------ 18 files changed, 116 insertions(+), 199 deletions(-) create mode 100644 backend/src/main/java/hu/ignis/BackendApplication.java create mode 100644 backend/src/main/java/hu/ignis/config/RestConfig.java rename backend/src/main/java/{kisbe32/backend => hu/ignis/config}/WebConfig.java (95%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/controller}/AuthController.java (92%) create mode 100644 backend/src/main/java/hu/ignis/dto/LoginRequest.java rename backend/src/main/java/{kisbe32/backend/LoginRequest.java => hu/ignis/dto/LoginResponse.java} (60%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/model}/Order.java (98%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/model}/OrderItem.java (98%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/model}/Product.java (98%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/model}/User.java (98%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/repository}/OrderItemRepository.java (78%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/repository}/OrderRepository.java (78%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/repository}/ProductRepository.java (83%) rename backend/src/main/java/{kisbe32/backend => hu/ignis/repository}/UserRepository.java (80%) delete mode 100644 backend/src/main/java/kisbe32/backend/BackendApplication.java create mode 100644 backend/src/test/java/hu/ignis/dto/LoginRequestTest.java delete mode 100644 backend/src/test/java/kisbe32/backend/ApiIntegrationTest.java diff --git a/backend/settings.gradle b/backend/settings.gradle index 0f5036d..57ae301 100644 --- a/backend/settings.gradle +++ b/backend/settings.gradle @@ -1 +1 @@ -rootProject.name = 'backend' +rootProject.name = 'ignis' diff --git a/backend/src/main/java/hu/ignis/BackendApplication.java b/backend/src/main/java/hu/ignis/BackendApplication.java new file mode 100644 index 0000000..1145ada --- /dev/null +++ b/backend/src/main/java/hu/ignis/BackendApplication.java @@ -0,0 +1,11 @@ +package hu.ignis; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class BackendApplication { + public static void main(String[] args) { + SpringApplication.run(BackendApplication.class, args); + } +} \ No newline at end of file diff --git a/backend/src/main/java/hu/ignis/config/RestConfig.java b/backend/src/main/java/hu/ignis/config/RestConfig.java new file mode 100644 index 0000000..f7f7fa1 --- /dev/null +++ b/backend/src/main/java/hu/ignis/config/RestConfig.java @@ -0,0 +1,20 @@ +package hu.ignis.config; + +import hu.ignis.model.Order; +import hu.ignis.model.OrderItem; +import hu.ignis.model.Product; +import hu.ignis.model.User; +import org.springframework.data.rest.core.config.RepositoryRestConfiguration; +import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; +import org.springframework.stereotype.Component; +import org.springframework.web.servlet.config.annotation.CorsRegistry; + +// Optional: Configure the REST API to expose IDs +@Component +public class RestConfig implements RepositoryRestConfigurer { + @Override + public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) { + // Expose entity IDs in REST responses + config.exposeIdsFor(User.class, Product.class, Order.class, OrderItem.class); + } +} diff --git a/backend/src/main/java/kisbe32/backend/WebConfig.java b/backend/src/main/java/hu/ignis/config/WebConfig.java similarity index 95% rename from backend/src/main/java/kisbe32/backend/WebConfig.java rename to backend/src/main/java/hu/ignis/config/WebConfig.java index 77d5b97..5dbc0cb 100644 --- a/backend/src/main/java/kisbe32/backend/WebConfig.java +++ b/backend/src/main/java/hu/ignis/config/WebConfig.java @@ -1,4 +1,4 @@ -package kisbe32.backend; +package hu.ignis.config; import org.springframework.context.annotation.Configuration; import org.springframework.web.servlet.config.annotation.CorsRegistry; diff --git a/backend/src/main/java/kisbe32/backend/AuthController.java b/backend/src/main/java/hu/ignis/controller/AuthController.java similarity index 92% rename from backend/src/main/java/kisbe32/backend/AuthController.java rename to backend/src/main/java/hu/ignis/controller/AuthController.java index 54bc076..e0a80a4 100644 --- a/backend/src/main/java/kisbe32/backend/AuthController.java +++ b/backend/src/main/java/hu/ignis/controller/AuthController.java @@ -1,5 +1,9 @@ -package kisbe32.backend; +package hu.ignis.controller; +import hu.ignis.dto.LoginRequest; +import hu.ignis.dto.LoginResponse; +import hu.ignis.model.User; +import hu.ignis.repository.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; diff --git a/backend/src/main/java/hu/ignis/dto/LoginRequest.java b/backend/src/main/java/hu/ignis/dto/LoginRequest.java new file mode 100644 index 0000000..a60b1f6 --- /dev/null +++ b/backend/src/main/java/hu/ignis/dto/LoginRequest.java @@ -0,0 +1,31 @@ +package hu.ignis.dto; + +public class LoginRequest { + private String username; + private String password; + + // Default constructor needed for JSON deserialization + public LoginRequest() { + } + + public LoginRequest(String username, String password) { + this.username = username; + this.password = password; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } +} diff --git a/backend/src/main/java/kisbe32/backend/LoginRequest.java b/backend/src/main/java/hu/ignis/dto/LoginResponse.java similarity index 60% rename from backend/src/main/java/kisbe32/backend/LoginRequest.java rename to backend/src/main/java/hu/ignis/dto/LoginResponse.java index dc236b4..522f546 100644 --- a/backend/src/main/java/kisbe32/backend/LoginRequest.java +++ b/backend/src/main/java/hu/ignis/dto/LoginResponse.java @@ -1,35 +1,6 @@ -package kisbe32.backend; +package hu.ignis.dto; -class LoginRequest { - private String username; - private String password; - private String email; - - // Default constructor needed for JSON deserialization - public LoginRequest() {} - - public LoginRequest(String username, String password) { - this.username = username; - this.password = password; - } - - public LoginRequest(String username, String email, String password) { - this.username = username; - this.email = email; - this.password = password; - } - - public String getUsername() { return username; } - public void setUsername(String username) { this.username = username; } - - public String getPassword() { return password; } - public void setPassword(String password) { this.password = password; } - - public String getEmail() { return email; } - public void setEmail(String email) { this.email = email; } -} - -class LoginResponse { +public class LoginResponse { private boolean success; private Integer userId; private String username; @@ -71,4 +42,4 @@ class LoginResponse { public String getRole() { return role; } public void setRole(String role) { this.role = role; } -} \ No newline at end of file +} diff --git a/backend/src/main/java/kisbe32/backend/Order.java b/backend/src/main/java/hu/ignis/model/Order.java similarity index 98% rename from backend/src/main/java/kisbe32/backend/Order.java rename to backend/src/main/java/hu/ignis/model/Order.java index 1e5b2f6..b55b69e 100644 --- a/backend/src/main/java/kisbe32/backend/Order.java +++ b/backend/src/main/java/hu/ignis/model/Order.java @@ -1,4 +1,4 @@ -package kisbe32.backend; +package hu.ignis.model; import jakarta.persistence.*; import java.math.BigDecimal; diff --git a/backend/src/main/java/kisbe32/backend/OrderItem.java b/backend/src/main/java/hu/ignis/model/OrderItem.java similarity index 98% rename from backend/src/main/java/kisbe32/backend/OrderItem.java rename to backend/src/main/java/hu/ignis/model/OrderItem.java index a84b82d..c09a33a 100644 --- a/backend/src/main/java/kisbe32/backend/OrderItem.java +++ b/backend/src/main/java/hu/ignis/model/OrderItem.java @@ -1,4 +1,4 @@ -package kisbe32.backend; +package hu.ignis.model; import jakarta.persistence.*; import java.math.BigDecimal; diff --git a/backend/src/main/java/kisbe32/backend/Product.java b/backend/src/main/java/hu/ignis/model/Product.java similarity index 98% rename from backend/src/main/java/kisbe32/backend/Product.java rename to backend/src/main/java/hu/ignis/model/Product.java index 4cbcbdd..b5eb079 100644 --- a/backend/src/main/java/kisbe32/backend/Product.java +++ b/backend/src/main/java/hu/ignis/model/Product.java @@ -1,4 +1,4 @@ -package kisbe32.backend; +package hu.ignis.model; import jakarta.persistence.*; diff --git a/backend/src/main/java/kisbe32/backend/User.java b/backend/src/main/java/hu/ignis/model/User.java similarity index 98% rename from backend/src/main/java/kisbe32/backend/User.java rename to backend/src/main/java/hu/ignis/model/User.java index e4f6ffe..9751e30 100644 --- a/backend/src/main/java/kisbe32/backend/User.java +++ b/backend/src/main/java/hu/ignis/model/User.java @@ -1,4 +1,4 @@ -package kisbe32.backend; +package hu.ignis.model; import jakarta.persistence.Entity; import jakarta.persistence.GeneratedValue; diff --git a/backend/src/main/java/kisbe32/backend/OrderItemRepository.java b/backend/src/main/java/hu/ignis/repository/OrderItemRepository.java similarity index 78% rename from backend/src/main/java/kisbe32/backend/OrderItemRepository.java rename to backend/src/main/java/hu/ignis/repository/OrderItemRepository.java index 087a503..1566f84 100644 --- a/backend/src/main/java/kisbe32/backend/OrderItemRepository.java +++ b/backend/src/main/java/hu/ignis/repository/OrderItemRepository.java @@ -1,5 +1,6 @@ -package kisbe32.backend; +package hu.ignis.repository; +import hu.ignis.model.OrderItem; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RepositoryRestResource; @@ -7,7 +8,7 @@ import org.springframework.data.rest.core.annotation.RepositoryRestResource; import java.util.List; @RepositoryRestResource(collectionResourceRel = "orderitems", path = "orderitems") -interface OrderItemRepository extends JpaRepository<OrderItem, Integer> { +public interface OrderItemRepository extends JpaRepository<OrderItem, Integer> { // Find order items by order ID List<OrderItem> findByOrderId(@Param("orderId") Integer orderId); diff --git a/backend/src/main/java/kisbe32/backend/OrderRepository.java b/backend/src/main/java/hu/ignis/repository/OrderRepository.java similarity index 78% rename from backend/src/main/java/kisbe32/backend/OrderRepository.java rename to backend/src/main/java/hu/ignis/repository/OrderRepository.java index 2420475..7876fcf 100644 --- a/backend/src/main/java/kisbe32/backend/OrderRepository.java +++ b/backend/src/main/java/hu/ignis/repository/OrderRepository.java @@ -1,5 +1,6 @@ -package kisbe32.backend; +package hu.ignis.repository; +import hu.ignis.model.Order; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RepositoryRestResource; @@ -7,7 +8,7 @@ import org.springframework.data.rest.core.annotation.RepositoryRestResource; import java.util.List; @RepositoryRestResource(collectionResourceRel = "orders", path = "orders") -interface OrderRepository extends JpaRepository<Order, Integer> { +public interface OrderRepository extends JpaRepository<Order, Integer> { // Find orders by user ID List<Order> findByUser_Id(@Param("userId") Integer userId); diff --git a/backend/src/main/java/kisbe32/backend/ProductRepository.java b/backend/src/main/java/hu/ignis/repository/ProductRepository.java similarity index 83% rename from backend/src/main/java/kisbe32/backend/ProductRepository.java rename to backend/src/main/java/hu/ignis/repository/ProductRepository.java index 2494bc1..1ac0fc6 100644 --- a/backend/src/main/java/kisbe32/backend/ProductRepository.java +++ b/backend/src/main/java/hu/ignis/repository/ProductRepository.java @@ -1,5 +1,6 @@ -package kisbe32.backend; +package hu.ignis.repository; +import hu.ignis.model.Product; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.query.Param; import org.springframework.data.rest.core.annotation.RepositoryRestResource; @@ -7,7 +8,7 @@ import org.springframework.data.rest.core.annotation.RepositoryRestResource; import java.util.List; @RepositoryRestResource(collectionResourceRel = "products", path = "products") -interface ProductRepository extends JpaRepository<Product, Integer> { +public interface ProductRepository extends JpaRepository<Product, Integer> { // Find products by category List<Product> findByCategory(@Param("category") String category); diff --git a/backend/src/main/java/kisbe32/backend/UserRepository.java b/backend/src/main/java/hu/ignis/repository/UserRepository.java similarity index 80% rename from backend/src/main/java/kisbe32/backend/UserRepository.java rename to backend/src/main/java/hu/ignis/repository/UserRepository.java index 11146df..6c20ee7 100644 --- a/backend/src/main/java/kisbe32/backend/UserRepository.java +++ b/backend/src/main/java/hu/ignis/repository/UserRepository.java @@ -1,5 +1,6 @@ -package kisbe32.backend; +package hu.ignis.repository; +import hu.ignis.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; diff --git a/backend/src/main/java/kisbe32/backend/BackendApplication.java b/backend/src/main/java/kisbe32/backend/BackendApplication.java deleted file mode 100644 index 89448d8..0000000 --- a/backend/src/main/java/kisbe32/backend/BackendApplication.java +++ /dev/null @@ -1,27 +0,0 @@ -package kisbe32.backend; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; -import org.springframework.data.rest.core.config.RepositoryRestConfiguration; -import org.springframework.data.rest.webmvc.config.RepositoryRestConfigurer; -import org.springframework.stereotype.Component; -import org.springframework.web.servlet.config.annotation.CorsRegistry; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@SpringBootApplication -public class BackendApplication { - public static void main(String[] args) { - SpringApplication.run(BackendApplication.class, args); - } -} - -// Optional: Configure the REST API to expose IDs -@Component -class RestConfig implements RepositoryRestConfigurer { - @Override - public void configureRepositoryRestConfiguration(RepositoryRestConfiguration config, CorsRegistry cors) { - // Expose entity IDs in REST responses - config.exposeIdsFor(User.class, Product.class, Order.class, OrderItem.class); - } -} \ No newline at end of file diff --git a/backend/src/test/java/hu/ignis/dto/LoginRequestTest.java b/backend/src/test/java/hu/ignis/dto/LoginRequestTest.java new file mode 100644 index 0000000..abecf9a --- /dev/null +++ b/backend/src/test/java/hu/ignis/dto/LoginRequestTest.java @@ -0,0 +1,29 @@ +package hu.ignis.dto; + +import org.junit.jupiter.api.Test; + +import static org.assertj.core.api.Assertions.assertThat; + +/** + * Unit tests for the LoginRequest class. + */ +class LoginRequestTest { + + @Test + void testLoginRequestConstructorAndGetters() { + LoginRequest request = new LoginRequest("user", "password"); + + assertThat(request.getUsername()).isEqualTo("user"); + assertThat(request.getPassword()).isEqualTo("password"); + } + + @Test + void testSetters() { + LoginRequest request = new LoginRequest(); + request.setUsername("newUser"); + request.setPassword("newPassword"); + + assertThat(request.getUsername()).isEqualTo("newUser"); + assertThat(request.getPassword()).isEqualTo("newPassword"); + } +} \ No newline at end of file diff --git a/backend/src/test/java/kisbe32/backend/ApiIntegrationTest.java b/backend/src/test/java/kisbe32/backend/ApiIntegrationTest.java deleted file mode 100644 index 6003157..0000000 --- a/backend/src/test/java/kisbe32/backend/ApiIntegrationTest.java +++ /dev/null @@ -1,126 +0,0 @@ -package kisbe32.backend; - -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.web.client.TestRestTemplate; -import org.springframework.core.ParameterizedTypeReference; -import org.springframework.http.*; -import org.springframework.test.context.ActiveProfiles; - -import java.math.BigDecimal; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import static org.assertj.core.api.Assertions.assertThat; - -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@ActiveProfiles("test") -public class ApiIntegrationTest { - - @Autowired - private TestRestTemplate restTemplate; - - @Autowired - private ProductRepository productRepository; - - @Autowired - private UserRepository userRepository; - - @Autowired - private OrderRepository orderRepository; - - @Autowired - private OrderItemRepository orderItemRepository; - - @Test - public void testGetProducts() { - // Given: Add test products - Product product1 = new Product("Product 1", "Description 1", new BigDecimal("10.99"), 5, "Category 1"); - Product product2 = new Product("Product 2", "Description 2", new BigDecimal("15.99"), 10, "Category 2"); - productRepository.saveAll(List.of(product1, product2)); - - // When: Request is made to get all products - ResponseEntity<Map<String, Object>> response = restTemplate.exchange( - "/api/products", - HttpMethod.GET, - null, - new ParameterizedTypeReference<Map<String, Object>>() {} - ); - - // Then: The response should contain products - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(response.getBody()).isNotNull(); - List<Map<String, Object>> products = (List<Map<String, Object>>) response.getBody().get("_embedded"); - assertThat(products).isNotEmpty(); - } - - @Test - public void testCreateOrderAndOrderItems() { - // Given: A user and products exist - User user = new User("testuser", "test@example.com", "password"); - userRepository.save(user); - - Product product = new Product("Test Product", "Description", new BigDecimal("19.99"), 20, "Test Category"); - productRepository.save(product); - - // When: Create an order - Map<String, Object> orderRequest = new HashMap<>(); - orderRequest.put("userId", user.getId()); - orderRequest.put("status", "PENDING"); - - ResponseEntity<Map> orderResponse = restTemplate.postForEntity( - "/api/orders", orderRequest, Map.class); - - // Then: The order should be created - assertThat(orderResponse.getStatusCode()).isEqualTo(HttpStatus.CREATED); - String orderLocation = orderResponse.getHeaders().getLocation().toString(); - - // When: Create an order item - Map<String, Object> orderItemRequest = new HashMap<>(); - orderItemRequest.put("orderId", getIdFromLocation(orderLocation)); - orderItemRequest.put("productId", product.getId()); - orderItemRequest.put("quantity", 2); - orderItemRequest.put("price", product.getPrice()); - - ResponseEntity<Map> orderItemResponse = restTemplate.postForEntity( - "/api/orderitems", orderItemRequest, Map.class); - - // Then: The order item should be created - assertThat(orderItemResponse.getStatusCode()).isEqualTo(HttpStatus.CREATED); - } - - @Test - public void testLogin() { - // Given: A user exists - String username = "loginuser"; - String password = "password123"; - User user = new User(username, "login@example.com", password); - userRepository.save(user); - - // When: Login with valid credentials - AuthController.LoginRequest loginRequest = new AuthController.LoginRequest(username, password); - - ResponseEntity<AuthController.LoginResponse> response = restTemplate.postForEntity( - "/api/login", loginRequest, AuthController.LoginResponse.class); - - // Then: Should get successful response - assertThat(response.getStatusCode()).isEqualTo(HttpStatus.OK); - assertThat(response.getBody().isSuccess()).isTrue(); - assertThat(response.getBody().getUserId()).isEqualTo(user.getId()); - - // When: Login with invalid password - loginRequest.setPassword("wrongpassword"); - ResponseEntity<AuthController.LoginResponse> failedResponse = restTemplate.postForEntity( - "/api/login", loginRequest, AuthController.LoginResponse.class); - - // Then: Should get unauthorized response - assertThat(failedResponse.getStatusCode()).isEqualTo(HttpStatus.UNAUTHORIZED); - assertThat(failedResponse.getBody().isSuccess()).isFalse(); - } - - private Integer getIdFromLocation(String location) { - return Integer.parseInt(location.substring(location.lastIndexOf("/") + 1)); - } -} \ No newline at end of file -- GitLab