diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index b783918..54a7e38 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -19,8 +19,11 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; +import java.time.Month; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @RestController @@ -80,14 +83,19 @@ public class ExpenseController { } @GetMapping("/personal-expenses") - public ResponseEntity> getExpensesByUser() { + public ResponseEntity> getExpensesByUser(@RequestParam Optional date, + @RequestParam Optional month) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { String email = userDetails.getUsername(); - List expenses = expenseService.getTransactionsByEmail(email).stream().map(expenseMapper::toDto).collect(Collectors.toList()); + List expenses; + + expenses = date.map(localDate -> expenseService.getTransactionsByDate(localDate).stream().map(expenseMapper::toDto).toList()) + .orElseGet(() -> month.map(value -> expenseService.getTransactionsByMonth(value).stream().map(expenseMapper::toDto).toList()) + .orElseGet(() -> expenseService.getTransactionsByEmail(email).stream().map(expenseMapper::toDto).toList())); if (!expenses.isEmpty()) { return ResponseEntity.ok(expenses); diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java index caaf2d9..b6bd9cc 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -1,5 +1,6 @@ package com.faf223.expensetrackerfaf.controller; +import com.faf223.expensetrackerfaf.dto.ExpenseDTO; import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO; import com.faf223.expensetrackerfaf.dto.IncomeDTO; import com.faf223.expensetrackerfaf.dto.mappers.IncomeMapper; @@ -17,8 +18,11 @@ import org.springframework.security.core.userdetails.UserDetails; import org.springframework.validation.BindingResult; import org.springframework.web.bind.annotation.*; +import java.time.LocalDate; +import java.time.Month; import java.util.Collections; import java.util.List; +import java.util.Optional; import java.util.stream.Collectors; @RestController @@ -96,6 +100,31 @@ public class IncomeController { return ResponseEntity.notFound().build(); } + @GetMapping("/personal-incomes") + public ResponseEntity> getExpensesByUser(@RequestParam Optional date, + @RequestParam Optional month) { + + Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); + + if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { + + String email = userDetails.getUsername(); + List incomes; + + incomes = date.map(localDate -> incomeService.getTransactionsByDate(localDate).stream().map(incomeMapper::toDto).toList()) + .orElseGet(() -> month.map(value -> incomeService.getTransactionsByMonth(value).stream().map(incomeMapper::toDto).toList()) + .orElseGet(() -> incomeService.getTransactionsByEmail(email).stream().map(incomeMapper::toDto).toList())); + + if (!incomes.isEmpty()) { + return ResponseEntity.ok(incomes); + } else { + return ResponseEntity.ok(Collections.emptyList()); + } + } + + return ResponseEntity.notFound().build(); + } + @GetMapping("/categories") public ResponseEntity> getAllCategories() { List categories = incomeCategoryService.getAllCategories(); diff --git a/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java b/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java index f96f68e..e9bbaa7 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java +++ b/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java @@ -5,9 +5,13 @@ import com.faf223.expensetrackerfaf.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.List; @Repository public interface ExpenseRepository extends JpaRepository { List findByUser(User user); + List findByDate(LocalDate date); + + List findByDateBetween(LocalDate start, LocalDate end); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java b/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java index 3f4f94d..48b038d 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java +++ b/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java @@ -5,9 +5,13 @@ import com.faf223.expensetrackerfaf.model.User; import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.stereotype.Repository; +import java.time.LocalDate; import java.util.List; @Repository public interface IncomeRepository extends JpaRepository { List findByUser(User user); + List findByDate(LocalDate date); + + List findByDateBetween(LocalDate start, LocalDate end); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java index 9ce7961..1dfb483 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java @@ -8,6 +8,8 @@ import com.faf223.expensetrackerfaf.repository.ExpenseRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.Month; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -33,6 +35,20 @@ public class ExpenseService implements ITransactionService { return new ArrayList<>(); } + @Override + public List getTransactionsByDate(LocalDate date) { + return expenseRepository.findByDate(date); + } + + // TODO: store transaction month in a separate field in the DB and change this logic + @Override + public List getTransactionsByMonth(Month month) { + LocalDate startOfMonth = LocalDate.of(LocalDate.now().getYear(), month, 1); + LocalDate endOfMonth = startOfMonth.plusMonths(1).minusDays(1); + + return expenseRepository.findByDateBetween(startOfMonth, endOfMonth); + } + public List getTransactions() { return expenseRepository.findAll(); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java index bdfe091..953fcee 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ITransactionService.java @@ -2,6 +2,8 @@ package com.faf223.expensetrackerfaf.service; import com.faf223.expensetrackerfaf.model.IMoneyTransaction; +import java.time.LocalDate; +import java.time.Month; import java.util.List; public interface ITransactionService { @@ -9,6 +11,8 @@ public interface ITransactionService { void createOrUpdate(IMoneyTransaction transaction); List getTransactions(); List getTransactionsByEmail(String email); + List getTransactionsByDate(LocalDate date); + List getTransactionsByMonth(Month month); IMoneyTransaction getTransactionById(long id); void deleteTransactionById(long it); diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java index 3ad7973..6ae4479 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java @@ -1,6 +1,7 @@ package com.faf223.expensetrackerfaf.service; import com.faf223.expensetrackerfaf.model.Credential; +import com.faf223.expensetrackerfaf.model.Expense; import com.faf223.expensetrackerfaf.model.IMoneyTransaction; import com.faf223.expensetrackerfaf.model.Income; import com.faf223.expensetrackerfaf.repository.CredentialRepository; @@ -8,6 +9,8 @@ import com.faf223.expensetrackerfaf.repository.IncomeRepository; import lombok.RequiredArgsConstructor; import org.springframework.stereotype.Service; +import java.time.LocalDate; +import java.time.Month; import java.util.ArrayList; import java.util.List; import java.util.Optional; @@ -37,6 +40,20 @@ public class IncomeService implements ITransactionService { return new ArrayList<>(); } + @Override + public List getTransactionsByDate(LocalDate date) { + return incomeRepository.findByDate(date); + } + + // TODO: store transaction month in a separate field in the DB and change this logic + @Override + public List getTransactionsByMonth(Month month) { + LocalDate startOfMonth = LocalDate.of(LocalDate.now().getYear(), month, 1); + LocalDate endOfMonth = startOfMonth.plusMonths(1).minusDays(1); + + return incomeRepository.findByDateBetween(startOfMonth, endOfMonth); + } + public Income getTransactionById(long id) { return incomeRepository.findById(id).orElse(null); }