Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file removed .gradle/7.4.1/checksums/checksums.lock
Binary file not shown.
Binary file not shown.
Empty file.
Binary file removed .gradle/7.4.1/fileChanges/last-build.bin
Binary file not shown.
Binary file removed .gradle/7.4.1/fileHashes/fileHashes.lock
Binary file not shown.
Empty file removed .gradle/7.4.1/gc.properties
Empty file.
Binary file modified .gradle/8.5/executionHistory/executionHistory.lock
Binary file not shown.
Binary file modified .gradle/8.5/fileHashes/fileHashes.lock
Binary file not shown.
Binary file modified .gradle/buildOutputCleanup/buildOutputCleanup.lock
Binary file not shown.
35 changes: 22 additions & 13 deletions src/main/java/com/track/fin/controller/AccountController.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.track.fin.domain.Account;
import com.track.fin.record.*;
import com.track.fin.service.AccountFacadeService;
import com.track.fin.service.AccountService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
Expand All @@ -18,6 +19,7 @@
public class AccountController {

private final AccountService accountService;
private final AccountFacadeService accountFacadeService;

@PostMapping
public Account createAccount(
Expand All @@ -42,31 +44,27 @@ public Account getAccount(
return accountService.getAccount(id);
}

@DeleteMapping
public AccountRecord deleteAccount(
@RequestBody @Valid DeleteAccountRecord deleteAccountRecord
@PostMapping("/restore")
public AccountRecord restoreAccount(
@RequestParam Long userId,
@RequestParam String accountNumber
) {
return accountService.deleteAccount(deleteAccountRecord);
return accountFacadeService.restoreAccount(userId, accountNumber);
}

@GetMapping("/{accountNumber}/transactions")
public TransferResponseRecord getTransferTransactions(
@PathVariable String accountNumber,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate,
@RequestParam(defaultValue = "true") boolean sortDesc,
@ModelAttribute TransferSearchRequestRecord searchRequest,
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. ModelAttribute로 TransferSearchRequestRecord를 받으셨는데, 사용은 안하시네요? 필터 비지니스 로직이 들어가야하지 않나요?

  2. DTO를 2개 못 받으셔서 ModelAttribute로 받으신 거 같은데, TransferRequestRecord 하나의 DTO에 filter 조건도 한번에 받으시면 안되시는 건가요?

@RequestBody TransferRequestRecord transferRequestRecord
) {
return TransferResponseRecord.from(null);
}


@GetMapping("/active")
public List<AccountRecord> getActiveAccounts(
@RequestParam("userId") Long userId
) {
return accountService.getActiveAccounts(userId).stream()
.map(AccountRecord::from)
.toList();
public List<AccountRecord> getActiveAccounts(@RequestParam("userId") Long userId) {
return accountService.getActiveAccounts(userId);
}

@GetMapping("/{accountId}/collateral")
Expand Down Expand Up @@ -99,4 +97,15 @@ public boolean validateAutoTransferNotRegistered(
return accountService.validateAutoTransferNotRegistered(accountNumber);
}

@DeleteMapping
public AccountRecord deleteAccount(@Valid @RequestBody DeleteAccountRecord request) {
return accountFacadeService.deleteAccount(request);
}

@DeleteMapping("/expired/{accountNumber}")
public void deleteExpiredAccount(@PathVariable String accountNumber) {
Account account = accountService.getAccountByNumber(accountNumber);
accountFacadeService.deleteIfExpired(account);
}

}
83 changes: 58 additions & 25 deletions src/main/java/com/track/fin/controller/TransactionController.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,38 +5,47 @@
import com.track.fin.exception.AccountException;
import com.track.fin.record.*;
import com.track.fin.service.TransactionService;
import com.track.fin.type.TransactionType;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.web.bind.annotation.*;

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

@Slf4j
@RequiredArgsConstructor
@RestController
@RequestMapping("/transactions")
public class TransactionController {

private final TransactionService transactionService;

@PostMapping("transaction/use")
public UseBalance.Response useBalance(
@Valid @RequestBody UseBalance.Request requset
@PostMapping("/use")
public TransferResponseRecord useBalance(
@Valid @RequestBody UseBalance.Request request
) {
try {
return UseBalance.Response.from(transactionService.useBalance(requset.getUserId(),
requset.getAccountNumber(), requset.getAmount())
return transactionService.useBalance(
request.getUserId(),
request.getAccountNumber(),
request.getAmount(),
request.getTransactionMethodType()
);
} catch (AccountException e) {
log.error("Failed to use balance. ");

log.error("잔액 사용 실패: {}", e.getMessage());
transactionService.saveFailedUseTransaction(
requset.getAccountNumber(),
requset.getAmount()
request.getAccountNumber(),
request.getAmount(),
request.getTransactionMethodType()
);
throw e;
}
}

@PostMapping("/transaction/deposit")
@PostMapping("/deposit")
public DepositRecord deposit(
@Valid @RequestBody DepositTransactionRecord request
) {
Expand All @@ -45,21 +54,23 @@ public DepositRecord deposit(
transactionService.deposit(
request.userId(),
request.accountNumber(),
request.amount()
request.amount(),
request.transactionMethodType()
)
);
} catch (AccountException e) {
log.error("Failed to deposit.");
log.error("입금 실패: {}", e.getMessage());

transactionService.saveFailedDepositTransaction(
request.accountNumber(),
request.amount()
request.amount(),
request.transactionMethodType()
);
throw e;
}
}

@PostMapping("/transaction/transfer")
@PostMapping("/transfer")
public TransferResponseRecord transfer(
@Valid @RequestBody TransferRequestRecord request
) {
Expand All @@ -68,20 +79,35 @@ public TransferResponseRecord transfer(
request.userId(),
request.fromAccountNumber(),
request.toAccountNumber(),
request.amount()
request.amount(),
request.transactionMethodType()
);
} catch (AccountException e) {
log.error("Failed to transfer.");
log.error("이체 실패: {}", e.getMessage());
transactionService.saveFailedTransferTransaction(
request.fromAccountNumber(),
request.toAccountNumber(),
request.amount()
request.amount(),
request.transactionMethodType()
);
throw e;
}
}

@PostMapping("/transaction/withdraw")
@GetMapping("/transfers")
public List<TransferResponseRecord> getTransfers(
@RequestParam String accountNumber,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime startDate,
@RequestParam @DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME) LocalDateTime endDate,
@RequestParam(required = false) TransactionType transactionType,
@RequestParam(defaultValue = "false") boolean sortDesc
) {
return transactionService.getTransferTransactionsByAccount(
accountNumber, startDate, endDate, transactionType, sortDesc
);
}

@PostMapping("/withdraw")
public WithdrawalRecord withdraw(
@Valid @RequestBody WithdrawalRequestRecord request
) {
Expand All @@ -90,37 +116,44 @@ public WithdrawalRecord withdraw(
transactionService.withdraw(
request.userId(),
request.accountNumber(),
request.amount()
request.amount(),
request.transactionMethodType()
)
);
} catch (AccountException e) {
log.error("Failed to withdraw.");
transactionService.saveFailedWithdrawTransaction(request.accountNumber(), request.amount());
log.error("출금 실패: {}", e.getMessage());
transactionService.saveFailedWithdrawTransaction(
request.accountNumber(),
request.amount(),
request.transactionMethodType()
);
throw e;
}
}

@PostMapping("/transaction/cancel")
@PostMapping("/cancel")
public TransferResponseRecord cancelBalance(
@Valid @RequestBody CancelBalance.Request request
) {
try {
return transactionService.cancelBalance(
String.valueOf(request.getTransactionId()),
request.getAccountNumber(),
request.getAmount()
request.getAmount(),
request.getTransactionMethodType()
);
} catch (AccountException e) {
log.error("Cancel failed", e);
transactionService.saveFailedCancelTransaction(
request.getAccountNumber(),
request.getAmount()
request.getAmount(),
request.getTransactionMethodType()
);
throw e;
}
}

@GetMapping("/transaction/{transactionId}")
@GetMapping("/{transactionId}")
public TransferResponseRecord queryTransaction(
@PathVariable String transactionId) {
return transactionService.queryTransactionId(transactionId);
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/track/fin/domain/Loan.java
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,7 @@ public void update(User user, Account account, CreateLoanRecord dto) {
this.user = user;
this.account = account;
this.balance = dto.balance();
// this.loanDate = LocalDateTime.now();
this.loanDate = LocalDateTime.now();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

자동정렬 안하신 것 같습니다.

this.delinquencyDate = dto.delinquencyDate();
this.loanStatus = dto.loanStatus();
this.loanType = dto.loanType();
Expand Down
5 changes: 5 additions & 0 deletions src/main/java/com/track/fin/dto/CancelBalance.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.track.fin.dto;

import com.track.fin.type.TransactionMethodType;
import com.track.fin.type.TransactionResultType;
import jakarta.validation.constraints.*;
import lombok.AllArgsConstructor;
Expand All @@ -24,6 +25,10 @@ public static class Request {
@Min(10)
@Max(1000_000_000)
private Long amount;

@NotNull
private TransactionMethodType transactionMethodType;

}

@Getter
Expand Down
4 changes: 4 additions & 0 deletions src/main/java/com/track/fin/dto/UseBalance.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.track.fin.dto;

import com.track.fin.type.TransactionMethodType;
import com.track.fin.type.TransactionResultType;
import jakarta.validation.constraints.*;
import lombok.AllArgsConstructor;
Expand All @@ -26,6 +27,9 @@ public static class Request {
@Min(10)
@Max(1000_000_000)
private Long amount;

@NotNull
private TransactionMethodType transactionMethodType;
}

@Getter
Expand Down
2 changes: 1 addition & 1 deletion src/main/java/com/track/fin/record/DepositRecord.java
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@

import com.track.fin.domain.Transaction;


public record DepositRecord(

String transactionId,
String accountNumber,
Long amount,
Long balanceSnapshot

) {

public static DepositRecord from(Transaction transaction) {
Expand Down
17 changes: 16 additions & 1 deletion src/main/java/com/track/fin/record/DepositTransactionRecord.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,25 @@
package com.track.fin.record;

import com.track.fin.type.TransactionMethodType;
import jakarta.validation.constraints.*;

public record DepositTransactionRecord(

@NotNull
@Min(1)
Long userId,

@NotBlank
@Size(min = 10, max = 10)
String accountNumber,
Long amount

@NotNull
@Min(10)
@Max(1_000_000_000)
Long amount,

@NotNull
TransactionMethodType transactionMethodType

) {
}
Expand Down
19 changes: 18 additions & 1 deletion src/main/java/com/track/fin/record/TransferRequestRecord.java
Original file line number Diff line number Diff line change
@@ -1,12 +1,29 @@
package com.track.fin.record;

import com.track.fin.type.TransactionMethodType;
import jakarta.validation.constraints.*;

public record TransferRequestRecord(

@NotNull
@Min(1)
Long userId,

@NotBlank
@Size(min = 10, max = 10)
String fromAccountNumber,

@NotBlank
@Size(min = 10, max = 10)
String toAccountNumber,
Long amount

@NotNull
@Min(10)
@Max(1_000_000_000)
Long amount,

@NotNull
TransactionMethodType transactionMethodType
) {
}

Loading