@@ -15,8 +15,9 @@ const {
15
15
/**
16
16
* Process create entity message
17
17
* @param {Object } message the kafka message
18
+ * @param {String } transactionId
18
19
*/
19
- async function processCreate ( message ) {
20
+ async function processCreate ( message , transactionId ) {
20
21
const resource = message . payload . resource
21
22
if ( _ . includes ( _ . keys ( topResources ) , resource ) ) {
22
23
// process the top resources such as user, skill...
@@ -33,7 +34,7 @@ async function processCreate (message) {
33
34
// process user resources such as userSkill, userAttribute...
34
35
const userResource = userResources [ resource ]
35
36
userResource . validate ( message . payload )
36
- const user = await helper . getUser ( message . payload . userId )
37
+ const { seqNo , primaryTerm , user } = await helper . getUser ( message . payload . userId , transactionId )
37
38
const relateId = message . payload [ userResource . relateKey ]
38
39
if ( ! user [ userResource . propertyName ] ) {
39
40
user [ userResource . propertyName ] = [ ]
@@ -45,13 +46,13 @@ async function processCreate (message) {
45
46
throw helper . getErrorWithStatus ( '[version_conflict_engine_exception]' , 409 )
46
47
} else {
47
48
user [ userResource . propertyName ] . push ( _ . omit ( message . payload , 'resource' ) )
48
- await helper . updateUser ( message . payload . userId , user )
49
+ await helper . updateUser ( message . payload . userId , user , seqNo , primaryTerm , transactionId )
49
50
}
50
51
} else if ( _ . includes ( _ . keys ( organizationResources ) , resource ) ) {
51
52
// process org resources such as org skill provider
52
53
const orgResources = organizationResources [ resource ]
53
54
orgResources . validate ( message . payload )
54
- const org = await helper . getOrg ( message . payload . organizationId )
55
+ const { seqNo , primaryTerm , org } = await helper . getOrg ( message . payload . organizationId , transactionId )
55
56
const relateId = message . payload [ orgResources . relateKey ]
56
57
if ( ! org [ orgResources . propertyName ] ) {
57
58
org [ orgResources . propertyName ] = [ ]
@@ -63,7 +64,7 @@ async function processCreate (message) {
63
64
throw helper . getErrorWithStatus ( '[version_conflict_engine_exception]' , 409 )
64
65
} else {
65
66
org [ orgResources . propertyName ] . push ( _ . omit ( message . payload , 'resource' ) )
66
- await helper . updateOrg ( message . payload . organizationId , org )
67
+ await helper . updateOrg ( message . payload . organizationId , org , seqNo , primaryTerm , transactionId )
67
68
}
68
69
} else {
69
70
logger . info ( `Ignore this message since resource is not in [${ _ . union ( _ . keys ( topResources ) , _ . keys ( userResources ) , _ . keys ( organizationResources ) ) } ]` )
@@ -79,14 +80,16 @@ processCreate.schema = {
79
80
payload : Joi . object ( ) . keys ( {
80
81
resource : Joi . string ( ) . required ( )
81
82
} ) . required ( ) . unknown ( true )
82
- } ) . required ( )
83
+ } ) . required ( ) ,
84
+ transactionId : Joi . string ( ) . required ( )
83
85
}
84
86
85
87
/**
86
88
* Process update entity message
87
89
* @param {Object } message the kafka message
90
+ * @param {String } transactionId
88
91
*/
89
- async function processUpdate ( message ) {
92
+ async function processUpdate ( message , transactionId ) {
90
93
const resource = message . payload . resource
91
94
if ( _ . includes ( _ . keys ( topResources ) , resource ) ) {
92
95
logger . info ( `Processing top level resource: ${ resource } ` )
@@ -95,15 +98,16 @@ async function processUpdate (message) {
95
98
const client = await helper . getESClient ( )
96
99
const { index, type } = topResources [ resource ]
97
100
const id = message . payload . id
98
- const source = await client . getSource ( { index, type, id } )
101
+ const source = await client . get ( { index, type, id, transaction : true } )
99
102
await client . update ( {
100
103
index,
101
104
type,
102
105
id,
103
106
body : {
104
- doc : _ . assign ( source , _ . omit ( message . payload , 'resource' ) )
107
+ doc : _ . assign ( source . _source , _ . omit ( message . payload , 'resource' ) )
105
108
} ,
106
- refresh : true
109
+ if_seq_no : source . _seq_no ,
110
+ if_primary_term : source . _primary_term
107
111
} )
108
112
} else if ( _ . includes ( _ . keys ( userResources ) , resource ) ) {
109
113
// process user resources such as userSkill, userAttribute...
@@ -112,10 +116,7 @@ async function processUpdate (message) {
112
116
logger . info ( `Processing user level resource: ${ resource } :${ relateId } ` )
113
117
userResource . validate ( message . payload )
114
118
logger . info ( `Resource validated for ${ relateId } ` )
115
- let user = await helper . getUser ( message . payload . userId , false )
116
- const seqNo = user . _seq_no
117
- const primaryTerm = user . _primary_term
118
- user = user . _source
119
+ const { seqNo, primaryTerm, user } = await helper . getUser ( message . payload . userId , transactionId )
119
120
logger . info ( `User fetched ${ user . id } and ${ relateId } ` )
120
121
// const relateId = message.payload[userResource.relateKey]
121
122
@@ -127,15 +128,15 @@ async function processUpdate (message) {
127
128
const updateIndex = _ . findIndex ( user [ userResource . propertyName ] , [ userResource . relateKey , relateId ] )
128
129
user [ userResource . propertyName ] . splice ( updateIndex , 1 , _ . omit ( message . payload , 'resource' ) )
129
130
logger . info ( `Updating ${ user . id } and ${ relateId } ` )
130
- await helper . updateUser ( message . payload . userId , user , seqNo , primaryTerm )
131
+ await helper . updateUser ( message . payload . userId , user , seqNo , primaryTerm , transactionId )
131
132
logger . info ( `Updated ${ user . id } and ${ relateId } ` )
132
133
}
133
134
} else if ( _ . includes ( _ . keys ( organizationResources ) , resource ) ) {
134
135
logger . info ( `Processing org level resource: ${ resource } ` )
135
136
// process org resources such as org skill providers
136
137
const orgResource = organizationResources [ resource ]
137
138
orgResource . validate ( message . payload )
138
- const org = await helper . getOrg ( message . payload . organizationId )
139
+ const { seqNo , primaryTerm , org } = await helper . getOrg ( message . payload . organizationId , transactionId )
139
140
const relateId = message . payload [ orgResource . relateKey ]
140
141
141
142
// check the resource exist
@@ -145,7 +146,7 @@ async function processUpdate (message) {
145
146
} else {
146
147
const updateIndex = _ . findIndex ( org [ orgResource . propertyName ] , [ orgResource . relateKey , relateId ] )
147
148
org [ orgResource . propertyName ] . splice ( updateIndex , 1 , _ . omit ( message . payload , 'resource' ) )
148
- await helper . updateOrg ( message . payload . organizationId , org )
149
+ await helper . updateOrg ( message . payload . organizationId , org , seqNo , primaryTerm , transactionId )
149
150
}
150
151
} else {
151
152
logger . info ( `Ignore this message since resource is not in [${ _ . union ( _ . keys ( topResources ) , _ . keys ( userResources ) , _ . keys ( organizationResources ) ) } ]` )
@@ -161,14 +162,16 @@ processUpdate.schema = {
161
162
payload : Joi . object ( ) . keys ( {
162
163
resource : Joi . string ( ) . required ( )
163
164
} ) . required ( ) . unknown ( true )
164
- } ) . required ( )
165
+ } ) . required ( ) ,
166
+ transactionId : Joi . string ( ) . required ( )
165
167
}
166
168
167
169
/**
168
170
* Process delete entity message
169
171
* @param {Object } message the kafka message
172
+ * @param {String } transactionId
170
173
*/
171
- async function processDelete ( message ) {
174
+ async function processDelete ( message , transactionId ) {
172
175
const resource = message . payload . resource
173
176
if ( _ . includes ( _ . keys ( topResources ) , resource ) ) {
174
177
// process the top resources such as user, skill...
@@ -184,7 +187,7 @@ async function processDelete (message) {
184
187
// process user resources such as userSkill, userAttribute...
185
188
const userResource = userResources [ resource ]
186
189
userResource . validate ( message . payload )
187
- const user = await helper . getUser ( message . payload . userId )
190
+ const { seqNo , primaryTerm , user } = await helper . getUser ( message . payload . userId , transactionId )
188
191
const relateId = message . payload [ userResource . relateKey ]
189
192
190
193
// check the resource exist
@@ -193,13 +196,13 @@ async function processDelete (message) {
193
196
throw helper . getErrorWithStatus ( '[resource_not_found_exception]' , 404 )
194
197
} else {
195
198
_ . remove ( user [ userResource . propertyName ] , [ userResource . relateKey , relateId ] )
196
- await helper . updateUser ( message . payload . userId , user )
199
+ await helper . updateUser ( message . payload . userId , user , seqNo , primaryTerm , transactionId )
197
200
}
198
201
} else if ( _ . includes ( _ . keys ( organizationResources ) , resource ) ) {
199
202
// process user resources such as org skill provider
200
203
const orgResource = organizationResources [ resource ]
201
204
orgResource . validate ( message . payload )
202
- const org = await helper . getOrg ( message . payload . organizationId )
205
+ const { seqNo , primaryTerm , org } = await helper . getOrg ( message . payload . organizationId , transactionId )
203
206
const relateId = message . payload [ orgResource . relateKey ]
204
207
205
208
// check the resource exist
@@ -208,7 +211,7 @@ async function processDelete (message) {
208
211
throw helper . getErrorWithStatus ( '[resource_not_found_exception]' , 404 )
209
212
} else {
210
213
_ . remove ( org [ orgResource . propertyName ] , [ orgResource . relateKey , relateId ] )
211
- await helper . updateOrg ( message . payload . organizationId , org )
214
+ await helper . updateOrg ( message . payload . organizationId , org , seqNo , primaryTerm , transactionId )
212
215
}
213
216
} else {
214
217
logger . info ( `Ignore this message since resource is not in [${ _ . union ( _ . keys ( topResources ) , _ . keys ( userResources ) , _ . keys ( organizationResources ) ) } ]` )
@@ -224,7 +227,8 @@ processDelete.schema = {
224
227
payload : Joi . object ( ) . keys ( {
225
228
resource : Joi . string ( ) . required ( )
226
229
} ) . required ( ) . unknown ( true )
227
- } ) . required ( )
230
+ } ) . required ( ) ,
231
+ transactionId : Joi . string ( ) . required ( )
228
232
}
229
233
230
234
module . exports = {
0 commit comments