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() {