Skip to content
14 changes: 9 additions & 5 deletions src/main/java/fun/trackmoney/account/service/AccountService.java
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,8 @@
import fun.trackmoney.account.exception.AccountNotFoundException;
import fun.trackmoney.account.mapper.AccountMapper;
import fun.trackmoney.account.repository.AccountRepository;
import fun.trackmoney.user.service.UserService;
import fun.trackmoney.user.exception.UserNotFoundException;
import fun.trackmoney.user.repository.UserRepository;
import org.springframework.stereotype.Service;

import java.util.List;
Expand All @@ -17,18 +18,21 @@ public class AccountService {

private final AccountRepository accountRepository;
private final AccountMapper accountMapper;
private final UserService userService;
private final UserRepository userRepository;

public AccountService(AccountRepository accountRepository, AccountMapper accountMapper, UserService userService) {
public AccountService(AccountRepository accountRepository,
AccountMapper accountMapper,
UserRepository userRepository) {
this.accountRepository = accountRepository;
this.accountMapper = accountMapper;
this.userService = userService;
this.userRepository = userRepository;
}

public AccountResponseDTO createAccount(AccountRequestDTO dto) {
AccountEntity account = accountMapper.accountRequestToAccountEntity(dto);

account.setUser(userService.findUserById(dto.userId()));
account.setUser(userRepository.findById(dto.userId())
.orElseThrow(() -> new UserNotFoundException("User not found!")));

return accountMapper.accountEntityToAccountResponse(accountRepository
.save(account));
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,63 @@
package fun.trackmoney.budget.controller;

import fun.trackmoney.budget.dtos.BudgetCreateDTO;
import fun.trackmoney.budget.dtos.BudgetResponseDTO;
import fun.trackmoney.budget.service.BudgetsService;
import fun.trackmoney.utils.response.ApiResponse;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.List;

@RestController
@RequestMapping("budgets")
public class BudgetsController {

private final BudgetsService budgetsService;

public BudgetsController(BudgetsService budgetsService) {
this.budgetsService = budgetsService;
}

@PostMapping
public ResponseEntity<ApiResponse<BudgetResponseDTO>> create(@RequestBody BudgetCreateDTO dto) {
return ResponseEntity.status(HttpStatus.CREATED).body(
new ApiResponse<>(true, "Budget created", budgetsService.create(dto), null));
}

@GetMapping
public ResponseEntity<ApiResponse<List<BudgetResponseDTO>>> findAll() {
var list = budgetsService.findAll();
return ResponseEntity.status(HttpStatus.OK).body(
new ApiResponse<>(true, "Get all Budget",list , null));
}

@GetMapping("/{id}")
public ResponseEntity<ApiResponse<BudgetResponseDTO>> findById(@PathVariable Integer id) {
return ResponseEntity.status(HttpStatus.OK).body(
new ApiResponse<>(true, "Get Budget by Id", budgetsService.findById(id), null));
}

@DeleteMapping("/{id}")
public ResponseEntity<ApiResponse<String>> deleteById(@PathVariable Integer id) {
budgetsService.findById(id);
return ResponseEntity.status(HttpStatus.OK).body(
new ApiResponse<>(true, "Delete Budget by id", "Budget deleted", null));
}

@PutMapping("/{id}")
public ResponseEntity<ApiResponse<BudgetResponseDTO>> updateById(@PathVariable Integer id,
@RequestBody BudgetCreateDTO dto) {
return ResponseEntity.status(HttpStatus.OK).body(
new ApiResponse<>(true, "Update Budget", budgetsService.update(dto,id), null));
}
}

11 changes: 11 additions & 0 deletions src/main/java/fun/trackmoney/budget/dtos/BudgetCreateDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package fun.trackmoney.budget.dtos;

import java.math.BigDecimal;
import java.util.UUID;

public record BudgetCreateDTO(Integer categoryId,
UUID userId,
Integer accountId,
BigDecimal targetAmount,
Integer resetDay) {
}
13 changes: 13 additions & 0 deletions src/main/java/fun/trackmoney/budget/dtos/BudgetResponseDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package fun.trackmoney.budget.dtos;

import fun.trackmoney.account.dtos.AccountResponseDTO;
import fun.trackmoney.category.entity.CategoryEntity;

import java.math.BigDecimal;

public record BudgetResponseDTO (Integer budgetId,
CategoryEntity category,
AccountResponseDTO account,
BigDecimal targetAmount,
Integer resetDay) {
}
108 changes: 108 additions & 0 deletions src/main/java/fun/trackmoney/budget/entity/BudgetsEntity.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
package fun.trackmoney.budget.entity;

import fun.trackmoney.account.entity.AccountEntity;
import fun.trackmoney.category.entity.CategoryEntity;
import fun.trackmoney.user.entity.UserEntity;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.JoinColumn;
import jakarta.persistence.ManyToOne;
import jakarta.persistence.Table;

import java.math.BigDecimal;

@Entity
@Table(name = "tb_budget")
public class BudgetsEntity {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "budget_id")
private Integer budgetId;

@ManyToOne
@JoinColumn(name = "category_id")
private CategoryEntity category;

@ManyToOne
@JoinColumn(name = "account_id")
private AccountEntity account;
@ManyToOne
@JoinColumn(name = "user_id")
private UserEntity userEntity;

private BigDecimal targetAmount;
@Column(name = "reset_day")
private Integer resetDay;

public AccountEntity getAccount() {
return account;
}

public BudgetsEntity() {

}

public BudgetsEntity(Integer budgetId,
CategoryEntity category,
UserEntity userEntity,
BigDecimal targetAmount,
Integer resetDay) {
this.budgetId = budgetId;
this.category = category;
this.userEntity = userEntity;
this.targetAmount = targetAmount;
this.resetDay = resetDay;
}

public void setAccount(AccountEntity account) {
this.account = account;
}

public BudgetsEntity(UserEntity userEntity) {
this.userEntity = userEntity;
}

public Integer getBudgetId() {
return budgetId;
}

public void setBudgetId(Integer budgetId) {
this.budgetId = budgetId;
}

public CategoryEntity getCategory() {
return category;
}

public void setCategory(CategoryEntity category) {
this.category = category;
}

public BigDecimal getTargetAmount() {
return targetAmount;
}

public void setTargetAmount(BigDecimal targetAmount) {
this.targetAmount = targetAmount;
}

public Integer getResetDay() {
return resetDay;
}

public void setResetDay(Integer resetDay) {
this.resetDay = resetDay;
}

public UserEntity getUserEntity() {
return userEntity;
}

public void setUserEntity(UserEntity userEntity) {
this.userEntity = userEntity;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package fun.trackmoney.budget.exception;

import fun.trackmoney.utils.CustomFieldError;

import java.util.ArrayList;
import java.util.List;

public class BudgetsNotFoundException extends RuntimeException {
private final List<CustomFieldError> errors = new ArrayList<>();

public BudgetsNotFoundException(String message) {
super(message);
this.errors.add(new CustomFieldError("Budgets", message));
}

public BudgetsNotFoundException(List<CustomFieldError> errors) {
super("Budgets not found!");
this.errors.addAll(errors);
}

public List<CustomFieldError> getErrors() {
return errors;
}
}
18 changes: 18 additions & 0 deletions src/main/java/fun/trackmoney/budget/mapper/BudgetMapper.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package fun.trackmoney.budget.mapper;

import fun.trackmoney.budget.dtos.BudgetCreateDTO;
import fun.trackmoney.budget.dtos.BudgetResponseDTO;
import fun.trackmoney.budget.entity.BudgetsEntity;
import org.mapstruct.Mapper;

import java.util.List;

@Mapper(componentModel = "spring")
public interface BudgetMapper {

BudgetsEntity createDtoTOEntity(BudgetCreateDTO dto);

BudgetResponseDTO entityToResponseDTO(BudgetsEntity entity);

List<BudgetResponseDTO> entityListToResponseList(List<BudgetsEntity> entityList);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package fun.trackmoney.budget.repository;

import fun.trackmoney.budget.entity.BudgetsEntity;
import org.springframework.data.jpa.repository.JpaRepository;

public interface BudgetsRepository extends JpaRepository<BudgetsEntity, Integer> {
}
77 changes: 77 additions & 0 deletions src/main/java/fun/trackmoney/budget/service/BudgetsService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
package fun.trackmoney.budget.service;

import fun.trackmoney.account.mapper.AccountMapper;
import fun.trackmoney.account.service.AccountService;
import fun.trackmoney.budget.dtos.BudgetCreateDTO;
import fun.trackmoney.budget.dtos.BudgetResponseDTO;
import fun.trackmoney.budget.entity.BudgetsEntity;
import fun.trackmoney.budget.exception.BudgetsNotFoundException;
import fun.trackmoney.budget.mapper.BudgetMapper;
import fun.trackmoney.budget.repository.BudgetsRepository;
import fun.trackmoney.category.service.CategoryService;
import fun.trackmoney.user.service.UserService;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class BudgetsService {

private final BudgetsRepository budgetsRepository;
private final BudgetMapper budgetMapper;
private final AccountService accountService;
private final AccountMapper accountMapper;
private final CategoryService categoryService;
private final UserService userService;

public BudgetsService(BudgetsRepository budgetsRepository,
BudgetMapper budgetMapper,
AccountService accountService,
AccountMapper accountMapper,
CategoryService categoryService,
UserService userService) {
this.budgetsRepository = budgetsRepository;
this.budgetMapper = budgetMapper;
this.accountService = accountService;
this.accountMapper = accountMapper;
this.categoryService = categoryService;
this.userService = userService;
}

public BudgetResponseDTO create(BudgetCreateDTO dto) {
BudgetsEntity budgets = budgetMapper.createDtoTOEntity(dto);

budgets.setUserEntity(userService.findUserById(dto.userId()));
budgets.setAccount(accountMapper.accountResponseToEntity(accountService.findAccountById(dto.accountId())));
budgets.setCategory(categoryService.findById(dto.categoryId()));
return budgetMapper.entityToResponseDTO(budgetsRepository.save(budgets));
}

public List<BudgetResponseDTO> findAll() {
return budgetMapper.entityListToResponseList(budgetsRepository.findAll());
}

public BudgetResponseDTO findById(Integer id) {
return budgetMapper.entityToResponseDTO(budgetsRepository.findById(id)
.orElseThrow(() -> new BudgetsNotFoundException("Budget not found")));
}

public BudgetResponseDTO update(BudgetCreateDTO dto, Integer id) {
budgetsRepository.findById(id)
.orElseThrow(() -> new BudgetsNotFoundException(("Budget not found")));

BudgetsEntity budgets = budgetMapper.createDtoTOEntity(dto);
budgets.setBudgetId(id);
budgets.setUserEntity(userService.findUserById(dto.userId()));
budgets.setAccount(accountMapper.accountResponseToEntity(accountService.findAccountById(dto.accountId())));
budgets.setCategory(categoryService.findById(dto.categoryId()));
budgets.setTargetAmount(dto.targetAmount());
budgets.setResetDay(dto.resetDay());

return budgetMapper.entityToResponseDTO(budgetsRepository.save(budgets));
}

public void deleteById(Integer id) {
budgetsRepository.deleteById(id);
}
}
24 changes: 24 additions & 0 deletions src/main/java/fun/trackmoney/config/CorsConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
package fun.trackmoney.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class CorsConfig {

@Bean
public WebMvcConfigurer corsConfigurer() {
return new WebMvcConfigurer() {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry.addMapping("/**")
.allowedOrigins("http://localhost:4200")
.allowedMethods("GET", "POST", "PUT", "DELETE", "OPTIONS")
.allowedHeaders("*");
}
};
}
}

Loading