diff --git a/backend/src/main/java/com/pennywise/backend/BackendApplication.java b/backend/src/main/java/com/pennywise/PennywiseApplication.java similarity index 61% rename from backend/src/main/java/com/pennywise/backend/BackendApplication.java rename to backend/src/main/java/com/pennywise/PennywiseApplication.java index c55a8a0..47d1530 100644 --- a/backend/src/main/java/com/pennywise/backend/BackendApplication.java +++ b/backend/src/main/java/com/pennywise/PennywiseApplication.java @@ -1,13 +1,13 @@ -package com.pennywise.backend; +package com.pennywise; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication -public class BackendApplication { +public class PennywiseApplication { public static void main(String[] args) { - SpringApplication.run(BackendApplication.class, args); + SpringApplication.run(PennywiseApplication.class, args); } } diff --git a/backend/src/main/java/com/pennywise/account/controller/package-info.java b/backend/src/main/java/com/pennywise/account/controller/package-info.java new file mode 100644 index 0000000..faf469d --- /dev/null +++ b/backend/src/main/java/com/pennywise/account/controller/package-info.java @@ -0,0 +1,4 @@ +/** + * Account domain REST API endpoints. + */ +package com.pennywise.account.controller; diff --git a/backend/src/main/java/com/pennywise/account/dto/package-info.java b/backend/src/main/java/com/pennywise/account/dto/package-info.java new file mode 100644 index 0000000..244f537 --- /dev/null +++ b/backend/src/main/java/com/pennywise/account/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Account domain Data Transfer Objects. + */ +package com.pennywise.account.dto; diff --git a/backend/src/main/java/com/pennywise/account/entity/package-info.java b/backend/src/main/java/com/pennywise/account/entity/package-info.java new file mode 100644 index 0000000..93af7bc --- /dev/null +++ b/backend/src/main/java/com/pennywise/account/entity/package-info.java @@ -0,0 +1,4 @@ +/** + * Account domain JPA entities. + */ +package com.pennywise.account.entity; diff --git a/backend/src/main/java/com/pennywise/account/repository/package-info.java b/backend/src/main/java/com/pennywise/account/repository/package-info.java new file mode 100644 index 0000000..1d191b9 --- /dev/null +++ b/backend/src/main/java/com/pennywise/account/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * Account domain data access layer. + */ +package com.pennywise.account.repository; diff --git a/backend/src/main/java/com/pennywise/account/service/package-info.java b/backend/src/main/java/com/pennywise/account/service/package-info.java new file mode 100644 index 0000000..2ff7f63 --- /dev/null +++ b/backend/src/main/java/com/pennywise/account/service/package-info.java @@ -0,0 +1,4 @@ +/** + * Account domain business logic. + */ +package com.pennywise.account.service; diff --git a/backend/src/main/java/com/pennywise/backend/account/controller/package-info.java b/backend/src/main/java/com/pennywise/backend/account/controller/package-info.java deleted file mode 100644 index 7ccffdb..0000000 --- a/backend/src/main/java/com/pennywise/backend/account/controller/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Account domain REST API endpoints. - * - *

- * Contains controllers for CRUD operations on accounts. - *

- */ -package com.pennywise.backend.account.controller; diff --git a/backend/src/main/java/com/pennywise/backend/account/dto/package-info.java b/backend/src/main/java/com/pennywise/backend/account/dto/package-info.java deleted file mode 100644 index f23f645..0000000 --- a/backend/src/main/java/com/pennywise/backend/account/dto/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Account domain Data Transfer Objects. - * - *

- * Contains request/response DTOs for account API endpoints. - *

- */ -package com.pennywise.backend.account.dto; diff --git a/backend/src/main/java/com/pennywise/backend/account/entity/package-info.java b/backend/src/main/java/com/pennywise/backend/account/entity/package-info.java deleted file mode 100644 index 3b821f5..0000000 --- a/backend/src/main/java/com/pennywise/backend/account/entity/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Account domain JPA entities. - * - *

- * Contains the Account entity representing bank accounts, - * credit cards, cash accounts, etc. - *

- */ -package com.pennywise.backend.account.entity; diff --git a/backend/src/main/java/com/pennywise/backend/account/repository/package-info.java b/backend/src/main/java/com/pennywise/backend/account/repository/package-info.java deleted file mode 100644 index 170ab1a..0000000 --- a/backend/src/main/java/com/pennywise/backend/account/repository/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Account domain data access layer. - * - *

- * Contains Spring Data JPA repositories for account data access. - *

- */ -package com.pennywise.backend.account.repository; diff --git a/backend/src/main/java/com/pennywise/backend/account/service/package-info.java b/backend/src/main/java/com/pennywise/backend/account/service/package-info.java deleted file mode 100644 index c2b535f..0000000 --- a/backend/src/main/java/com/pennywise/backend/account/service/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Account domain business logic. - * - *

- * Contains services for account management and balance calculations. - *

- */ -package com.pennywise.backend.account.service; diff --git a/backend/src/main/java/com/pennywise/backend/budget/controller/package-info.java b/backend/src/main/java/com/pennywise/backend/budget/controller/package-info.java deleted file mode 100644 index e79b50f..0000000 --- a/backend/src/main/java/com/pennywise/backend/budget/controller/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Budget domain REST API endpoints. - * - *

- * Contains controllers for CRUD operations on budgets - * and endpoints for budget status and alerts. - *

- */ -package com.pennywise.backend.budget.controller; diff --git a/backend/src/main/java/com/pennywise/backend/budget/dto/package-info.java b/backend/src/main/java/com/pennywise/backend/budget/dto/package-info.java deleted file mode 100644 index 8e1e3fd..0000000 --- a/backend/src/main/java/com/pennywise/backend/budget/dto/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Budget domain Data Transfer Objects. - * - *

- * Contains request/response DTOs for budget API endpoints. - *

- */ -package com.pennywise.backend.budget.dto; diff --git a/backend/src/main/java/com/pennywise/backend/budget/entity/package-info.java b/backend/src/main/java/com/pennywise/backend/budget/entity/package-info.java deleted file mode 100644 index 5f2b596..0000000 --- a/backend/src/main/java/com/pennywise/backend/budget/entity/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Budget domain JPA entities. - * - *

- * Contains the Budget entity for tracking spending limits - * per category over time periods. - *

- */ -package com.pennywise.backend.budget.entity; diff --git a/backend/src/main/java/com/pennywise/backend/budget/repository/package-info.java b/backend/src/main/java/com/pennywise/backend/budget/repository/package-info.java deleted file mode 100644 index ead91aa..0000000 --- a/backend/src/main/java/com/pennywise/backend/budget/repository/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Budget domain data access layer. - * - *

- * Contains Spring Data JPA repositories for budget data access. - *

- */ -package com.pennywise.backend.budget.repository; diff --git a/backend/src/main/java/com/pennywise/backend/budget/service/package-info.java b/backend/src/main/java/com/pennywise/backend/budget/service/package-info.java deleted file mode 100644 index 1fefbc7..0000000 --- a/backend/src/main/java/com/pennywise/backend/budget/service/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Budget domain business logic. - * - *

- * Contains services for budget management, threshold checking, - * and budget vs actual comparisons. - *

- */ -package com.pennywise.backend.budget.service; diff --git a/backend/src/main/java/com/pennywise/backend/category/controller/package-info.java b/backend/src/main/java/com/pennywise/backend/category/controller/package-info.java deleted file mode 100644 index 59f830b..0000000 --- a/backend/src/main/java/com/pennywise/backend/category/controller/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Category domain REST API endpoints. - * - *

- * Contains controllers for CRUD operations on categories. - *

- */ -package com.pennywise.backend.category.controller; diff --git a/backend/src/main/java/com/pennywise/backend/category/dto/package-info.java b/backend/src/main/java/com/pennywise/backend/category/dto/package-info.java deleted file mode 100644 index 922451c..0000000 --- a/backend/src/main/java/com/pennywise/backend/category/dto/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Category domain Data Transfer Objects. - * - *

- * Contains request/response DTOs for category API endpoints. - *

- */ -package com.pennywise.backend.category.dto; diff --git a/backend/src/main/java/com/pennywise/backend/category/entity/package-info.java b/backend/src/main/java/com/pennywise/backend/category/entity/package-info.java deleted file mode 100644 index a5d138c..0000000 --- a/backend/src/main/java/com/pennywise/backend/category/entity/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Category domain JPA entities. - * - *

- * Contains the Category entity for transaction categorization. - * Categories can be hierarchical (parent/child relationships). - *

- */ -package com.pennywise.backend.category.entity; diff --git a/backend/src/main/java/com/pennywise/backend/category/repository/CategoryRepository.java b/backend/src/main/java/com/pennywise/backend/category/repository/CategoryRepository.java deleted file mode 100644 index 683f409..0000000 --- a/backend/src/main/java/com/pennywise/backend/category/repository/CategoryRepository.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.pennywise.backend.category.repository; - -import com.pennywise.backend.category.entity.Category; -import org.springframework.data.jpa.repository.JpaRepository; -import org.springframework.stereotype.Repository; - -import java.util.List; -import java.util.Optional; - -@Repository -public interface CategoryRepository extends JpaRepository { - List findByUserId(Long userId); - - List findByUserIdAndParentIsNull(Long userId); - - List findByParentId(Long parentId); - - Optional findByUserIdAndName(Long userId, String name); - - boolean existsByUserIdAndName(Long userId, String name); -} \ No newline at end of file diff --git a/backend/src/main/java/com/pennywise/backend/category/repository/package-info.java b/backend/src/main/java/com/pennywise/backend/category/repository/package-info.java deleted file mode 100644 index 8a537c2..0000000 --- a/backend/src/main/java/com/pennywise/backend/category/repository/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Category domain data access layer. - * - *

- * Contains Spring Data JPA repositories for category data access. - *

- */ -package com.pennywise.backend.category.repository; diff --git a/backend/src/main/java/com/pennywise/backend/category/service/package-info.java b/backend/src/main/java/com/pennywise/backend/category/service/package-info.java deleted file mode 100644 index 3b536ec..0000000 --- a/backend/src/main/java/com/pennywise/backend/category/service/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * Category domain business logic. - * - *

- * Contains services for category management and hierarchy operations. - *

- */ -package com.pennywise.backend.category.service; diff --git a/backend/src/main/java/com/pennywise/backend/common/dto/package-info.java b/backend/src/main/java/com/pennywise/backend/common/dto/package-info.java deleted file mode 100644 index e7cb670..0000000 --- a/backend/src/main/java/com/pennywise/backend/common/dto/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Shared Data Transfer Objects used across multiple domains. - * - *

- * Contains common response wrappers, pagination DTOs, - * and other shared data structures. - *

- */ -package com.pennywise.backend.common.dto; diff --git a/backend/src/main/java/com/pennywise/backend/common/exception/package-info.java b/backend/src/main/java/com/pennywise/backend/common/exception/package-info.java deleted file mode 100644 index a28ba29..0000000 --- a/backend/src/main/java/com/pennywise/backend/common/exception/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Custom exceptions and global exception handling. - * - *

- * Contains application-specific exceptions and the global - * exception handler for consistent error responses. - *

- */ -package com.pennywise.backend.common.exception; diff --git a/backend/src/main/java/com/pennywise/backend/config/package-info.java b/backend/src/main/java/com/pennywise/backend/config/package-info.java deleted file mode 100644 index 36f7dfd..0000000 --- a/backend/src/main/java/com/pennywise/backend/config/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Application-wide configuration classes. - * - *

- * Contains Spring configuration for security, web settings, - * and other cross-cutting concerns. - *

- */ -package com.pennywise.backend.config; diff --git a/backend/src/main/java/com/pennywise/backend/transaction/controller/package-info.java b/backend/src/main/java/com/pennywise/backend/transaction/controller/package-info.java deleted file mode 100644 index 666edf9..0000000 --- a/backend/src/main/java/com/pennywise/backend/transaction/controller/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Transaction domain REST API endpoints. - * - *

- * Contains controllers for CRUD operations on transactions - * and endpoints for spending reports and analytics. - *

- */ -package com.pennywise.backend.transaction.controller; diff --git a/backend/src/main/java/com/pennywise/backend/transaction/dto/package-info.java b/backend/src/main/java/com/pennywise/backend/transaction/dto/package-info.java deleted file mode 100644 index dbb5114..0000000 --- a/backend/src/main/java/com/pennywise/backend/transaction/dto/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Transaction domain Data Transfer Objects. - * - *

- * Contains request/response DTOs for transaction API endpoints, - * including filter criteria and aggregation results. - *

- */ -package com.pennywise.backend.transaction.dto; diff --git a/backend/src/main/java/com/pennywise/backend/transaction/entity/package-info.java b/backend/src/main/java/com/pennywise/backend/transaction/entity/package-info.java deleted file mode 100644 index c46903c..0000000 --- a/backend/src/main/java/com/pennywise/backend/transaction/entity/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Transaction domain JPA entities. - * - *

- * Contains the Transaction entity - the core of the finance tracker. - * Transactions represent income, expenses, and transfers. - *

- */ -package com.pennywise.backend.transaction.entity; diff --git a/backend/src/main/java/com/pennywise/backend/transaction/repository/package-info.java b/backend/src/main/java/com/pennywise/backend/transaction/repository/package-info.java deleted file mode 100644 index 4c4c49a..0000000 --- a/backend/src/main/java/com/pennywise/backend/transaction/repository/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Transaction domain data access layer. - * - *

- * Contains Spring Data JPA repositories for transaction data access, - * including custom queries for filtering and aggregation. - *

- */ -package com.pennywise.backend.transaction.repository; diff --git a/backend/src/main/java/com/pennywise/backend/transaction/service/package-info.java b/backend/src/main/java/com/pennywise/backend/transaction/service/package-info.java deleted file mode 100644 index aa8c677..0000000 --- a/backend/src/main/java/com/pennywise/backend/transaction/service/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * Transaction domain business logic. - * - *

- * Contains services for transaction management, balance updates, - * and spending analytics. - *

- */ -package com.pennywise.backend.transaction.service; diff --git a/backend/src/main/java/com/pennywise/backend/user/controller/package-info.java b/backend/src/main/java/com/pennywise/backend/user/controller/package-info.java deleted file mode 100644 index 4ddb012..0000000 --- a/backend/src/main/java/com/pennywise/backend/user/controller/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * User domain REST API endpoints. - * - *

- * Contains controllers for user registration, login, - * and user profile management. - *

- */ -package com.pennywise.backend.user.controller; diff --git a/backend/src/main/java/com/pennywise/backend/user/dto/package-info.java b/backend/src/main/java/com/pennywise/backend/user/dto/package-info.java deleted file mode 100644 index d687553..0000000 --- a/backend/src/main/java/com/pennywise/backend/user/dto/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * User domain Data Transfer Objects. - * - *

- * Contains request/response DTOs for user API endpoints. - *

- */ -package com.pennywise.backend.user.dto; diff --git a/backend/src/main/java/com/pennywise/backend/user/entity/package-info.java b/backend/src/main/java/com/pennywise/backend/user/entity/package-info.java deleted file mode 100644 index 74f0f2c..0000000 --- a/backend/src/main/java/com/pennywise/backend/user/entity/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * User domain JPA entities. - * - *

- * Contains the User entity and any related embedded objects. - *

- */ -package com.pennywise.backend.user.entity; diff --git a/backend/src/main/java/com/pennywise/backend/user/repository/package-info.java b/backend/src/main/java/com/pennywise/backend/user/repository/package-info.java deleted file mode 100644 index c1f8429..0000000 --- a/backend/src/main/java/com/pennywise/backend/user/repository/package-info.java +++ /dev/null @@ -1,8 +0,0 @@ -/** - * User domain data access layer. - * - *

- * Contains Spring Data JPA repositories for user data access. - *

- */ -package com.pennywise.backend.user.repository; diff --git a/backend/src/main/java/com/pennywise/backend/user/service/package-info.java b/backend/src/main/java/com/pennywise/backend/user/service/package-info.java deleted file mode 100644 index 4a71ec7..0000000 --- a/backend/src/main/java/com/pennywise/backend/user/service/package-info.java +++ /dev/null @@ -1,9 +0,0 @@ -/** - * User domain business logic. - * - *

- * Contains services for user management, registration, - * and authentication-related operations. - *

- */ -package com.pennywise.backend.user.service; diff --git a/backend/src/main/java/com/pennywise/budget/controller/package-info.java b/backend/src/main/java/com/pennywise/budget/controller/package-info.java new file mode 100644 index 0000000..29b115a --- /dev/null +++ b/backend/src/main/java/com/pennywise/budget/controller/package-info.java @@ -0,0 +1,4 @@ +/** + * Budget domain REST API endpoints. + */ +package com.pennywise.budget.controller; diff --git a/backend/src/main/java/com/pennywise/budget/dto/package-info.java b/backend/src/main/java/com/pennywise/budget/dto/package-info.java new file mode 100644 index 0000000..0002d14 --- /dev/null +++ b/backend/src/main/java/com/pennywise/budget/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Budget domain Data Transfer Objects. + */ +package com.pennywise.budget.dto; diff --git a/backend/src/main/java/com/pennywise/budget/entity/package-info.java b/backend/src/main/java/com/pennywise/budget/entity/package-info.java new file mode 100644 index 0000000..db884c2 --- /dev/null +++ b/backend/src/main/java/com/pennywise/budget/entity/package-info.java @@ -0,0 +1,4 @@ +/** + * Budget domain JPA entities. + */ +package com.pennywise.budget.entity; diff --git a/backend/src/main/java/com/pennywise/budget/repository/package-info.java b/backend/src/main/java/com/pennywise/budget/repository/package-info.java new file mode 100644 index 0000000..a641569 --- /dev/null +++ b/backend/src/main/java/com/pennywise/budget/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * Budget domain data access layer. + */ +package com.pennywise.budget.repository; diff --git a/backend/src/main/java/com/pennywise/budget/service/package-info.java b/backend/src/main/java/com/pennywise/budget/service/package-info.java new file mode 100644 index 0000000..1da8644 --- /dev/null +++ b/backend/src/main/java/com/pennywise/budget/service/package-info.java @@ -0,0 +1,4 @@ +/** + * Budget domain business logic. + */ +package com.pennywise.budget.service; diff --git a/backend/src/main/java/com/pennywise/backend/category/controller/CategoryController.java b/backend/src/main/java/com/pennywise/category/controller/CategoryController.java similarity index 76% rename from backend/src/main/java/com/pennywise/backend/category/controller/CategoryController.java rename to backend/src/main/java/com/pennywise/category/controller/CategoryController.java index ab40b46..cde36df 100644 --- a/backend/src/main/java/com/pennywise/backend/category/controller/CategoryController.java +++ b/backend/src/main/java/com/pennywise/category/controller/CategoryController.java @@ -1,9 +1,9 @@ -package com.pennywise.backend.category.controller; +package com.pennywise.category.controller; -import com.pennywise.backend.category.dto.CategoryRequest; -import com.pennywise.backend.category.dto.CategoryResponse; -import com.pennywise.backend.category.service.CategoryService; -import com.pennywise.backend.common.dto.ApiResponse; +import com.pennywise.category.dto.CategoryRequest; +import com.pennywise.category.dto.CategoryResponse; +import com.pennywise.category.service.CategoryService; +import com.pennywise.common.dto.ApiResponse; import jakarta.validation.Valid; import lombok.RequiredArgsConstructor; import org.springframework.http.HttpStatus; @@ -11,6 +11,7 @@ import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.UUID; @RestController @RequestMapping("/api/categories") @@ -21,7 +22,7 @@ public class CategoryController { @PostMapping public ResponseEntity> createCategory( - @RequestHeader("X-User-Id") Long userId, + @RequestHeader("X-User-Id") UUID userId, @Valid @RequestBody CategoryRequest request) { CategoryResponse category = categoryService.createCategory(userId, request); @@ -33,7 +34,7 @@ public ResponseEntity> createCategory( @GetMapping public ResponseEntity>> getAllCategories( - @RequestHeader("X-User-Id") Long userId) { + @RequestHeader("X-User-Id") UUID userId) { List categories = categoryService.getCategoriesByUserId(userId); @@ -42,7 +43,7 @@ public ResponseEntity>> getAllCategories( @GetMapping("/roots") public ResponseEntity>> getRootCategories( - @RequestHeader("X-User-Id") Long userId) { + @RequestHeader("X-User-Id") UUID userId) { List categories = categoryService.getRootCategoriesByUserId(userId); @@ -51,8 +52,8 @@ public ResponseEntity>> getRootCategories( @GetMapping("/{id}") public ResponseEntity> getCategoryById( - @PathVariable Long id, - @RequestHeader("X-User-Id") Long userId) { + @PathVariable UUID id, + @RequestHeader("X-User-Id") UUID userId) { CategoryResponse category = categoryService.getCategoryById(id, userId); @@ -61,8 +62,8 @@ public ResponseEntity> getCategoryById( @GetMapping("/{id}/children") public ResponseEntity>> getChildrenCategories( - @PathVariable Long id, - @RequestHeader("X-User-Id") Long userId) { + @PathVariable UUID id, + @RequestHeader("X-User-Id") UUID userId) { // Verify category exists and belongs to user categoryService.getCategoryById(id, userId); @@ -74,8 +75,8 @@ public ResponseEntity>> getChildrenCategories @PutMapping("/{id}") public ResponseEntity> updateCategory( - @PathVariable Long id, - @RequestHeader("X-User-Id") Long userId, + @PathVariable UUID id, + @RequestHeader("X-User-Id") UUID userId, @Valid @RequestBody CategoryRequest request) { CategoryResponse category = categoryService.updateCategory(id, userId, request); @@ -85,8 +86,8 @@ public ResponseEntity> updateCategory( @DeleteMapping("/{id}") public ResponseEntity> deleteCategory( - @PathVariable Long id, - @RequestHeader("X-User-Id") Long userId) { + @PathVariable UUID id, + @RequestHeader("X-User-Id") UUID userId) { categoryService.deleteCategory(id, userId); diff --git a/backend/src/main/java/com/pennywise/backend/category/dto/CategoryRequest.java b/backend/src/main/java/com/pennywise/category/dto/CategoryRequest.java similarity index 86% rename from backend/src/main/java/com/pennywise/backend/category/dto/CategoryRequest.java rename to backend/src/main/java/com/pennywise/category/dto/CategoryRequest.java index 1a40aa6..bb32228 100644 --- a/backend/src/main/java/com/pennywise/backend/category/dto/CategoryRequest.java +++ b/backend/src/main/java/com/pennywise/category/dto/CategoryRequest.java @@ -1,10 +1,12 @@ -package com.pennywise.backend.category.dto; +package com.pennywise.category.dto; import jakarta.validation.constraints.NotNull; import jakarta.validation.constraints.Size; import jakarta.validation.constraints.Pattern; import lombok.*; +import java.util.UUID; + @Getter @Setter @NoArgsConstructor @@ -16,7 +18,7 @@ public class CategoryRequest { @Size(min = 1, max = 100, message = "Category name must be between 1 and 100 characters") private String name; - private Long parentId; // Optional - null means root category + private UUID parentId; // Optional - null means root category @Size(max = 50, message = "Icon must be at most 50 characters") private String icon; @@ -27,4 +29,4 @@ public class CategoryRequest { @Size(max = 255, message = "Description must be at most 255 characters") private String description; -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/pennywise/backend/category/dto/CategoryResponse.java b/backend/src/main/java/com/pennywise/category/dto/CategoryResponse.java similarity index 82% rename from backend/src/main/java/com/pennywise/backend/category/dto/CategoryResponse.java rename to backend/src/main/java/com/pennywise/category/dto/CategoryResponse.java index ea6b9ea..e4cf7f8 100644 --- a/backend/src/main/java/com/pennywise/backend/category/dto/CategoryResponse.java +++ b/backend/src/main/java/com/pennywise/category/dto/CategoryResponse.java @@ -1,10 +1,11 @@ -package com.pennywise.backend.category.dto; +package com.pennywise.category.dto; import com.fasterxml.jackson.annotation.JsonInclude; import lombok.*; import java.time.Instant; import java.util.List; +import java.util.UUID; @Getter @Setter @@ -14,13 +15,13 @@ @JsonInclude(JsonInclude.Include.NON_NULL) public class CategoryResponse { - private Long id; + private UUID id; private String name; - private Long parentId; + private UUID parentId; private String icon; private String color; private String description; private Instant createdAt; private Instant updatedAt; private List children; // Optional - for hierarchical display -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/pennywise/backend/category/entity/Category.java b/backend/src/main/java/com/pennywise/category/entity/Category.java similarity index 93% rename from backend/src/main/java/com/pennywise/backend/category/entity/Category.java rename to backend/src/main/java/com/pennywise/category/entity/Category.java index a20e573..a6cec7c 100644 --- a/backend/src/main/java/com/pennywise/backend/category/entity/Category.java +++ b/backend/src/main/java/com/pennywise/category/entity/Category.java @@ -1,4 +1,4 @@ -package com.pennywise.backend.category.entity; +package com.pennywise.category.entity; import jakarta.persistence.*; import jakarta.validation.constraints.NotNull; @@ -12,6 +12,7 @@ import java.time.Instant; import java.util.ArrayList; import java.util.List; +import java.util.UUID; @Entity @Table(name = "categories") @@ -23,8 +24,8 @@ public class Category { @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - private Long id; + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; @Column @NotNull @@ -33,7 +34,7 @@ public class Category { @Column(name = "user_id", nullable = false) @NotNull(message = "User ID is required") - private Long userId; + private UUID userId; @ManyToOne(fetch = FetchType.LAZY) @JoinColumn(name = "parent_id") diff --git a/backend/src/main/java/com/pennywise/category/repository/CategoryRepository.java b/backend/src/main/java/com/pennywise/category/repository/CategoryRepository.java new file mode 100644 index 0000000..cbf50b4 --- /dev/null +++ b/backend/src/main/java/com/pennywise/category/repository/CategoryRepository.java @@ -0,0 +1,22 @@ +package com.pennywise.category.repository; + +import com.pennywise.category.entity.Category; +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.stereotype.Repository; + +import java.util.List; +import java.util.Optional; +import java.util.UUID; + +@Repository +public interface CategoryRepository extends JpaRepository { + List findByUserId(UUID userId); + + List findByUserIdAndParentIsNull(UUID userId); + + List findByParentId(UUID parentId); + + Optional findByUserIdAndName(UUID userId, String name); + + boolean existsByUserIdAndName(UUID userId, String name); +} diff --git a/backend/src/main/java/com/pennywise/backend/category/service/CategoryService.java b/backend/src/main/java/com/pennywise/category/service/CategoryService.java similarity index 87% rename from backend/src/main/java/com/pennywise/backend/category/service/CategoryService.java rename to backend/src/main/java/com/pennywise/category/service/CategoryService.java index 649d0eb..94d49a6 100644 --- a/backend/src/main/java/com/pennywise/backend/category/service/CategoryService.java +++ b/backend/src/main/java/com/pennywise/category/service/CategoryService.java @@ -1,15 +1,16 @@ -package com.pennywise.backend.category.service; +package com.pennywise.category.service; -import com.pennywise.backend.category.dto.CategoryRequest; -import com.pennywise.backend.category.dto.CategoryResponse; -import com.pennywise.backend.category.entity.Category; -import com.pennywise.backend.category.repository.CategoryRepository; -import com.pennywise.backend.common.exception.ResourceNotFoundException; +import com.pennywise.category.dto.CategoryRequest; +import com.pennywise.category.dto.CategoryResponse; +import com.pennywise.category.entity.Category; +import com.pennywise.category.repository.CategoryRepository; +import com.pennywise.common.exception.ResourceNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import java.util.List; +import java.util.UUID; import java.util.stream.Collectors; @Service @@ -19,7 +20,7 @@ public class CategoryService { private final CategoryRepository categoryRepository; - public CategoryResponse createCategory(Long userId, CategoryRequest request) { + public CategoryResponse createCategory(UUID userId, CategoryRequest request) { // 1. Check if name already exists for this user if (categoryRepository.existsByUserIdAndName(userId, request.getName())) { throw new IllegalArgumentException("Category with name '" + request.getName() + "' already exists"); @@ -48,7 +49,7 @@ public CategoryResponse createCategory(Long userId, CategoryRequest request) { return toResponse(saved); } - public CategoryResponse getCategoryById(Long id, Long userId) { + public CategoryResponse getCategoryById(UUID id, UUID userId) { Category category = categoryRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException("Category", "id", id)); @@ -59,7 +60,7 @@ public CategoryResponse getCategoryById(Long id, Long userId) { return toResponse(category); } - public List getCategoriesByUserId(Long userId) { + public List getCategoriesByUserId(UUID userId) { List categories = categoryRepository.findByUserId(userId); return categories.stream() @@ -67,7 +68,7 @@ public List getCategoriesByUserId(Long userId) { .collect(Collectors.toList()); } - public List getRootCategoriesByUserId(Long userId) { + public List getRootCategoriesByUserId(UUID userId) { List categories = categoryRepository.findByUserIdAndParentIsNull(userId); return categories.stream() @@ -75,7 +76,7 @@ public List getRootCategoriesByUserId(Long userId) { .collect(Collectors.toList()); } - public List getChildrenCategoriesByParentId(Long parentId) { + public List getChildrenCategoriesByParentId(UUID parentId) { List categories = categoryRepository.findByParentId(parentId); return categories.stream() @@ -83,7 +84,7 @@ public List getChildrenCategoriesByParentId(Long parentId) { .collect(Collectors.toList()); } - public CategoryResponse updateCategory(Long id, Long userId, CategoryRequest request) { + public CategoryResponse updateCategory(UUID id, UUID userId, CategoryRequest request) { Category category = categoryRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException("Category", "id", id)); @@ -127,7 +128,7 @@ public CategoryResponse updateCategory(Long id, Long userId, CategoryRequest req return toResponse(updated); } - public void deleteCategory(Long id, Long userId) { + public void deleteCategory(UUID id, UUID userId) { Category category = categoryRepository.findById(id) .orElseThrow(() -> new ResourceNotFoundException("Category", "id", id)); @@ -151,7 +152,7 @@ private CategoryResponse toResponse(Category category) { .build(); } - private Category toEntity(CategoryRequest request, Long userId) { + private Category toEntity(CategoryRequest request, UUID userId) { return Category.builder() .name(request.getName()) .userId(userId) @@ -160,4 +161,4 @@ private Category toEntity(CategoryRequest request, Long userId) { .description(request.getDescription()) .build(); } -} \ No newline at end of file +} diff --git a/backend/src/main/java/com/pennywise/backend/common/dto/ApiResponse.java b/backend/src/main/java/com/pennywise/common/dto/ApiResponse.java similarity index 98% rename from backend/src/main/java/com/pennywise/backend/common/dto/ApiResponse.java rename to backend/src/main/java/com/pennywise/common/dto/ApiResponse.java index e3e60c4..414cb9f 100644 --- a/backend/src/main/java/com/pennywise/backend/common/dto/ApiResponse.java +++ b/backend/src/main/java/com/pennywise/common/dto/ApiResponse.java @@ -1,4 +1,4 @@ -package com.pennywise.backend.common.dto; +package com.pennywise.common.dto; import com.fasterxml.jackson.annotation.JsonInclude; @@ -99,4 +99,3 @@ public void setTimestamp(Instant timestamp) { this.timestamp = timestamp; } } - diff --git a/backend/src/main/java/com/pennywise/backend/common/exception/GlobalExceptionHandler.java b/backend/src/main/java/com/pennywise/common/exception/GlobalExceptionHandler.java similarity index 96% rename from backend/src/main/java/com/pennywise/backend/common/exception/GlobalExceptionHandler.java rename to backend/src/main/java/com/pennywise/common/exception/GlobalExceptionHandler.java index 175aadf..e42c8f3 100644 --- a/backend/src/main/java/com/pennywise/backend/common/exception/GlobalExceptionHandler.java +++ b/backend/src/main/java/com/pennywise/common/exception/GlobalExceptionHandler.java @@ -1,6 +1,6 @@ -package com.pennywise.backend.common.exception; +package com.pennywise.common.exception; -import com.pennywise.backend.common.dto.ApiResponse; +import com.pennywise.common.dto.ApiResponse; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.validation.FieldError; diff --git a/backend/src/main/java/com/pennywise/backend/common/exception/ResourceNotFoundException.java b/backend/src/main/java/com/pennywise/common/exception/ResourceNotFoundException.java similarity index 95% rename from backend/src/main/java/com/pennywise/backend/common/exception/ResourceNotFoundException.java rename to backend/src/main/java/com/pennywise/common/exception/ResourceNotFoundException.java index e9f16cc..0e7d081 100644 --- a/backend/src/main/java/com/pennywise/backend/common/exception/ResourceNotFoundException.java +++ b/backend/src/main/java/com/pennywise/common/exception/ResourceNotFoundException.java @@ -1,4 +1,4 @@ -package com.pennywise.backend.common.exception; +package com.pennywise.common.exception; import org.springframework.http.HttpStatus; import org.springframework.web.bind.annotation.ResponseStatus; @@ -34,4 +34,3 @@ public Object getFieldValue() { return fieldValue; } } - diff --git a/backend/src/main/java/com/pennywise/backend/config/SecurityConfig.java b/backend/src/main/java/com/pennywise/config/SecurityConfig.java similarity index 97% rename from backend/src/main/java/com/pennywise/backend/config/SecurityConfig.java rename to backend/src/main/java/com/pennywise/config/SecurityConfig.java index 01762dd..03c55b6 100644 --- a/backend/src/main/java/com/pennywise/backend/config/SecurityConfig.java +++ b/backend/src/main/java/com/pennywise/config/SecurityConfig.java @@ -1,4 +1,4 @@ -package com.pennywise.backend.config; +package com.pennywise.config; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; diff --git a/backend/src/main/java/com/pennywise/transaction/controller/package-info.java b/backend/src/main/java/com/pennywise/transaction/controller/package-info.java new file mode 100644 index 0000000..ebc7636 --- /dev/null +++ b/backend/src/main/java/com/pennywise/transaction/controller/package-info.java @@ -0,0 +1,4 @@ +/** + * Transaction domain REST API endpoints. + */ +package com.pennywise.transaction.controller; diff --git a/backend/src/main/java/com/pennywise/transaction/dto/package-info.java b/backend/src/main/java/com/pennywise/transaction/dto/package-info.java new file mode 100644 index 0000000..1d6bc26 --- /dev/null +++ b/backend/src/main/java/com/pennywise/transaction/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * Transaction domain Data Transfer Objects. + */ +package com.pennywise.transaction.dto; diff --git a/backend/src/main/java/com/pennywise/transaction/entity/package-info.java b/backend/src/main/java/com/pennywise/transaction/entity/package-info.java new file mode 100644 index 0000000..eb80b1f --- /dev/null +++ b/backend/src/main/java/com/pennywise/transaction/entity/package-info.java @@ -0,0 +1,4 @@ +/** + * Transaction domain JPA entities. + */ +package com.pennywise.transaction.entity; diff --git a/backend/src/main/java/com/pennywise/transaction/repository/package-info.java b/backend/src/main/java/com/pennywise/transaction/repository/package-info.java new file mode 100644 index 0000000..ae34bbf --- /dev/null +++ b/backend/src/main/java/com/pennywise/transaction/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * Transaction domain data access layer. + */ +package com.pennywise.transaction.repository; diff --git a/backend/src/main/java/com/pennywise/transaction/service/package-info.java b/backend/src/main/java/com/pennywise/transaction/service/package-info.java new file mode 100644 index 0000000..2efc3b2 --- /dev/null +++ b/backend/src/main/java/com/pennywise/transaction/service/package-info.java @@ -0,0 +1,4 @@ +/** + * Transaction domain business logic. + */ +package com.pennywise.transaction.service; diff --git a/backend/src/main/java/com/pennywise/user/controller/package-info.java b/backend/src/main/java/com/pennywise/user/controller/package-info.java new file mode 100644 index 0000000..ff47de1 --- /dev/null +++ b/backend/src/main/java/com/pennywise/user/controller/package-info.java @@ -0,0 +1,4 @@ +/** + * User domain REST API endpoints. + */ +package com.pennywise.user.controller; diff --git a/backend/src/main/java/com/pennywise/user/dto/package-info.java b/backend/src/main/java/com/pennywise/user/dto/package-info.java new file mode 100644 index 0000000..057a587 --- /dev/null +++ b/backend/src/main/java/com/pennywise/user/dto/package-info.java @@ -0,0 +1,4 @@ +/** + * User domain Data Transfer Objects. + */ +package com.pennywise.user.dto; diff --git a/backend/src/main/java/com/pennywise/user/entity/User.java b/backend/src/main/java/com/pennywise/user/entity/User.java new file mode 100644 index 0000000..0a29693 --- /dev/null +++ b/backend/src/main/java/com/pennywise/user/entity/User.java @@ -0,0 +1,53 @@ +package com.pennywise.user.entity; + +import jakarta.persistence.*; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; +import lombok.*; +import org.hibernate.annotations.CreationTimestamp; +import org.hibernate.annotations.UpdateTimestamp; + +import java.time.Instant; +import java.util.UUID; + +@Entity +@Table(name = "users") +@Getter +@Setter +@NoArgsConstructor +@AllArgsConstructor(access = AccessLevel.PRIVATE) +@Builder +public class User { + + @Id + @GeneratedValue(strategy = GenerationType.UUID) + private UUID id; + + @Column(name = "email") + @NotNull(message = "Email is required") + @Size(min = 1, max = 255, message = "Email must be between 1 and 255 characters") + private String email; + + @Column(name = "password_hash") + @NotNull + @Size(min = 1, max = 255, message = "Password hash must be between 1 and 255 characters") + private String passwordHash; + + @Column(name = "first_name") + @NotNull(message = "First name is required") + @Size(max = 100, message = "First name must be at most 100 characters") + private String firstName; + + @Column(name = "last_name") + @NotNull(message = "Last name is required") + @Size(max = 100, message = "Last name must be at most 100 characters") + private String lastName; + + @Column(name = "created_at", updatable = false) + @CreationTimestamp + private Instant createdAt; + + @Column(name = "updated_at") + @UpdateTimestamp + private Instant updatedAt; +} diff --git a/backend/src/main/java/com/pennywise/user/repository/package-info.java b/backend/src/main/java/com/pennywise/user/repository/package-info.java new file mode 100644 index 0000000..46b5bbb --- /dev/null +++ b/backend/src/main/java/com/pennywise/user/repository/package-info.java @@ -0,0 +1,4 @@ +/** + * User domain data access layer. + */ +package com.pennywise.user.repository; diff --git a/backend/src/main/java/com/pennywise/user/service/package-info.java b/backend/src/main/java/com/pennywise/user/service/package-info.java new file mode 100644 index 0000000..89e7414 --- /dev/null +++ b/backend/src/main/java/com/pennywise/user/service/package-info.java @@ -0,0 +1,4 @@ +/** + * User domain business logic. + */ +package com.pennywise.user.service; diff --git a/backend/src/main/resources/db/migration/V1__init.sql b/backend/src/main/resources/db/migration/V1__init.sql index fa8ea1f..c718ac1 100644 --- a/backend/src/main/resources/db/migration/V1__init.sql +++ b/backend/src/main/resources/db/migration/V1__init.sql @@ -3,7 +3,7 @@ -- Users table CREATE TABLE users ( - id BIGSERIAL PRIMARY KEY, + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), email VARCHAR(255) NOT NULL UNIQUE, password_hash VARCHAR(255) NOT NULL, first_name VARCHAR(100), diff --git a/backend/src/main/resources/db/migration/V2__create_categories.sql b/backend/src/main/resources/db/migration/V2__create_categories.sql index bb640cd..eb15d79 100644 --- a/backend/src/main/resources/db/migration/V2__create_categories.sql +++ b/backend/src/main/resources/db/migration/V2__create_categories.sql @@ -3,10 +3,10 @@ -- Each user has their own set of categories with unique names CREATE TABLE categories ( - id BIGSERIAL PRIMARY KEY, + id UUID PRIMARY KEY DEFAULT gen_random_uuid(), name VARCHAR(100) NOT NULL, - user_id BIGINT NOT NULL, - parent_id BIGINT, + user_id UUID NOT NULL, + parent_id UUID, icon VARCHAR(50), color VARCHAR(7), -- Hex color code (e.g., #FF5733) description VARCHAR(255), diff --git a/backend/src/test/java/com/pennywise/backend/BackendApplicationTests.java b/backend/src/test/java/com/pennywise/PennywiseApplicationTests.java similarity index 70% rename from backend/src/test/java/com/pennywise/backend/BackendApplicationTests.java rename to backend/src/test/java/com/pennywise/PennywiseApplicationTests.java index a583525..68703ab 100644 --- a/backend/src/test/java/com/pennywise/backend/BackendApplicationTests.java +++ b/backend/src/test/java/com/pennywise/PennywiseApplicationTests.java @@ -1,10 +1,10 @@ -package com.pennywise.backend; +package com.pennywise; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest -class BackendApplicationTests { +class PennywiseApplicationTests { @Test void contextLoads() {