Skip to content

Commit 7d2853d

Browse files
committed
Merge branch 'feature/credit-app-acceptance'
2 parents eba8ceb + 6cd1c43 commit 7d2853d

File tree

6 files changed

+31
-14
lines changed

6 files changed

+31
-14
lines changed

src/main/kotlin/com/senacor/lpt/service/creditapplication/CreditApplication.kt

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,11 @@ data class CreditApplication(
1818
val monthlyNetIncome: BigDecimal,
1919
val monthlyExpenses: BigDecimal,
2020
val creditDecision: CreditDecisionType,
21-
)
21+
val accepted: Boolean,
22+
) {
23+
fun accept() = also { check(!accepted) { "Credit application already accepted" } }
24+
.let { copy(accepted = true) }
25+
}
2226

2327
fun toFirestoreModel(value: CreditApplication) =
2428
CreditApplicationFirestoreModel(
@@ -30,7 +34,8 @@ fun toFirestoreModel(value: CreditApplication) =
3034
occupation = value.occupation,
3135
monthlyNetIncomeInCents = toCents(value.monthlyNetIncome),
3236
monthlyExpensesInCents = toCents(value.monthlyExpenses),
33-
creditDecision = value.creditDecision
37+
creditDecision = value.creditDecision,
38+
accepted = value.accepted,
3439
)
3540

3641
fun fromFirestoreModel(value: CreditApplicationFirestoreModel) =
@@ -43,7 +48,8 @@ fun fromFirestoreModel(value: CreditApplicationFirestoreModel) =
4348
occupation = value.occupation!!,
4449
monthlyNetIncome = fromCents(value.monthlyNetIncomeInCents!!),
4550
monthlyExpenses = fromCents(value.monthlyExpensesInCents!!),
46-
creditDecision = value.creditDecision!!
51+
creditDecision = value.creditDecision!!,
52+
accepted = value.accepted!!
4753
)
4854

4955
private fun toCents(value: BigDecimal) = value.times(BigDecimal(100)).toLong()

src/main/kotlin/com/senacor/lpt/service/creditapplication/CreditApplicationRequest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class CreditApplicationRequest(
2121
occupation = occupation,
2222
monthlyNetIncome = monthlyNetIncome,
2323
monthlyExpenses = monthlyExpenses,
24-
creditDecision = CreditDecisionType.PENDING
24+
creditDecision = CreditDecisionType.PENDING,
25+
accepted = false
2526
)
2627
}

src/main/kotlin/com/senacor/lpt/service/creditapplication/CreditApplicationsController.kt

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,15 @@ import com.senacor.lpt.service.creditapplication.decision.CreditDecisionService
66
import com.senacor.lpt.service.creditapplication.repository.CreditApplicationRepository
77
import org.slf4j.Logger
88
import org.slf4j.LoggerFactory.getLogger
9+
import org.springframework.http.HttpStatus
10+
import org.springframework.web.bind.annotation.CrossOrigin
911
import org.springframework.web.bind.annotation.PathVariable
1012
import org.springframework.web.bind.annotation.PostMapping
1113
import org.springframework.web.bind.annotation.RequestBody
1214
import org.springframework.web.bind.annotation.RequestMapping
15+
import org.springframework.web.bind.annotation.ResponseStatus
1316
import org.springframework.web.bind.annotation.RestController
14-
import org.springframework.web.bind.annotation.CrossOrigin
1517
import reactor.core.publisher.Mono
16-
import java.util.*
1718

1819
@RestController
1920
@CrossOrigin(origins = ["*"])
@@ -34,22 +35,28 @@ class CreditApplicationsController(
3435
.map { creditDecisionCustomerTuple ->
3536
// TODO: add a proper application/domain layer instead of just talking to a repo
3637
logger.info("Selected credit decision and customer")
37-
println("Selected credit decision and customer")
3838
request.toDomain().copy(creditDecision = creditDecisionCustomerTuple.t1)
3939
}.flatMap { domainModel ->
4040
logger.info("Saving credit decision to database")
41-
println("Saving credit decision to database")
4241
creditApplicationRepository.save(toFirestoreModel(domainModel))
4342
}.map { savedCreditApplication ->
4443
logger.info("Received new credit decision request with id {}", savedCreditApplication.id)
45-
println(String.format("Received new credit decision request with id %s", savedCreditApplication.id))
4644
CreditApplicationResponse(
4745
savedCreditApplication.creditDecision!!, savedCreditApplication.id!!
4846
)
4947
}
5048

5149
@PostMapping("/{id}")
52-
fun acceptCreditApplication(@PathVariable id: String) {
53-
// TODO: accept credit and create credit agreement
54-
}
50+
@ResponseStatus(HttpStatus.ACCEPTED)
51+
fun acceptCreditApplication(@PathVariable id: String) =
52+
creditApplicationRepository.findById(id)
53+
.map { fromFirestoreModel(it) }
54+
.map {
55+
logger.info("Accepting credit application with id {}", it.id)
56+
it.accept()
57+
}.map { toFirestoreModel(it) }
58+
.flatMap {
59+
logger.info("Saving credit decision with id {} to database", it.id)
60+
creditApplicationRepository.save(it)
61+
}
5562
}

src/main/kotlin/com/senacor/lpt/service/creditapplication/repository/CreditApplicationFirestoreModel.kt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,4 +17,5 @@ class CreditApplicationFirestoreModel(
1717
var monthlyNetIncomeInCents: Long? = null,
1818
var monthlyExpensesInCents: Long? = null,
1919
var creditDecision: CreditDecisionType? = null,
20+
var accepted: Boolean? = null,
2021
)

src/test/kotlin/com/senacor/lpt/service/creditapplication/repository/CreditApplicationFirestoreTemplateIntegrationTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ class CreditApplicationFirestoreTemplateIntegrationTest {
3333
"Arbeiter",
3434
BigDecimal("3000.00"),
3535
BigDecimal("2500.00"),
36-
CreditDecisionType.PENDING
36+
CreditDecisionType.PENDING,
37+
accepted = false
3738
)
3839

3940
firestoreTemplate.save(toFirestoreModel(creditApplication)).block()

src/test/kotlin/com/senacor/lpt/service/creditapplication/repository/CreditApplicationRepositoryIntegrationTest.kt

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ class CreditApplicationRepositoryIntegrationTest {
3131
"Arbeiter",
3232
BigDecimal("3000.00"),
3333
BigDecimal("2500.00"),
34-
CreditDecisionType.PENDING
34+
CreditDecisionType.PENDING,
35+
accepted = false
3536
)
3637

3738
repository.save(toFirestoreModel(creditApplication)).block()

0 commit comments

Comments
 (0)