@@ -18,13 +18,6 @@ class BuyProductFacade(
18
18
private lateinit var orchestrator: Orchestrator <Long , Product >
19
19
20
20
fun buyProduct (token : String , productId : Long ): Product {
21
- val buyer = identityApi.getUserByToken(token)
22
- val product = productService.getProductById(productId)
23
-
24
- require(product.getPrice() <= buyer.points.toLong()) {
25
- " Cannot buy product cause buyer does not have enough point \" ${product.getPrice()} \" >= \" ${buyer.points} \" "
26
- }
27
-
28
21
return orchestrator.sagaSync(
29
22
productId,
30
23
mapOf (
@@ -38,10 +31,14 @@ class BuyProductFacade(
38
31
this .orchestrator = orchestratorFactory.create<Long >(" buy product orchestrator" )
39
32
.startWithContext(
40
33
contextOrchestrate = { context, productId ->
41
- val token = context.decodeContext(" token" , String ::class )
42
- val buyer = identityApi.getUserByToken(token)
34
+ val buyer = identityApi.getUserByToken(context.decodeContext(" token" , String ::class ))
35
+ val product = productService.getProductById(productId)
36
+
37
+ require(product.getPrice() <= buyer.points.toLong()) {
38
+ " Cannot buy product cause buyer does not have enough point \" ${product.getPrice()} \" >= \" ${buyer.points} \" "
39
+ }
43
40
44
- productService.buyProduct (productId, buyer.id.toLong())
41
+ productService.waitBuyProduct (productId, buyer.id.toLong())
45
42
},
46
43
contextRollback = { _, productId -> productService.rollbackProduct(productId) }
47
44
)
@@ -61,19 +58,26 @@ class BuyProductFacade(
61
58
identityApi.increasePoint(token, idempotencyKey, product.getPrice().toString())
62
59
}
63
60
)
64
- .commitWithContext { context, product ->
65
- val token = context.decodeContext(" token" , String ::class )
66
- val idempotencyKey = context.decodeContext(" idempotencyKey" , String ::class )
61
+ .joinWithContext(
62
+ contextOrchestrate = { context, product ->
63
+ val token = context.decodeContext(" token" , String ::class )
64
+ val idempotencyKey = context.decodeContext(" idempotencyKey" , String ::class )
67
65
68
- renderApi.addPersona(
69
- token,
70
- idempotencyKey,
71
- product.persona.personaId,
72
- product.persona.personaLevel,
73
- product.persona.personaType,
74
- )
66
+ renderApi.addPersona(
67
+ token,
68
+ idempotencyKey,
69
+ product.persona.personaId,
70
+ product.persona.personaLevel,
71
+ product.persona.personaType,
72
+ )
75
73
76
- product
77
- }
74
+ product
75
+ },
76
+ contextRollback = { context, product ->
77
+ val token = context.decodeContext(" token" , String ::class )
78
+
79
+ renderApi.deletePersonaById(token, product.persona.personaId)
80
+ }
81
+ ).commit { product -> productService.buyProduct(product.id) }
78
82
}
79
83
}
0 commit comments