@@ -145,6 +145,7 @@ class Migration(
145
145
def unapply (data : String ): Option [Array [Byte ]] = Try (java.util.Base64 .getDecoder.decode(data)).toOption
146
146
}
147
147
148
+ // store attachment id and check to prevent document already exists error
148
149
var dataIds = Set .empty[String ]
149
150
def containsOrAdd (id : String ) = {
150
151
dataIds.synchronized {
@@ -155,45 +156,56 @@ class Migration(
155
156
}
156
157
}
157
158
}
159
+
158
160
val mainHasher = Hasher (mainHash)
159
161
val extraHashers = Hasher (mainHash +: extraHashes : _* )
160
162
Seq (
163
+ // store alert attachment in datastore
161
164
Operation ((f : String ⇒ Source [JsObject , NotUsed ]) ⇒ {
162
- case " alert" ⇒ f(" alert" ).flatMapConcat { alert ⇒
163
- val artifactsAndData = Future .traverse((alert \ " artifacts" ).asOpt[List [JsObject ]].getOrElse(Nil )) { artifact ⇒
164
- (artifact \ " data" ).asOpt[String ]
165
- .collect {
166
- case AlertSrv .dataExtractor(filename, contentType, data @ Base64 (rawData)) ⇒
167
- val attachmentId = mainHasher.fromByteArray(rawData).head.toString()
168
- ds.getEntity(datastoreName, s " ${attachmentId}_0 " )
169
- .map(_ ⇒ Nil )
170
- .recover {
171
- case _ if containsOrAdd(attachmentId) ⇒ Nil
172
- case _ ⇒
173
- Seq (Json .obj(
174
- " _type" → datastoreName,
175
- " _id" → s " ${attachmentId}_0 " ,
176
- " data" → data))
177
- }
178
- .map { dataEntity ⇒
179
- val attachment = Attachment (filename, extraHashers.fromByteArray(rawData), rawData.length.toLong, contentType, attachmentId)
180
- (artifact - " data" + (" attachment" → Json .toJson(attachment))) → dataEntity
181
- }
165
+ case " alert" ⇒ f(" alert" ).flatMapConcat { alert ⇒
166
+ val artifactsAndData = Future .traverse((alert \ " artifacts" ).asOpt[List [JsObject ]].getOrElse(Nil )) { artifact ⇒
167
+ (artifact \ " data" ).asOpt[String ]
168
+ .collect {
169
+ case AlertSrv .dataExtractor(filename, contentType, data @ Base64 (rawData)) ⇒
170
+ val attachmentId = mainHasher.fromByteArray(rawData).head.toString()
171
+ ds.getEntity(datastoreName, s " ${attachmentId}_0 " )
172
+ .map(_ ⇒ Nil )
173
+ .recover {
174
+ case _ if containsOrAdd(attachmentId) ⇒ Nil
175
+ case _ ⇒
176
+ Seq (Json .obj(
177
+ " _type" → datastoreName,
178
+ " _id" → s " ${attachmentId}_0 " ,
179
+ " data" → data))
180
+ }
181
+ .map { dataEntity ⇒
182
+ val attachment = Attachment (filename, extraHashers.fromByteArray(rawData), rawData.length.toLong, contentType, attachmentId)
183
+ (artifact - " data" + (" attachment" → Json .toJson(attachment))) → dataEntity
184
+ }
185
+ }
186
+ .getOrElse(Future .successful(artifact → Nil ))
187
+ }
188
+ Source .fromFuture(artifactsAndData)
189
+ .mapConcat { ad ⇒
190
+ val updatedAlert = alert + (" artifacts" → JsArray (ad.map(_._1)))
191
+ updatedAlert :: ad.flatMap(_._2)
182
192
}
183
- .getOrElse(Future .successful(artifact → Nil ))
184
193
}
185
- Source .fromFuture(artifactsAndData)
186
- .mapConcat { ad ⇒
187
- val updatedAlert = alert + (" artifacts" → JsArray (ad.map(_._1)))
188
- updatedAlert :: ad.flatMap(_._2)
189
- }
190
- }
191
- case other ⇒ f(other)
192
- }),
194
+ case other ⇒ f(other)
195
+ }),
196
+ // Fix alert status
193
197
mapAttribute(" alert" , " status" ) {
194
198
case JsString (" Update" ) ⇒ JsString (" Updated" )
195
199
case JsString (" Ignore" ) ⇒ JsString (" Ignored" )
196
200
case other ⇒ other
201
+ },
202
+ // Fix double encode of metrics
203
+ mapEntity(" dblist" ) {
204
+ case dblist if (dblist \ " dblist" ).asOpt[String ].contains(" case_metrics" ) ⇒
205
+ (dblist \ " value" ).asOpt[String ].map(Json .parse).fold(dblist) { value ⇒
206
+ dblist + (" value" → value)
207
+ }
208
+ case other ⇒ other
197
209
})
198
210
}
199
211
0 commit comments