Skip to content
7 changes: 7 additions & 0 deletions http/AccountRequest.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
### 계좌 등록 API
POST {{apiAddress}}/accounts
Content-Type: application/json

{
"userId": 1
}
11 changes: 11 additions & 0 deletions http/TransactionRequest.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
### 사용자 추가 API
POST {{apiAddress}}/transactions
Content-Type: application/json

{
"senderId": 1,
"senderAccountId": 1,
"receiverId": 1,
"receiverAccountId": 2,
"amount": 1000
}
7 changes: 7 additions & 0 deletions http/UserRequest.http
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
### 사용자 추가 API
POST {{apiAddress}}/users
Content-Type: application/json

{
"name": "이상경"
}
5 changes: 5 additions & 0 deletions http/http-client.env.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
{
"local": {
"apiAddress": "http://localhost:8080"
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.example.estdelivery.adapter.`in`.web

import com.example.estdelivery.adapter.`in`.web.dto.account.request.RegisterAccountRequest
import com.example.estdelivery.adapter.`in`.web.dto.account.response.AccountSummaryResponse
import com.example.estdelivery.application.port.`in`.RegisterAccountUseCase
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.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RequestParam
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/accounts")
class AccountController(
private val registerAccountUseCase: RegisterAccountUseCase
) {

@GetMapping
fun getAccounts(@RequestParam userId: Long): List<AccountSummaryResponse> {
TODO()
}

@GetMapping("/{id}")
fun getAccount(@PathVariable id: Long): AccountSummaryResponse {
TODO()
}

@PostMapping
fun registerAccount(@RequestBody request: RegisterAccountRequest) {
registerAccountUseCase.registerAccount(request.userId)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.estdelivery.adapter.`in`.web

import com.example.estdelivery.adapter.`in`.web.dto.transaction.request.RemitRequest
import com.example.estdelivery.application.port.`in`.ProcessTransactionUseCase
import com.example.estdelivery.application.service.ProcessTransactionService
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/transactions")
class ProcessTransactionController(
private val processTransactionUseCase: ProcessTransactionUseCase
) {

@PostMapping
fun processTransaction(@RequestBody request: RemitRequest) {
processTransactionUseCase.process(
request.senderId,
request.senderAccountId,
request.receiverId,
request.receiverAccountId,
request.amount
)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.estdelivery.adapter.`in`.web

import com.example.estdelivery.adapter.`in`.web.dto.user.request.RegisterUserRequest
import com.example.estdelivery.application.port.`in`.RegisterUserUseCase
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestBody
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController

@RestController
@RequestMapping("/users")
class RegisterUserController(
private val registerUserUseCase: RegisterUserUseCase
) {
@PostMapping
fun registerUser(@RequestBody request: RegisterUserRequest) {
registerUserUseCase.registerUser(request.name)
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.estdelivery.adapter.`in`.web.dto.account.request

data class RegisterAccountRequest(
val userId: Long
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.estdelivery.adapter.`in`.web.dto.account.response

data class AccountDetailResponse(
val id: Long,
val balance: Long
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.example.estdelivery.adapter.`in`.web.dto.account.response

data class AccountSummaryResponse(
val id: Long,
val balance: Long
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
//package com.example.estdelivery.adapter.`in`.web.dto.transaction.request
//
//data class DepositRequest()
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.example.estdelivery.adapter.`in`.web.dto.transaction.request

import java.math.BigDecimal
import java.time.LocalDateTime

data class RemitRequest(
val senderId: Long,
val senderAccountId: Long,
val receiverId: Long,
val receiverAccountId: Long,
val amount: BigDecimal,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.estdelivery.adapter.`in`.web.dto.user.request

data class RegisterUserRequest(
val name: String,
)
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
package com.example.estdelivery.adapter.out.persistence.account.adapter

import com.example.estdelivery.adapter.out.persistence.account.mapper.toDomain
import com.example.estdelivery.adapter.out.persistence.account.mapper.toEntity
import com.example.estdelivery.adapter.out.persistence.account.repository.AccountRepository
import com.example.estdelivery.application.port.out.AccountPersistencePort
import com.example.estdelivery.application.port.out.LoadAccountsPort
import com.example.estdelivery.domain.Account
import org.springframework.stereotype.Component

@Component
class AccountPersistenceAdapter(
private val accountRepository: AccountRepository
) : AccountPersistencePort, LoadAccountsPort {
override fun loadAccount(userId: Long, accountId: Long): Account {
return accountRepository.findByIdAndUserId(accountId, userId).toDomain()
}

override fun loadAccounts(userId: Long): List<Account> {
TODO()
}

override fun updateAccountBalance(account: Account) {
val accountEntity = accountRepository.findById(account.id!!).orElseThrow {
throw Exception("account not found")
}
accountEntity.updateBalance(account.balance)
}

override fun registerAccount(account: Account) {
accountRepository.save(account.toEntity())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.example.estdelivery.adapter.out.persistence.account.entity

import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.Table
import java.math.BigDecimal

@Entity
@Table(name = "account")
class AccountEntity(
userId: Long,
accountNumber: String,
balance: BigDecimal
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
protected set

var userId: Long = userId
protected set

var accountNumber: String = accountNumber
protected set

var balance: BigDecimal = balance
protected set

fun updateBalance(amount: BigDecimal) {
balance += amount
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.example.estdelivery.adapter.out.persistence.account.mapper

import com.example.estdelivery.adapter.out.persistence.account.entity.AccountEntity
import com.example.estdelivery.domain.Account

fun Account.toEntity(): AccountEntity {
return AccountEntity(
userId = this.userId,
accountNumber = this.accountNumber,
balance = this.balance
)
}

fun AccountEntity.toDomain(): Account {
return Account(
id = this.id!!,
userId = this.userId,
accountNumber = this.accountNumber,
balance = this.balance
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
package com.example.estdelivery.adapter.out.persistence.account.repository

import com.example.estdelivery.adapter.out.persistence.account.entity.AccountEntity
import org.springframework.data.jpa.repository.JpaRepository

interface AccountRepository : JpaRepository<AccountEntity, Long> {
fun findByIdAndUserId(id: Long, userId: Long): AccountEntity
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.example.estdelivery.adapter.out.persistence.transaction.entity

import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.Table
import java.math.BigDecimal

@Entity
@Table(name = "transaction")
class TransactionEntity(
accountId: String,
amount: BigDecimal
) {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
protected set

var accountId: String? = accountId
protected set

var amount: BigDecimal = amount
protected set
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.estdelivery.adapter.out.persistence.user.adapter

import com.example.estdelivery.adapter.out.persistence.user.repository.UserRepository
import com.example.estdelivery.adapter.out.persistence.user.mapper.toEntity
import com.example.estdelivery.application.port.out.UserPersistencePort
import com.example.estdelivery.domain.User
import org.springframework.stereotype.Component

@Component
class UserPersistenceAdapter(
private val userRepository: UserRepository
) : UserPersistencePort {
override fun save(user: User) {
userRepository.save(user.toEntity())
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.example.estdelivery.adapter.out.persistence.user.entity

import jakarta.persistence.Entity
import jakarta.persistence.GeneratedValue
import jakarta.persistence.GenerationType
import jakarta.persistence.Id
import jakarta.persistence.Table
import java.math.BigDecimal

@Entity
@Table(name = "user")
class UserEntity(
name: String
// balance: BigDecimal
) {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
var id: Long? = null
protected set

var name: String? = name
protected set

// var balance: BigDecimal = balance
// protected set
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
package com.example.estdelivery.adapter.out.persistence.user.mapper

import com.example.estdelivery.adapter.out.persistence.user.entity.UserEntity
import com.example.estdelivery.domain.User

fun User.toEntity(): UserEntity {
return UserEntity(
name = this.name
// balance = this.balance
)
}

fun UserEntity.toDomain(): User {
return User(
id = this.id!!,
name = this.name!!,
// balance = this.balance
)
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.example.estdelivery.adapter.out.persistence.user.repository

import com.example.estdelivery.adapter.out.persistence.user.entity.UserEntity
import org.springframework.data.jpa.repository.JpaRepository

interface UserRepository : JpaRepository<UserEntity, Long> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.example.estdelivery.application.port.`in`

import java.math.BigDecimal
import java.time.LocalDateTime

interface ProcessTransactionUseCase {
fun process(
senderId: Long,
senderAccountId: Long,
receiverId: Long,
receiverAccountId: Long,
amount: BigDecimal
): BigDecimal
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.example.estdelivery.application.port.`in`

interface RegisterAccountUseCase {
fun registerAccount(userId: Long)
}
Loading