Skip to content

Commit 239140f

Browse files
svokphaeton03
authored andcommitted
m7l1 - InMemory repo: Biz
1 parent d734962 commit 239140f

33 files changed

+870
-153
lines changed

ok-marketplace-be/ok-marketplace-biz/build.gradle.kts

+2
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@ kotlin {
2222
implementation(kotlin("test-annotations-common"))
2323

2424
api(libs.coroutines.test)
25+
implementation(projects.okMarketplaceRepoTests)
26+
implementation(projects.okMarketplaceRepoInmemory)
2527
}
2628
}
2729
jvmMain {

ok-marketplace-be/ok-marketplace-biz/src/commonMain/kotlin/MkplAdProcessor.kt

+43-1
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,16 @@ package ru.otus.otuskotlin.marketplace.biz
22

33
import ru.otus.otuskotlin.marketplace.biz.general.initStatus
44
import ru.otus.otuskotlin.marketplace.biz.general.operation
5-
import ru.otus.otuskotlin.marketplace.biz.general.stubs
5+
import ru.otus.otuskotlin.marketplace.biz.repo.*
66
import ru.otus.otuskotlin.marketplace.biz.stubs.*
77
import ru.otus.otuskotlin.marketplace.biz.validation.*
88
import ru.otus.otuskotlin.marketplace.common.MkplContext
99
import ru.otus.otuskotlin.marketplace.common.MkplCorSettings
1010
import ru.otus.otuskotlin.marketplace.common.models.MkplAdId
1111
import ru.otus.otuskotlin.marketplace.common.models.MkplAdLock
1212
import ru.otus.otuskotlin.marketplace.common.models.MkplCommand
13+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
14+
import ru.otus.otuskotlin.marketplace.cor.chain
1315
import ru.otus.otuskotlin.marketplace.cor.rootChain
1416
import ru.otus.otuskotlin.marketplace.cor.worker
1517

@@ -20,6 +22,7 @@ class MkplAdProcessor(
2022

2123
private val businessChain = rootChain<MkplContext> {
2224
initStatus("Инициализация статуса")
25+
initRepo("Инициализация репозитория")
2326

2427
operation("Создание объявления", MkplCommand.CREATE) {
2528
stubs("Обработка стабов") {
@@ -41,6 +44,12 @@ class MkplAdProcessor(
4144

4245
finishAdValidation("Завершение проверок")
4346
}
47+
chain {
48+
title = "Логика сохранения"
49+
repoPrepareCreate("Подготовка объекта для сохранения")
50+
repoCreate("Создание объявления в БД")
51+
}
52+
prepareResult("Подготовка ответа")
4453
}
4554
operation("Получить объявление", MkplCommand.READ) {
4655
stubs("Обработка стабов") {
@@ -57,6 +66,16 @@ class MkplAdProcessor(
5766

5867
finishAdValidation("Успешное завершение процедуры валидации")
5968
}
69+
chain {
70+
title = "Логика чтения"
71+
repoRead("Чтение объявления из БД")
72+
worker {
73+
title = "Подготовка ответа для Read"
74+
on { state == MkplState.RUNNING }
75+
handle { adRepoDone = adRepoRead }
76+
}
77+
}
78+
prepareResult("Подготовка ответа")
6079
}
6180
operation("Изменить объявление", MkplCommand.UPDATE) {
6281
stubs("Обработка стабов") {
@@ -84,6 +103,13 @@ class MkplAdProcessor(
84103

85104
finishAdValidation("Успешное завершение процедуры валидации")
86105
}
106+
chain {
107+
title = "Логика сохранения"
108+
repoRead("Чтение объявления из БД")
109+
repoPrepareUpdate("Подготовка объекта для обновления")
110+
repoUpdate("Обновление объявления в БД")
111+
}
112+
prepareResult("Подготовка ответа")
87113
}
88114
operation("Удалить объявление", MkplCommand.DELETE) {
89115
stubs("Обработка стабов") {
@@ -104,6 +130,13 @@ class MkplAdProcessor(
104130
validateLockProperFormat("Проверка формата lock")
105131
finishAdValidation("Успешное завершение процедуры валидации")
106132
}
133+
chain {
134+
title = "Логика удаления"
135+
repoRead("Чтение объявления из БД")
136+
repoPrepareDelete("Подготовка объекта для удаления")
137+
repoDelete("Удаление объявления из БД")
138+
}
139+
prepareResult("Подготовка ответа")
107140
}
108141
operation("Поиск объявлений", MkplCommand.SEARCH) {
109142
stubs("Обработка стабов") {
@@ -118,6 +151,8 @@ class MkplAdProcessor(
118151

119152
finishAdFilterValidation("Успешное завершение процедуры валидации")
120153
}
154+
repoSearch("Поиск объявления в БД по фильтру")
155+
prepareResult("Подготовка ответа")
121156
}
122157
operation("Поиск подходящих предложений для объявления", MkplCommand.OFFERS) {
123158
stubs("Обработка стабов") {
@@ -134,6 +169,13 @@ class MkplAdProcessor(
134169

135170
finishAdValidation("Успешное завершение процедуры валидации")
136171
}
172+
chain {
173+
title = "Логика поиска в БД"
174+
repoRead("Чтение объявления из БД")
175+
repoPrepareOffers("Подготовка данных для поиска предложений")
176+
repoOffers("Поиск предложений для объявления в БД")
177+
}
178+
prepareResult("Подготовка ответа")
137179
}
138180
}.build()
139181
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
package ru.otus.otuskotlin.marketplace.biz.exceptions
2+
3+
import ru.otus.otuskotlin.marketplace.common.models.MkplWorkMode
4+
5+
class MkplAdDbNotConfiguredException(val workMode: MkplWorkMode): Exception(
6+
"Database is not configured properly for workmode $workMode"
7+
)

ok-marketplace-be/ok-marketplace-biz/src/commonMain/kotlin/general/Stubs.kt

-13
This file was deleted.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.helpers.fail
5+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
6+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdRequest
7+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseErr
8+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseErrWithData
9+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseOk
10+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
11+
import ru.otus.otuskotlin.marketplace.cor.worker
12+
13+
fun ICorChainDsl<MkplContext>.repoCreate(title: String) = worker {
14+
this.title = title
15+
description = "Добавление объявления в БД"
16+
on { state == MkplState.RUNNING }
17+
handle {
18+
val request = DbAdRequest(adRepoPrepare)
19+
when(val result = adRepo.createAd(request)) {
20+
is DbAdResponseOk -> adRepoDone = result.data
21+
is DbAdResponseErr -> fail(result.errors)
22+
is DbAdResponseErrWithData -> fail(result.errors)
23+
}
24+
}
25+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.helpers.fail
5+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
6+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdIdRequest
7+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseErr
8+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseErrWithData
9+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseOk
10+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
11+
import ru.otus.otuskotlin.marketplace.cor.worker
12+
13+
fun ICorChainDsl<MkplContext>.repoDelete(title: String) = worker {
14+
this.title = title
15+
description = "Удаление объявления из БД по ID"
16+
on { state == MkplState.RUNNING }
17+
handle {
18+
val request = DbAdIdRequest(adRepoPrepare)
19+
when(val result = adRepo.deleteAd(request)) {
20+
is DbAdResponseOk -> adRepoDone = result.data
21+
is DbAdResponseErr -> {
22+
fail(result.errors)
23+
adRepoDone = adRepoRead
24+
}
25+
is DbAdResponseErrWithData -> {
26+
fail(result.errors)
27+
adRepoDone = result.data
28+
}
29+
}
30+
}
31+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.helpers.fail
5+
import ru.otus.otuskotlin.marketplace.common.models.MkplDealSide
6+
import ru.otus.otuskotlin.marketplace.common.models.MkplError
7+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
8+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdFilterRequest
9+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdsResponseErr
10+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdsResponseOk
11+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
12+
import ru.otus.otuskotlin.marketplace.cor.worker
13+
14+
fun ICorChainDsl<MkplContext>.repoOffers(title: String) = worker {
15+
this.title = title
16+
description = "Поиск предложений для объявления по названию"
17+
on { state == MkplState.RUNNING }
18+
handle {
19+
val adRequest = adRepoPrepare
20+
val filter = DbAdFilterRequest(
21+
titleFilter = adRequest.title,
22+
dealSide = when (adRequest.adType) {
23+
MkplDealSide.DEMAND -> MkplDealSide.SUPPLY
24+
MkplDealSide.SUPPLY -> MkplDealSide.DEMAND
25+
MkplDealSide.NONE -> MkplDealSide.NONE
26+
}
27+
)
28+
val dbResponse = if (filter.dealSide == MkplDealSide.NONE) {
29+
DbAdsResponseErr(
30+
errors = listOf(
31+
MkplError(
32+
field = "adType",
33+
message = "Type of ad must not be empty"
34+
)
35+
)
36+
)
37+
} else {
38+
adRepo.searchAd(filter)
39+
}
40+
41+
when (dbResponse) {
42+
is DbAdsResponseOk -> adsRepoDone = dbResponse.data.toMutableList()
43+
is DbAdsResponseErr -> fail(dbResponse.errors)
44+
}
45+
}
46+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
5+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
6+
import ru.otus.otuskotlin.marketplace.cor.worker
7+
8+
fun ICorChainDsl<MkplContext>.repoPrepareCreate(title: String) = worker {
9+
this.title = title
10+
description = "Подготовка объекта к сохранению в базе данных"
11+
on { state == MkplState.RUNNING }
12+
handle {
13+
adRepoRead = adValidated.deepCopy()
14+
adRepoPrepare = adRepoRead
15+
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
5+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
6+
import ru.otus.otuskotlin.marketplace.cor.worker
7+
8+
fun ICorChainDsl<MkplContext>.repoPrepareDelete(title: String) = worker {
9+
this.title = title
10+
description = """
11+
Готовим данные к удалению из БД
12+
""".trimIndent()
13+
on { state == MkplState.RUNNING }
14+
handle {
15+
adRepoPrepare = adValidated.deepCopy()
16+
}
17+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
5+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
6+
import ru.otus.otuskotlin.marketplace.cor.worker
7+
8+
fun ICorChainDsl<MkplContext>.repoPrepareOffers(title: String) = worker {
9+
this.title = title
10+
description = "Готовим данные к поиску предложений в БД"
11+
on { state == MkplState.RUNNING }
12+
handle {
13+
adRepoPrepare = adRepoRead.deepCopy()
14+
adRepoDone = adRepoRead.deepCopy()
15+
}
16+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
5+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
6+
import ru.otus.otuskotlin.marketplace.cor.worker
7+
8+
fun ICorChainDsl<MkplContext>.repoPrepareUpdate(title: String) = worker {
9+
this.title = title
10+
description = "Готовим данные к сохранению в БД: совмещаем данные, прочитанные из БД, " +
11+
"и данные, полученные от пользователя"
12+
on { state == MkplState.RUNNING }
13+
handle {
14+
adRepoPrepare = adRepoRead.deepCopy().apply {
15+
this.title = adValidated.title
16+
description = adValidated.description
17+
adType = adValidated.adType
18+
visibility = adValidated.visibility
19+
}
20+
}
21+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.helpers.fail
5+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
6+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdIdRequest
7+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseErr
8+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseErrWithData
9+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdResponseOk
10+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
11+
import ru.otus.otuskotlin.marketplace.cor.worker
12+
13+
fun ICorChainDsl<MkplContext>.repoRead(title: String) = worker {
14+
this.title = title
15+
description = "Чтение объявления из БД"
16+
on { state == MkplState.RUNNING }
17+
handle {
18+
val request = DbAdIdRequest(adValidated)
19+
when(val result = adRepo.readAd(request)) {
20+
is DbAdResponseOk -> adRepoRead = result.data
21+
is DbAdResponseErr -> fail(result.errors)
22+
is DbAdResponseErrWithData -> {
23+
fail(result.errors)
24+
adRepoRead = result.data
25+
}
26+
}
27+
}
28+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
package ru.otus.otuskotlin.marketplace.biz.repo
2+
3+
import ru.otus.otuskotlin.marketplace.common.MkplContext
4+
import ru.otus.otuskotlin.marketplace.common.helpers.fail
5+
import ru.otus.otuskotlin.marketplace.common.models.MkplState
6+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdFilterRequest
7+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdsResponseErr
8+
import ru.otus.otuskotlin.marketplace.common.repo.DbAdsResponseOk
9+
import ru.otus.otuskotlin.marketplace.cor.ICorChainDsl
10+
import ru.otus.otuskotlin.marketplace.cor.worker
11+
12+
fun ICorChainDsl<MkplContext>.repoSearch(title: String) = worker {
13+
this.title = title
14+
description = "Поиск объявлений в БД по фильтру"
15+
on { state == MkplState.RUNNING }
16+
handle {
17+
val request = DbAdFilterRequest(
18+
titleFilter = adFilterValidated.searchString,
19+
ownerId = adFilterValidated.ownerId,
20+
dealSide = adFilterValidated.dealSide,
21+
)
22+
when(val result = adRepo.searchAd(request)) {
23+
is DbAdsResponseOk -> adsRepoDone = result.data.toMutableList()
24+
is DbAdsResponseErr -> fail(result.errors)
25+
}
26+
}
27+
}

0 commit comments

Comments
 (0)