diff --git a/src/main/java/de/budgetbuddy/backend/transaction/Transaction.java b/src/main/java/de/budgetbuddy/backend/transaction/Transaction.java index 5b31d4e..7c623f6 100644 --- a/src/main/java/de/budgetbuddy/backend/transaction/Transaction.java +++ b/src/main/java/de/budgetbuddy/backend/transaction/Transaction.java @@ -1,6 +1,8 @@ package de.budgetbuddy.backend.transaction; +import de.budgetbuddy.backend.category.Category; import de.budgetbuddy.backend.paymentMethod.PaymentMethod; +import de.budgetbuddy.backend.transaction.file.TransactionFile; import de.budgetbuddy.backend.user.User; import jakarta.persistence.*; import lombok.AllArgsConstructor; @@ -10,6 +12,7 @@ import org.hibernate.annotations.ColumnDefault; import java.util.Date; +import java.util.List; import java.util.UUID; @Entity @@ -48,23 +51,15 @@ public class Transaction { @Column(name = "transfer_amount", nullable = false) private Double transferAmount; + @OneToMany(mappedBy = "transaction", cascade = CascadeType.ALL) + private List attachedFiles; + @Column(name = "created_at", nullable = false, updatable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") @ColumnDefault("CURRENT_TIMESTAMP") private Date createdAt; public Transaction() {} - public Transaction(User owner, de.budgetbuddy.backend.category.Category category, PaymentMethod paymentMethod, Date processedAt, String receiver, String description, Double transferAmount) { - this.owner = owner; - this.category = category; - this.paymentMethod = paymentMethod; - this.processedAt = processedAt; - this.receiver = receiver; - this.description = description; - this.transferAmount = transferAmount; - this.createdAt = new Date(); - } - public Transaction.Delete toDelete() { return new Transaction.Delete(this.id); } diff --git a/src/main/java/de/budgetbuddy/backend/transaction/TransactionController.java b/src/main/java/de/budgetbuddy/backend/transaction/TransactionController.java index 7116a5b..b19454f 100644 --- a/src/main/java/de/budgetbuddy/backend/transaction/TransactionController.java +++ b/src/main/java/de/budgetbuddy/backend/transaction/TransactionController.java @@ -3,6 +3,7 @@ import com.fasterxml.jackson.core.JsonProcessingException; import de.budgetbuddy.backend.ApiResponse; import de.budgetbuddy.backend.auth.AuthorizationInterceptor; +import de.budgetbuddy.backend.category.Category; import de.budgetbuddy.backend.category.CategoryRepository; import de.budgetbuddy.backend.paymentMethod.PaymentMethod; import de.budgetbuddy.backend.paymentMethod.PaymentMethodRepository; @@ -29,7 +30,11 @@ public class TransactionController { private final TransactionRepository transactionRepository; private final TransactionService transactionService; - public TransactionController(UserRepository userRepository, CategoryRepository categoryRepository, PaymentMethodRepository paymentMethodRepository, SubscriptionRepository subscriptionRepository, TransactionRepository transactionRepository) { + public TransactionController(UserRepository userRepository, + CategoryRepository categoryRepository, + PaymentMethodRepository paymentMethodRepository, + SubscriptionRepository subscriptionRepository, + TransactionRepository transactionRepository) { this.userRepository = userRepository; this.categoryRepository = categoryRepository; this.paymentMethodRepository = paymentMethodRepository; @@ -63,35 +68,40 @@ public ResponseEntity>> createTransaction(@Request && !sessionUser.getRole().isGreaterOrEqualThan(RolePermission.SERVICE_ACCOUNT)) { return ResponseEntity .status(HttpStatus.CONFLICT) - .body(new ApiResponse<>(HttpStatus.CONFLICT.value(), "You don't have the permissions to create transactions for a different user")); + .body(new ApiResponse<>( + HttpStatus.CONFLICT.value(), + "You don't have the permissions to create transactions for a different user")); } - Optional optCategory = categoryRepository + Optional optCategory = categoryRepository .findByIdAndOwner(transactionAttrs.getCategoryId(), transactionOwner); if (optCategory.isEmpty()) { return ResponseEntity .status(HttpStatus.NOT_FOUND) - .body(new ApiResponse<>(HttpStatus.NOT_FOUND.value(), "Provided category not found")); + .body(new ApiResponse<>( + HttpStatus.NOT_FOUND.value(), + "Provided category not found")); } - Optional optPaymentMethod = paymentMethodRepository.findByIdAndOwner(transactionAttrs.getPaymentMethodId(), transactionOwner); + Optional optPaymentMethod = paymentMethodRepository + .findByIdAndOwner(transactionAttrs.getPaymentMethodId(), transactionOwner); if (optPaymentMethod.isEmpty()) { return ResponseEntity .status(HttpStatus.NOT_FOUND) - .body(new ApiResponse<>(HttpStatus.NOT_FOUND.value(), "Provided payment-method not found")); + .body(new ApiResponse<>( + HttpStatus.NOT_FOUND.value(), + "Provided payment-method not found")); } - Transaction transaction = new Transaction( - transactionOwner, - optCategory.get(), - optPaymentMethod.get(), - transactionAttrs.getProcessedAt(), - transactionAttrs.getReceiver(), - transactionAttrs.getDescription(), - transactionAttrs.getTransferAmount() - ); - - transactions.add(transaction); + transactions.add(Transaction.builder() + .owner(transactionOwner) + .category(optCategory.get()) + .paymentMethod(optPaymentMethod.get()) + .processedAt(transactionAttrs.getProcessedAt()) + .receiver(transactionAttrs.getReceiver()) + .description(transactionAttrs.getDescription()) + .transferAmount(transactionAttrs.getTransferAmount()) + .build()); } return ResponseEntity @@ -100,7 +110,8 @@ public ResponseEntity>> createTransaction(@Request } @GetMapping - public ResponseEntity>> getTransactionsByUuid(@RequestParam UUID uuid, HttpSession session) throws JsonProcessingException { + public ResponseEntity>> getTransactionsByUuid(@RequestParam UUID uuid, + HttpSession session) throws JsonProcessingException { Optional user = userRepository.findById(uuid); if (user.isEmpty()) { return ResponseEntity @@ -129,7 +140,8 @@ public ResponseEntity>> getTransactionsByUuid(@Req } @PutMapping - public ResponseEntity> updateTransaction(@RequestBody Transaction.Update payload, HttpSession session) throws JsonProcessingException { + public ResponseEntity> updateTransaction(@RequestBody Transaction.Update payload, + HttpSession session) throws JsonProcessingException { Optional optTransaction = transactionRepository.findById(payload.getTransactionId()); if (optTransaction.isEmpty()) { return ResponseEntity @@ -145,38 +157,44 @@ public ResponseEntity> updateTransaction(@RequestBody T } else if (!optSessionUser.get().getUuid().equals(transactionOwner.getUuid())) { return ResponseEntity .status(HttpStatus.CONFLICT) - .body(new ApiResponse<>(HttpStatus.CONFLICT.value(), "You don't own this transaction")); + .body(new ApiResponse<>( + HttpStatus.CONFLICT.value(), + "You don't own this transaction")); } - Optional optCategory = categoryRepository.findByIdAndOwner(payload.getCategoryId(), transactionOwner); + Optional optCategory = categoryRepository + .findByIdAndOwner(payload.getCategoryId(), transactionOwner); if (optCategory.isEmpty()) { return ResponseEntity .status(HttpStatus.NOT_FOUND) - .body(new ApiResponse<>(HttpStatus.NOT_FOUND.value(), "Provided category not found")); + .body(new ApiResponse<>( + HttpStatus.NOT_FOUND.value(), + "Provided category not found")); } - Optional optPaymentMethod = paymentMethodRepository.findByIdAndOwner(payload.getPaymentMethodId(), transactionOwner); + Optional optPaymentMethod = paymentMethodRepository + .findByIdAndOwner(payload.getPaymentMethodId(), transactionOwner); if (optPaymentMethod.isEmpty()) { return ResponseEntity .status(HttpStatus.NOT_FOUND) - .body(new ApiResponse<>(HttpStatus.NOT_FOUND.value(), "Provided payment-method not found")); + .body(new ApiResponse<>( + HttpStatus.NOT_FOUND.value(), + "Provided payment-method not found")); } - Transaction updatedTransaction = new Transaction( - transaction.getId(), - transactionOwner, - optCategory.get(), - optPaymentMethod.get(), - payload.getProcessedAt(), - payload.getReceiver(), - payload.getDescription(), - payload.getTransferAmount(), - transaction.getCreatedAt() - ); - return ResponseEntity .status(HttpStatus.OK) - .body(new ApiResponse<>(transactionRepository.save(updatedTransaction))); + .body(new ApiResponse<>(transactionRepository.save(Transaction.builder() + .id(transaction.getId()) + .owner(transactionOwner) + .category(optCategory.get()) + .paymentMethod(optPaymentMethod.get()) + .processedAt(payload.getProcessedAt()) + .receiver(payload.getReceiver()) + .description(payload.getDescription()) + .transferAmount(payload.getTransferAmount()) + .createdAt(transaction.getCreatedAt()) + .build()))); } @DeleteMapping diff --git a/src/main/java/de/budgetbuddy/backend/transaction/file/TransactionFile.java b/src/main/java/de/budgetbuddy/backend/transaction/file/TransactionFile.java new file mode 100644 index 0000000..b40972f --- /dev/null +++ b/src/main/java/de/budgetbuddy/backend/transaction/file/TransactionFile.java @@ -0,0 +1,55 @@ +package de.budgetbuddy.backend.transaction.file; + +import com.fasterxml.jackson.annotation.JsonIgnore; +import de.budgetbuddy.backend.transaction.Transaction; +import de.budgetbuddy.backend.user.User; +import jakarta.persistence.*; +import lombok.AllArgsConstructor; +import lombok.Builder; +import lombok.Data; +import lombok.NoArgsConstructor; +import org.hibernate.annotations.ColumnDefault; + +import java.util.Date; +import java.util.UUID; + +@Entity +@Table(name = "transaction_file", schema = "public") +@Data +@Builder +@AllArgsConstructor +@NoArgsConstructor +public class TransactionFile { + + @Id + @GeneratedValue + @Column(columnDefinition = "uuid", updatable = false, nullable = false) + private UUID uuid; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "owner") + private User owner; + + @JsonIgnore + @ManyToOne + @JoinColumn(name = "transaction") + private Transaction transaction; + + @Column(name = "file_name") + private String fileName; + + @Column(name = "file_size") + private int fileSize; + + @Column(name = "mimetype", length = 20) + private String mimeType; + + @Column(name = "location", length = 100) + private String location; + + @Column(name = "created_at", nullable = false, updatable = false, columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP") + @ColumnDefault("CURRENT_TIMESTAMP") + private Date createdAt = new Date(); + +} diff --git a/src/main/java/de/budgetbuddy/backend/transaction/file/TransactionFileRepository.java b/src/main/java/de/budgetbuddy/backend/transaction/file/TransactionFileRepository.java new file mode 100644 index 0000000..b524732 --- /dev/null +++ b/src/main/java/de/budgetbuddy/backend/transaction/file/TransactionFileRepository.java @@ -0,0 +1,8 @@ +package de.budgetbuddy.backend.transaction.file; + +import org.springframework.data.jpa.repository.JpaRepository; + +import java.util.UUID; + +public interface TransactionFileRepository extends JpaRepository { +}