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.User; import com.faf223.expensetrackerfaf.repository.CredentialRepository; import com.faf223.expensetrackerfaf.repository.ExpenseRepository; import com.faf223.expensetrackerfaf.repository.UserRepository; import com.faf223.expensetrackerfaf.util.TransactionFilter; import com.faf223.expensetrackerfaf.util.exceptions.UserNotAuthenticatedException; import com.faf223.expensetrackerfaf.util.exceptions.UserNotFoundException; import lombok.RequiredArgsConstructor; import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.security.core.userdetails.UserDetails; 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; @Service @RequiredArgsConstructor public class ExpenseService implements ITransactionService { private final ExpenseRepository expenseRepository; private final CredentialRepository credentialRepository; private final UserRepository userRepository; private final TransactionFilter transactionFilter; public void createOrUpdate(IMoneyTransaction expense) { expenseRepository.save((Expense) expense); } public List getTransactionsByEmail(String email) { Optional credential = credentialRepository.findByEmail(email); if (credential.isPresent()) { return expenseRepository.findByUser(credential.get().getUser()); } return new ArrayList<>(); } @Override public List getTransactionsByDate(LocalDate date) { return expenseRepository.findByDate(date); } @Override @SuppressWarnings("unchecked") public List getTransactionsByDate(LocalDate date, String email) { return (List) transactionFilter.filterByEmail(getTransactionsByDate(date), email); } @Override public List getTransactionsByMonth(Month month) { System.out.println(expenseRepository.filterByMonth(month.getValue())); return expenseRepository.filterByMonth(month.getValue()); } @Override @SuppressWarnings("unchecked") public List getTransactionsByMonth(Month month, String email) { return (List) transactionFilter.filterByEmail(getTransactionsByMonth(month), email); } @Override public List getLastWeekTransactions() { return expenseRepository.findLastWeek(); } @Override @SuppressWarnings("unchecked") public List getLastWeekTransactions(String email) { return (List) transactionFilter.filterByEmail(getLastWeekTransactions(), email); } @Override public List getLastMonthTransactions() { return expenseRepository.findLastMonth(); } @Override @SuppressWarnings("unchecked") public List getLastMonthTransactions(String email) { return (List) transactionFilter.filterByEmail(getLastMonthTransactions(), email); } @Override public List getYearIntervalTransactions(int start, int end) { return expenseRepository.filterByYearInterval(start, end); } @Override @SuppressWarnings("unchecked") public List getYearIntervalTransactions(String email, int start, int end) { return (List) transactionFilter.filterByEmail(getYearIntervalTransactions(start, end), email); } public List getTransactions() { return expenseRepository.findAll(); } public Expense getTransactionById(long id) { return expenseRepository.findById(id).orElse(null); } public void deleteTransactionById(long id) { expenseRepository.deleteById(id); } @Override public boolean belongsToUser(IMoneyTransaction transaction) { Authentication authentication = SecurityContextHolder.getContext().getAuthentication(); if (authentication != null && authentication.getPrincipal() instanceof UserDetails userDetails) { if(authentication.getAuthorities().stream().noneMatch(authority -> authority.getAuthority().equals("ADMIN"))) { Optional credential = credentialRepository.findByEmail(userDetails.getUsername()); if(credential.isEmpty()) throw new UserNotFoundException("The user has not been found"); Optional user = userRepository.findById(credential.get().getUser().getUserUuid()); if(user.isEmpty()) throw new UserNotFoundException("The user has not been found"); return user.get().getExpenses().contains((Expense) transaction); } } throw new UserNotAuthenticatedException("You are not authenticated"); } }