|
14 | 14 | package me.ahoo.wow.webflux.route.command
|
15 | 15 |
|
16 | 16 | import me.ahoo.wow.api.command.CommandMessage
|
17 |
| -import me.ahoo.wow.api.modeling.TenantId |
18 | 17 | import me.ahoo.wow.command.CommandOperator.withOperator
|
19 | 18 | import me.ahoo.wow.command.factory.CommandBuilder.Companion.commandBuilder
|
20 | 19 | import me.ahoo.wow.command.factory.CommandMessageFactory
|
21 | 20 | import me.ahoo.wow.infra.ifNotBlank
|
22 | 21 | import me.ahoo.wow.messaging.withLocalFirst
|
23 | 22 | import me.ahoo.wow.modeling.matedata.AggregateMetadata
|
24 |
| -import me.ahoo.wow.openapi.RoutePaths |
25 | 23 | import me.ahoo.wow.openapi.command.CommandHeaders
|
26 |
| -import me.ahoo.wow.serialization.MessageRecords |
27 | 24 | import org.springframework.web.reactive.function.server.ServerRequest
|
28 | 25 | import reactor.core.publisher.Mono
|
29 | 26 |
|
30 |
| -object CommandParser { |
31 |
| - fun ServerRequest.getTenantId(aggregateMetadata: AggregateMetadata<*, *>): String? { |
32 |
| - aggregateMetadata.staticTenantId.ifNotBlank<String> { |
33 |
| - return it |
34 |
| - } |
35 |
| - pathVariables()[MessageRecords.TENANT_ID].ifNotBlank<String> { |
36 |
| - return it |
37 |
| - } |
38 |
| - headers().firstHeader(CommandHeaders.TENANT_ID).ifNotBlank<String> { |
39 |
| - return it |
40 |
| - } |
41 |
| - return null |
42 |
| - } |
43 |
| - |
44 |
| - fun ServerRequest.getTenantIdOrDefault(aggregateMetadata: AggregateMetadata<*, *>): String { |
45 |
| - return getTenantId(aggregateMetadata) ?: return TenantId.DEFAULT_TENANT_ID |
46 |
| - } |
47 |
| - |
48 |
| - fun ServerRequest.getAggregateId(): String? { |
49 |
| - headers().firstHeader(CommandHeaders.AGGREGATE_ID).ifNotBlank<String> { |
50 |
| - return it |
51 |
| - } |
52 |
| - pathVariables()[RoutePaths.ID_KEY].ifNotBlank<String> { |
53 |
| - return it |
54 |
| - } |
55 |
| - return null |
56 |
| - } |
57 |
| - |
58 |
| - fun ServerRequest.getLocalFirst(): Boolean? { |
59 |
| - headers().firstHeader(CommandHeaders.LOCAL_FIRST).ifNotBlank<String> { |
60 |
| - return it.toBoolean() |
61 |
| - } |
62 |
| - return null |
63 |
| - } |
| 27 | +interface CommandMessageParser { |
| 28 | + fun parse( |
| 29 | + aggregateMetadata: AggregateMetadata<*, *>, |
| 30 | + commandBody: Any, |
| 31 | + request: ServerRequest |
| 32 | + ): Mono<CommandMessage<Any>> |
| 33 | +} |
64 | 34 |
|
65 |
| - fun ServerRequest.parse( |
| 35 | +class DefaultCommandMessageParser(private val commandMessageFactory: CommandMessageFactory) : CommandMessageParser { |
| 36 | + override fun parse( |
66 | 37 | aggregateMetadata: AggregateMetadata<*, *>,
|
67 | 38 | commandBody: Any,
|
68 |
| - commandMessageFactory: CommandMessageFactory |
| 39 | + request: ServerRequest |
69 | 40 | ): Mono<CommandMessage<Any>> {
|
70 |
| - val aggregateId = getAggregateId() |
71 |
| - val tenantId = getTenantId(aggregateMetadata) |
72 |
| - val aggregateVersion = headers().firstHeader(CommandHeaders.AGGREGATE_VERSION)?.toIntOrNull() |
73 |
| - val requestId = headers().firstHeader(CommandHeaders.REQUEST_ID).ifNotBlank { it } |
| 41 | + val aggregateId = request.getAggregateId() |
| 42 | + val tenantId = request.getTenantId(aggregateMetadata) |
| 43 | + val aggregateVersion = request.headers().firstHeader(CommandHeaders.AGGREGATE_VERSION)?.toIntOrNull() |
| 44 | + val requestId = request.headers().firstHeader(CommandHeaders.REQUEST_ID).ifNotBlank { it } |
74 | 45 | val commandBuilder = commandBody.commandBuilder()
|
75 | 46 | .aggregateId(aggregateId)
|
76 | 47 | .tenantId(tenantId)
|
77 | 48 | .aggregateVersion(aggregateVersion)
|
78 | 49 | .requestId(requestId)
|
79 | 50 | .namedAggregate(aggregateMetadata.namedAggregate)
|
80 |
| - getLocalFirst()?.let { |
| 51 | + request.getLocalFirst()?.let { |
81 | 52 | commandBuilder.header { header ->
|
82 | 53 | header.withLocalFirst(it)
|
83 | 54 | }
|
84 | 55 | }
|
85 |
| - return principal().map { |
| 56 | + return request.principal().map { |
86 | 57 | commandBuilder.header { header ->
|
87 | 58 | header.withOperator(it.name)
|
88 | 59 | }
|
|
0 commit comments