Skip to content

Commit

Permalink
Added transaction type
Browse files Browse the repository at this point in the history
  • Loading branch information
amir-shiati committed Mar 8, 2022
1 parent 945d832 commit 4bc5cfd
Show file tree
Hide file tree
Showing 8 changed files with 137 additions and 7 deletions.
37 changes: 37 additions & 0 deletions src/main/java/com/asrez/wheremoney/api/DataInitializer.java
Original file line number Diff line number Diff line change
@@ -1,28 +1,39 @@
package com.asrez.wheremoney.api;

import com.asrez.wheremoney.api.config.JwtConfig;
import com.asrez.wheremoney.api.entity.Type;
import com.asrez.wheremoney.api.entity.User;
import com.asrez.wheremoney.api.repository.TypeRepository;
import com.asrez.wheremoney.api.repository.UserRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Component;

import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;


@Component
public class DataInitializer implements CommandLineRunner {
@Autowired
UserRepository users;
@Autowired
TypeRepository typeRepository;
@Autowired
PasswordEncoder passwordEncoder;
@Autowired
JwtConfig jwtConfig;

@Override
public void run(String... args) throws Exception {
addAdmin();
addTypes();
}

private void addAdmin() {
String username = jwtConfig.getUsername();
String password = jwtConfig.getPassword();
if (!this.users.findByUsername(username).isEmpty())
Expand All @@ -38,4 +49,30 @@ public void run(String... args) throws Exception {
.build()
);
}

private void addTypes() {
List<Type> types = new ArrayList<>();
types.add(new Type().builder()
.name("EDUCATION")
.iconName("Icon_Education")
.build());
types.add(new Type().builder()
.name("ENTERTAINMENT")
.iconName("Icon_Entertainment")
.build());
types.add(new Type().builder()
.name("OTHERS")
.iconName("Icon_Others")
.build());
types.add(new Type().builder()
.name("WORK")
.iconName("Icon_Work")
.build());
types.add(new Type().builder()
.name("CLOTHING")
.iconName("Icon_Clothing")
.build());

typeRepository.saveAll(types);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -39,8 +39,7 @@ public TransactionController(TransactionService service, ModelMapper modelMapper

@PostMapping
public ResponseEntity<TransactionDto> addTransaction(@AuthenticationPrincipal UserDetails userDetails, @Valid @RequestBody TransactionDto transactionDto) {
Transaction transaction = modelMapper.map(transactionDto, Transaction.class);
TransactionDto transactionDtoResponse = modelMapper.map(service.addTransaction(userDetails, transaction), TransactionDto.class);
TransactionDto transactionDtoResponse = modelMapper.map(service.addTransaction(userDetails, transactionDto), TransactionDto.class);
return ok(transactionDtoResponse);
}

Expand All @@ -63,8 +62,7 @@ public List<TransactionDto> getAll(@AuthenticationPrincipal UserDetails userDeta

@PutMapping("{id}")
public ResponseEntity<TransactionDto> updateTransaction(@AuthenticationPrincipal UserDetails userDetails, @PathVariable("id") Long id, @RequestBody TransactionDto transactionDto) {
Transaction transaction = modelMapper.map(transactionDto, Transaction.class);
TransactionDto transactionDtoResponse = modelMapper.map(service.updateTransaction(userDetails, id, transaction), TransactionDto.class);
TransactionDto transactionDtoResponse = modelMapper.map(service.updateTransaction(userDetails, id, transactionDto), TransactionDto.class);
return ok(transactionDtoResponse);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.asrez.wheremoney.api.dto;

import com.asrez.wheremoney.api.entity.Type;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.Data;
Expand Down Expand Up @@ -29,4 +30,10 @@ public class TransactionDto {
@JsonIgnoreProperties(allowGetters = true)
private LocalDateTime modifiedDate;

@JsonProperty(value = "type_id")
@JsonIgnoreProperties(allowSetters = true)
private Long typeId;
@JsonIgnoreProperties(allowGetters = true)
private Type type;

}
Original file line number Diff line number Diff line change
Expand Up @@ -29,5 +29,8 @@ public class Transaction {
private LocalDateTime createdDate;
@Column(name = "modified_date")
private LocalDateTime modifiedDate;
@OneToOne
@JoinColumn(name = "type_id", nullable = false)
private Type type;

}
28 changes: 28 additions & 0 deletions src/main/java/com/asrez/wheremoney/api/entity/Type.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.asrez.wheremoney.api.entity;

import com.fasterxml.jackson.annotation.JsonProperty;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

import javax.persistence.*;

@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "types")
public class Type {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@JsonProperty(access = JsonProperty.Access.READ_ONLY)
private Long id;
private String name;
@Column(name = "icon_name")
@JsonProperty(value = "icon_name")
private String iconName;

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package com.asrez.wheremoney.api.repository;

import com.asrez.wheremoney.api.entity.Type;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

@Repository
public interface TypeRepository extends JpaRepository<Type, Long> {
}
Original file line number Diff line number Diff line change
@@ -1,12 +1,15 @@
package com.asrez.wheremoney.api.service;

import com.asrez.wheremoney.api.dto.TransactionDto;
import com.asrez.wheremoney.api.entity.Transaction;
import com.asrez.wheremoney.api.entity.Type;
import com.asrez.wheremoney.api.entity.User;
import com.asrez.wheremoney.api.enums.SortByEnum;
import com.asrez.wheremoney.api.enums.SortDirEnum;
import com.asrez.wheremoney.api.exception.ApiRequestException;
import com.asrez.wheremoney.api.repository.TransactionRepository;
import com.asrez.wheremoney.api.repository.UserRepository;
import org.modelmapper.ModelMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
Expand All @@ -22,23 +25,32 @@
public class TransactionService {

private final TransactionRepository transactionRepository;
private final TypeService typeService;
private final UserRepository userRepository;
private final ModelMapper modelMapper;

@Autowired
public TransactionService(TransactionRepository transactionRepository, UserRepository userRepository) {
public TransactionService(TransactionRepository transactionRepository, TypeService typeService, UserRepository userRepository, ModelMapper modelMapper) {
this.transactionRepository = transactionRepository;
this.typeService = typeService;
this.userRepository = userRepository;
this.modelMapper = modelMapper;
}


public Transaction addTransaction(UserDetails userDetails, Transaction transaction) {
public Transaction addTransaction(UserDetails userDetails, TransactionDto transactionDto) {
User user = getUser(userDetails);
Long balance = transactionRepository.accountBalance(user.getId());
Type type = typeService.getType(transactionDto.getTypeId());

Transaction transaction = modelMapper.map(transactionDto, Transaction.class);

if (transaction.getCalculateInMonthly())
if (!allowedToMakeTransaction(balance, transaction))
throw new ApiRequestException("Insufficient balance!", " INSUFFICIENT_BALANCE");

transaction.setUserId(user.getId());
transaction.setType(type);
transaction.setCreatedDate(LocalDateTime.now());
return transactionRepository.save(transaction);
}
Expand All @@ -65,13 +77,22 @@ public List<Transaction> getAll(UserDetails userDetails, Integer pageNo, Integer

}

public Transaction updateTransaction(UserDetails userDetails, Long id, Transaction transaction) {
public Transaction updateTransaction(UserDetails userDetails, Long id, TransactionDto transactionDto) {
User user = getUser(userDetails);
Optional<Transaction> transactionOptional = transactionRepository.findByUserIdAndId(user.getId(), id);
if (transactionOptional.isEmpty())
throw new ApiRequestException("Transaction not found!", " TRANSACTION_NOT_FOUND");


Transaction transaction = modelMapper.map(transactionDto, Transaction.class);

Transaction oldTransaction = transactionOptional.get();

if (transactionDto.getTypeId() != null) {
Type type = typeService.getType(transactionDto.getTypeId());
oldTransaction.setType(type);
}

if (transaction.getSource() != null) {
oldTransaction.setSource(transaction.getSource());
}
Expand Down
27 changes: 27 additions & 0 deletions src/main/java/com/asrez/wheremoney/api/service/TypeService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.asrez.wheremoney.api.service;

import com.asrez.wheremoney.api.entity.Type;
import com.asrez.wheremoney.api.exception.ApiRequestException;
import com.asrez.wheremoney.api.repository.TypeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Optional;

@Service
public class TypeService {
private final TypeRepository typeRepository;

@Autowired
public TypeService(TypeRepository typeRepository) {
this.typeRepository = typeRepository;
}

public Type getType(Long id) {
Optional<Type> typeOptional = typeRepository.findById(id);
if (typeOptional.isEmpty())
throw new ApiRequestException("Type not found!", " TYPE_NOT_FOUND");

return typeOptional.get();
}
}

0 comments on commit 4bc5cfd

Please sign in to comment.