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);
}