add possibility to get expenses by date and month
This commit is contained in:
@@ -19,8 +19,11 @@ import org.springframework.security.core.userdetails.UserDetails;
|
|||||||
import org.springframework.validation.BindingResult;
|
import org.springframework.validation.BindingResult;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.Month;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@@ -80,14 +83,19 @@ public class ExpenseController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/personal-expenses")
|
@GetMapping("/personal-expenses")
|
||||||
public ResponseEntity<List<ExpenseDTO>> getExpensesByUser() {
|
public ResponseEntity<List<ExpenseDTO>> getExpensesByUser(@RequestParam Optional<LocalDate> date,
|
||||||
|
@RequestParam Optional<Month> month) {
|
||||||
|
|
||||||
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||||
|
|
||||||
if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) {
|
if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) {
|
||||||
|
|
||||||
String email = userDetails.getUsername();
|
String email = userDetails.getUsername();
|
||||||
List<ExpenseDTO> expenses = expenseService.getTransactionsByEmail(email).stream().map(expenseMapper::toDto).collect(Collectors.toList());
|
List<ExpenseDTO> 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()) {
|
if (!expenses.isEmpty()) {
|
||||||
return ResponseEntity.ok(expenses);
|
return ResponseEntity.ok(expenses);
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package com.faf223.expensetrackerfaf.controller;
|
package com.faf223.expensetrackerfaf.controller;
|
||||||
|
|
||||||
|
import com.faf223.expensetrackerfaf.dto.ExpenseDTO;
|
||||||
import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO;
|
import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO;
|
||||||
import com.faf223.expensetrackerfaf.dto.IncomeDTO;
|
import com.faf223.expensetrackerfaf.dto.IncomeDTO;
|
||||||
import com.faf223.expensetrackerfaf.dto.mappers.IncomeMapper;
|
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.validation.BindingResult;
|
||||||
import org.springframework.web.bind.annotation.*;
|
import org.springframework.web.bind.annotation.*;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.Month;
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
import java.util.Optional;
|
||||||
import java.util.stream.Collectors;
|
import java.util.stream.Collectors;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@@ -96,6 +100,31 @@ public class IncomeController {
|
|||||||
return ResponseEntity.notFound().build();
|
return ResponseEntity.notFound().build();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/personal-incomes")
|
||||||
|
public ResponseEntity<List<IncomeDTO>> getExpensesByUser(@RequestParam Optional<LocalDate> date,
|
||||||
|
@RequestParam Optional<Month> month) {
|
||||||
|
|
||||||
|
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
|
||||||
|
|
||||||
|
if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) {
|
||||||
|
|
||||||
|
String email = userDetails.getUsername();
|
||||||
|
List<IncomeDTO> 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")
|
@GetMapping("/categories")
|
||||||
public ResponseEntity<List<IncomeCategory>> getAllCategories() {
|
public ResponseEntity<List<IncomeCategory>> getAllCategories() {
|
||||||
List<IncomeCategory> categories = incomeCategoryService.getAllCategories();
|
List<IncomeCategory> categories = incomeCategoryService.getAllCategories();
|
||||||
|
|||||||
@@ -5,9 +5,13 @@ import com.faf223.expensetrackerfaf.model.User;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface ExpenseRepository extends JpaRepository<Expense, Long> {
|
public interface ExpenseRepository extends JpaRepository<Expense, Long> {
|
||||||
List<Expense> findByUser(User user);
|
List<Expense> findByUser(User user);
|
||||||
|
List<Expense> findByDate(LocalDate date);
|
||||||
|
|
||||||
|
List<Expense> findByDateBetween(LocalDate start, LocalDate end);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,9 +5,13 @@ import com.faf223.expensetrackerfaf.model.User;
|
|||||||
import org.springframework.data.jpa.repository.JpaRepository;
|
import org.springframework.data.jpa.repository.JpaRepository;
|
||||||
import org.springframework.stereotype.Repository;
|
import org.springframework.stereotype.Repository;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
@Repository
|
@Repository
|
||||||
public interface IncomeRepository extends JpaRepository<Income, Long> {
|
public interface IncomeRepository extends JpaRepository<Income, Long> {
|
||||||
List<Income> findByUser(User user);
|
List<Income> findByUser(User user);
|
||||||
|
List<Income> findByDate(LocalDate date);
|
||||||
|
|
||||||
|
List<Income> findByDateBetween(LocalDate start, LocalDate end);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -8,6 +8,8 @@ import com.faf223.expensetrackerfaf.repository.ExpenseRepository;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.Month;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -33,6 +35,20 @@ public class ExpenseService implements ITransactionService {
|
|||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Expense> 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<Expense> 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<Expense> getTransactions() {
|
public List<Expense> getTransactions() {
|
||||||
return expenseRepository.findAll();
|
return expenseRepository.findAll();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ package com.faf223.expensetrackerfaf.service;
|
|||||||
|
|
||||||
import com.faf223.expensetrackerfaf.model.IMoneyTransaction;
|
import com.faf223.expensetrackerfaf.model.IMoneyTransaction;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.Month;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
public interface ITransactionService {
|
public interface ITransactionService {
|
||||||
@@ -9,6 +11,8 @@ public interface ITransactionService {
|
|||||||
void createOrUpdate(IMoneyTransaction transaction);
|
void createOrUpdate(IMoneyTransaction transaction);
|
||||||
List<? extends IMoneyTransaction> getTransactions();
|
List<? extends IMoneyTransaction> getTransactions();
|
||||||
List<? extends IMoneyTransaction> getTransactionsByEmail(String email);
|
List<? extends IMoneyTransaction> getTransactionsByEmail(String email);
|
||||||
|
List<? extends IMoneyTransaction> getTransactionsByDate(LocalDate date);
|
||||||
|
List<? extends IMoneyTransaction> getTransactionsByMonth(Month month);
|
||||||
IMoneyTransaction getTransactionById(long id);
|
IMoneyTransaction getTransactionById(long id);
|
||||||
void deleteTransactionById(long it);
|
void deleteTransactionById(long it);
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
package com.faf223.expensetrackerfaf.service;
|
package com.faf223.expensetrackerfaf.service;
|
||||||
|
|
||||||
import com.faf223.expensetrackerfaf.model.Credential;
|
import com.faf223.expensetrackerfaf.model.Credential;
|
||||||
|
import com.faf223.expensetrackerfaf.model.Expense;
|
||||||
import com.faf223.expensetrackerfaf.model.IMoneyTransaction;
|
import com.faf223.expensetrackerfaf.model.IMoneyTransaction;
|
||||||
import com.faf223.expensetrackerfaf.model.Income;
|
import com.faf223.expensetrackerfaf.model.Income;
|
||||||
import com.faf223.expensetrackerfaf.repository.CredentialRepository;
|
import com.faf223.expensetrackerfaf.repository.CredentialRepository;
|
||||||
@@ -8,6 +9,8 @@ import com.faf223.expensetrackerfaf.repository.IncomeRepository;
|
|||||||
import lombok.RequiredArgsConstructor;
|
import lombok.RequiredArgsConstructor;
|
||||||
import org.springframework.stereotype.Service;
|
import org.springframework.stereotype.Service;
|
||||||
|
|
||||||
|
import java.time.LocalDate;
|
||||||
|
import java.time.Month;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Optional;
|
import java.util.Optional;
|
||||||
@@ -37,6 +40,20 @@ public class IncomeService implements ITransactionService {
|
|||||||
return new ArrayList<>();
|
return new ArrayList<>();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public List<Income> 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<Income> 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) {
|
public Income getTransactionById(long id) {
|
||||||
return incomeRepository.findById(id).orElse(null);
|
return incomeRepository.findById(id).orElse(null);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user