diff --git a/pom.xml b/pom.xml index 02f1b6f..89d0a60 100644 --- a/pom.xml +++ b/pom.xml @@ -38,10 +38,12 @@ spring-boot-starter-test test + org.springframework.boot spring-boot-starter-security + org.projectlombok lombok diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java index 1f8b092..7f8fa2d 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/ExpenseController.java @@ -1,15 +1,18 @@ package com.faf223.expensetrackerfaf.controller; +import com.faf223.expensetrackerfaf.dto.ExpenseCreationDTO; +import com.faf223.expensetrackerfaf.dto.ExpenseDTO; +import com.faf223.expensetrackerfaf.dto.mappers.ExpenseMapper; import com.faf223.expensetrackerfaf.model.Expense; import com.faf223.expensetrackerfaf.service.ExpenseService; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.stream.Collectors; @RestController @RequestMapping("/expenses") @@ -17,15 +20,44 @@ import java.util.List; public class ExpenseController { private final ExpenseService expenseService; + private final ExpenseMapper expenseMapper; - @GetMapping("/user/{userUuid}") - public ResponseEntity> getExpensesByUser(@PathVariable String userUuid) { - List expenses = expenseService.getExpensesByUserId(userUuid); - if (!expenses.isEmpty()) { - return ResponseEntity.ok(expenses); + @GetMapping() + public ResponseEntity> getAllExpenses() { + List expenses = expenseService.getExpenses().stream().map(expenseMapper::toDto).collect(Collectors.toList()); + if (!expenses.isEmpty()) return ResponseEntity.ok(expenses); + else return ResponseEntity.notFound().build(); + } + + @PostMapping() + public ResponseEntity createNewExpense(@RequestBody ExpenseCreationDTO expenseDTO, + BindingResult bindingResult) { + Expense expense = expenseMapper.toExpense(expenseDTO); + if (!bindingResult.hasErrors()) { + expenseService.createOrUpdateExpense(expense); + return ResponseEntity.ok(expenseMapper.toDto(expense)); } else { return ResponseEntity.notFound().build(); } } + + @PatchMapping() + public ResponseEntity updateExpense(@RequestBody ExpenseCreationDTO expenseDTO, + BindingResult bindingResult) { + Expense expense = expenseMapper.toExpense(expenseDTO); + if (!bindingResult.hasErrors()) { + expenseService.createOrUpdateExpense(expense); + return ResponseEntity.ok(expenseMapper.toDto(expense)); + } else { + return ResponseEntity.notFound().build(); + } + } + + @GetMapping("/{userUuid}") + public ResponseEntity> getExpensesByUser(@PathVariable String userUuid) { + List expenses = expenseService.getExpensesByUserId(userUuid).stream().map(expenseMapper::toDto).collect(Collectors.toList()); + if (!expenses.isEmpty()) return ResponseEntity.ok(expenses); + else return ResponseEntity.notFound().build(); + } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java index 69cb37b..582062e 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/IncomeController.java @@ -1,15 +1,18 @@ package com.faf223.expensetrackerfaf.controller; +import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO; +import com.faf223.expensetrackerfaf.dto.IncomeDTO; +import com.faf223.expensetrackerfaf.dto.mappers.IncomeMapper; import com.faf223.expensetrackerfaf.model.Income; import com.faf223.expensetrackerfaf.service.IncomeService; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; import java.util.List; +import java.util.stream.Collectors; @RestController @RequestMapping("/incomes") @@ -17,15 +20,44 @@ import java.util.List; public class IncomeController { private final IncomeService incomeService; + private final IncomeMapper incomeMapper; - @GetMapping("/user/{userUuid}") - public ResponseEntity> getIncomesByUser(@PathVariable String userUuid) { - List incomes = incomeService.getIncomesByUserId(userUuid); - if (!incomes.isEmpty()) { - return ResponseEntity.ok(incomes); + @GetMapping() + public ResponseEntity> getAllIncomes() { + List incomes = incomeService.getIncomes().stream().map(incomeMapper::toDto).collect(Collectors.toList()); + if (!incomes.isEmpty()) return ResponseEntity.ok(incomes); + else return ResponseEntity.notFound().build(); + } + + @PostMapping() + public ResponseEntity createNewIncome(@RequestBody IncomeCreationDTO incomeDTO, + BindingResult bindingResult) { + Income income = incomeMapper.toIncome(incomeDTO); + if (!bindingResult.hasErrors()) { + incomeService.createOrUpdateIncome(income); + return ResponseEntity.ok(incomeMapper.toDto(income)); } else { return ResponseEntity.notFound().build(); } } + + @PatchMapping() + public ResponseEntity updateIncome(@RequestBody IncomeCreationDTO incomeDTO, + BindingResult bindingResult) { + Income income = incomeMapper.toIncome(incomeDTO); + if (!bindingResult.hasErrors()) { + incomeService.createOrUpdateIncome(income); + return ResponseEntity.ok(incomeMapper.toDto(income)); + } else { + return ResponseEntity.notFound().build(); + } + } + + @GetMapping("/{userUuid}") + public ResponseEntity> getIncomesByUser(@PathVariable String userUuid) { + List incomes = incomeService.getIncomesByUserId(userUuid).stream().map(incomeMapper::toDto).collect(Collectors.toList()); + if (!incomes.isEmpty()) return ResponseEntity.ok(incomes); + else return ResponseEntity.notFound().build(); + } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java b/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java index b9724fb..542ccbc 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java +++ b/src/main/java/com/faf223/expensetrackerfaf/controller/UserController.java @@ -1,13 +1,15 @@ package com.faf223.expensetrackerfaf.controller; +import com.faf223.expensetrackerfaf.dto.UserCreationDTO; +import com.faf223.expensetrackerfaf.dto.UserDTO; +import com.faf223.expensetrackerfaf.dto.mappers.UserMapper; import com.faf223.expensetrackerfaf.model.User; import com.faf223.expensetrackerfaf.service.UserService; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; -import org.springframework.web.bind.annotation.RequestMapping; -import org.springframework.web.bind.annotation.RestController; +import org.springframework.validation.BindingResult; +import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/users") @@ -15,16 +17,37 @@ import org.springframework.web.bind.annotation.RestController; public class UserController { private final UserService userService; + private final UserMapper userMapper; - @GetMapping("/{userUuid}") - public ResponseEntity getUser(@PathVariable String userUuid) { - // TODO: Create a DTO class that will be returned instead of User(password: null and uuid are returned inside of the user object) - User user = userService.getUserById(userUuid); - if (user != null) { - return ResponseEntity.ok(user); + @PostMapping() + public ResponseEntity createNewUser(@RequestBody UserCreationDTO userDTO, + BindingResult bindingResult) { + User user = userMapper.toUser(userDTO); + if (!bindingResult.hasErrors()) { + userService.createOrUpdateUser(user); + return ResponseEntity.ok(userMapper.toDto(user)); } else { return ResponseEntity.notFound().build(); } } + + @PatchMapping() + public ResponseEntity updateUser(@RequestBody UserCreationDTO userDTO, + BindingResult bindingResult) { + User user = userMapper.toUser(userDTO); + if (!bindingResult.hasErrors()) { + userService.createOrUpdateUser(user); + return ResponseEntity.ok(userMapper.toDto(user)); + } else { + return ResponseEntity.notFound().build(); + } + } + + @GetMapping("/{userUuid}") + public ResponseEntity getUser(@PathVariable String userUuid) { + User user = userService.getUserById(userUuid); + if (user != null) return ResponseEntity.ok(userMapper.toDto(user)); + else return ResponseEntity.notFound().build(); + } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseCreationDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseCreationDTO.java new file mode 100644 index 0000000..3042800 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseCreationDTO.java @@ -0,0 +1,12 @@ +package com.faf223.expensetrackerfaf.dto; + +import com.faf223.expensetrackerfaf.model.User; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class ExpenseCreationDTO { + private long expenseId; + private User user; +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java new file mode 100644 index 0000000..b18643a --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/ExpenseDTO.java @@ -0,0 +1,18 @@ +package com.faf223.expensetrackerfaf.dto; + +import com.faf223.expensetrackerfaf.model.ExpenseCategory; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@Data +@AllArgsConstructor +public class ExpenseDTO { + private long expenseId; + private UserDTO userDTO; + private ExpenseCategory expenseCategory; + private LocalDate date; + private BigDecimal amount; +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeCreationDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeCreationDTO.java new file mode 100644 index 0000000..e35c522 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeCreationDTO.java @@ -0,0 +1,12 @@ +package com.faf223.expensetrackerfaf.dto; + +import com.faf223.expensetrackerfaf.model.User; +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class IncomeCreationDTO { + private long incomeId; + private User userDTO; +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java new file mode 100644 index 0000000..3ee4998 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/IncomeDTO.java @@ -0,0 +1,18 @@ +package com.faf223.expensetrackerfaf.dto; + +import com.faf223.expensetrackerfaf.model.IncomeCategory; +import lombok.AllArgsConstructor; +import lombok.Data; + +import java.math.BigDecimal; +import java.time.LocalDate; + +@Data +@AllArgsConstructor +public class IncomeDTO { + private long incomeId; + private UserDTO userDTO; + private IncomeCategory category; + private LocalDate date; + private BigDecimal amount; +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/UserCreationDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/UserCreationDTO.java new file mode 100644 index 0000000..b947426 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/UserCreationDTO.java @@ -0,0 +1,10 @@ +package com.faf223.expensetrackerfaf.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UserCreationDTO { + private String uuid; +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/UserDTO.java b/src/main/java/com/faf223/expensetrackerfaf/dto/UserDTO.java new file mode 100644 index 0000000..9f79253 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/UserDTO.java @@ -0,0 +1,13 @@ +package com.faf223.expensetrackerfaf.dto; + +import lombok.AllArgsConstructor; +import lombok.Data; + +@Data +@AllArgsConstructor +public class UserDTO { + private String uuid; + private String name; + private String surname; + private String username; +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java new file mode 100644 index 0000000..7e91e8b --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/ExpenseMapper.java @@ -0,0 +1,31 @@ +package com.faf223.expensetrackerfaf.dto.mappers; + +import com.faf223.expensetrackerfaf.dto.ExpenseCreationDTO; +import com.faf223.expensetrackerfaf.dto.ExpenseDTO; +import com.faf223.expensetrackerfaf.model.Expense; +import com.faf223.expensetrackerfaf.service.ExpenseService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class ExpenseMapper { + + private final ExpenseService expenseService; + private final UserMapper userMapper; + + @Autowired + public ExpenseMapper(ExpenseService expenseService, UserMapper userMapper) { + this.expenseService = expenseService; + this.userMapper = userMapper; + } + + public ExpenseDTO toDto(Expense expense) { + return new ExpenseDTO(expense.getExpenseId(), userMapper.toDto(expense.getUser()), + expense.getCategory(), expense.getDate(), expense.getAmount()); + } + + public Expense toExpense(ExpenseCreationDTO expenseDTO) { + return expenseService.getExpenseById(expenseDTO.getExpenseId()); + } + +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java new file mode 100644 index 0000000..91c08d3 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/IncomeMapper.java @@ -0,0 +1,31 @@ +package com.faf223.expensetrackerfaf.dto.mappers; + +import com.faf223.expensetrackerfaf.dto.IncomeCreationDTO; +import com.faf223.expensetrackerfaf.dto.IncomeDTO; +import com.faf223.expensetrackerfaf.model.Income; +import com.faf223.expensetrackerfaf.service.IncomeService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class IncomeMapper { + + private final IncomeService incomeService; + private final UserMapper userMapper; + + @Autowired + public IncomeMapper(IncomeService incomeService, UserMapper userMapper) { + this.incomeService = incomeService; + this.userMapper = userMapper; + } + + public IncomeDTO toDto(Income income) { + return new IncomeDTO(income.getIncomeId(), userMapper.toDto(income.getUser()), + income.getCategory(), income.getDate(), income.getAmount()); + } + + public Income toIncome(IncomeCreationDTO incomeDTO) { + return incomeService.getIncomeById(incomeDTO.getIncomeId()); + } + +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/UserMapper.java b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/UserMapper.java new file mode 100644 index 0000000..a403a24 --- /dev/null +++ b/src/main/java/com/faf223/expensetrackerfaf/dto/mappers/UserMapper.java @@ -0,0 +1,28 @@ +package com.faf223.expensetrackerfaf.dto.mappers; + +import com.faf223.expensetrackerfaf.dto.UserCreationDTO; +import com.faf223.expensetrackerfaf.dto.UserDTO; +import com.faf223.expensetrackerfaf.model.User; +import com.faf223.expensetrackerfaf.service.UserService; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +@Component +public class UserMapper { + + private final UserService userService; + + @Autowired + public UserMapper(UserService userService) { + this.userService = userService; + } + + public UserDTO toDto(User user) { + return new UserDTO(user.getUuid(), user.getName(), user.getSurname(), user.getUsername()); + } + + public User toUser(UserCreationDTO userDTO) { + return userService.getUserById(userDTO.getUuid()); + } + +} diff --git a/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java b/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java index 4cd39d0..38fb2fb 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java +++ b/src/main/java/com/faf223/expensetrackerfaf/repository/ExpenseRepository.java @@ -8,5 +8,5 @@ import java.util.List; @Repository public interface ExpenseRepository extends JpaRepository { - List findByUserUserUuid(String userUuid); + List findByUserUuid(String userUuid); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java b/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java index 9a1a592..2f199af 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java +++ b/src/main/java/com/faf223/expensetrackerfaf/repository/IncomeRepository.java @@ -8,5 +8,5 @@ import java.util.List; @Repository public interface IncomeRepository extends JpaRepository { - List findByUserUserUuid(String userUuid); + List findByUserUuid(String userUuid); } diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java index 5838dc0..19ab2c2 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/ExpenseService.java @@ -3,6 +3,7 @@ package com.faf223.expensetrackerfaf.service; import com.faf223.expensetrackerfaf.model.Expense; import com.faf223.expensetrackerfaf.repository.ExpenseRepository; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -13,7 +14,19 @@ public class ExpenseService { private final ExpenseRepository expenseRepository; + public void createOrUpdateExpense(Expense expense) { + expenseRepository.save(expense); + } + public List getExpensesByUserId(String userUuid) { - return expenseRepository.findByUserUserUuid(userUuid); + return expenseRepository.findByUserUuid(userUuid); + } + + public List getExpenses() { + return expenseRepository.findAll(); + } + + public Expense getExpenseById(long id) { + return expenseRepository.findById(id).orElse(null); } } \ No newline at end of file diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java index 376c0e2..23e60ea 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/IncomeService.java @@ -3,6 +3,7 @@ package com.faf223.expensetrackerfaf.service; import com.faf223.expensetrackerfaf.model.Income; import com.faf223.expensetrackerfaf.repository.IncomeRepository; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import java.util.List; @@ -13,7 +14,19 @@ public class IncomeService { private final IncomeRepository incomeRepository; + public void createOrUpdateIncome(Income income) { + incomeRepository.save(income); + } + + public List getIncomes() { + return incomeRepository.findAll(); + } + public List getIncomesByUserId(String userUuid) { - return incomeRepository.findByUserUserUuid(userUuid); + return incomeRepository.findByUserUuid(userUuid); + } + + public Income getIncomeById(long id) { + return incomeRepository.findById(id).orElse(null); } } diff --git a/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java b/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java index 389aed4..c3de777 100644 --- a/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java +++ b/src/main/java/com/faf223/expensetrackerfaf/service/UserService.java @@ -3,14 +3,25 @@ package com.faf223.expensetrackerfaf.service; import com.faf223.expensetrackerfaf.model.User; import com.faf223.expensetrackerfaf.repository.UserRepository; import lombok.RequiredArgsConstructor; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; +import java.util.List; + @Service @RequiredArgsConstructor public class UserService { private final UserRepository userRepository; + public void createOrUpdateUser(User user) { + userRepository.save(user); + } + + public List getUsers() { + return userRepository.findAll(); + } + public User getUserById(String userUuid) { return userRepository.findById(userUuid).orElse(null); }