chg: [eventReport] Load tags in one call

pull/6779/head
Jakub Onderka 2020-12-19 17:28:59 +01:00
parent e2263d6c56
commit 02ba939e57
2 changed files with 69 additions and 58 deletions

View File

@ -1116,10 +1116,13 @@ class TagsController extends AppController
'conditions' => $conditions,
'recursive' => -1
));
if (!$searchIfTagExists && empty($tags)) {
$tags = [];
foreach ($tag as $i => $tagName) {
$tags[] = ['Tag' => ['name' => $tagName], 'simulatedTag' => true];
if (!$searchIfTagExists) {
$foundTagNames = Hash::extract($tags, "{n}.Tag.name");
foreach ($tag as $tagName) {
if (!in_array($tagName, $foundTagNames, true)) {
// Tag not found, insert simulated tag
$tags[] = ['Tag' => ['name' => $tagName], 'simulatedTag' => true];
}
}
}
$this->loadModel('Taxonomy');

View File

@ -651,23 +651,34 @@ function attachRemoteMISPElements() {
$div.html(cache_matrix[cacheKey])
}
})
var tagNamesToLoad = [];
var tagsLoading = [];
$('.embeddedTag[data-scope="tag"]').each(function() {
var $div = $(this)
$div.append($('<span/>').append(loadingSpanAnimation))
var eventID = $div.data('eventid')
var elementID = $div.data('elementid')
var cacheKey = eventid + '-' + elementID
clearTimeout(tagTimers[cacheKey]);
if (cache_tag[cacheKey] === undefined) {
tagTimers[cacheKey] = setTimeout(function() {
fetchTagInfo(eventID, elementID, function() {
attachTagInfo($div, eventID, elementID, true)
})
}, firstCustomPostRenderCall ? 0 : slowDebounceDelay);
var $div = $(this);
var elementID = $div.data('elementid');
if (!(elementID in cache_tag)) {
$div.append($('<span/>').append(loadingSpanAnimation));
tagNamesToLoad.push(elementID);
tagsLoading.push($div);
} else {
$div.html(cache_tag[cacheKey])
$div.html(cache_tag[elementID]);
}
})
}).promise().done(function() {
if (tagNamesToLoad.length === 0) {
return;
}
fetchTagInfo(tagNamesToLoad, function() {
$.each(tagsLoading, function() {
var $div = $(this);
var elementID = $div.data('elementid');
if (elementID in cache_tag) {
$div.html(cache_tag[elementID]);
}
});
});
});
if (firstCustomPostRenderCall) {
// Wait, because .each calls are asynchronous
setTimeout(function() {
@ -720,56 +731,53 @@ function attachGalaxyMatrix($elem, eventid, elementID) {
})
}
function attachTagInfo($elem, eventid, elementID, all) {
var cacheKey = eventid + '-' + elementID
$elem.html(cache_tag[cacheKey])
if (all === true) {
$('.embeddedTag[data-scope="tag"]').filter(function() {
return $(this).data('eventid') == eventid && $(this).data('elementid') == elementID
}).html(cache_tag[cacheKey])
}
}
function fetchTagInfo(eventid, tagName, callback) {
function fetchTagInfo(tagNames, callback) {
$.ajax({
data: {
"tag": tagName,
"tag": tagNames,
},
success:function(data, textStatus) {
var $tag
success: function (data) {
var $tag, tagName;
data = $.parseJSON(data)
var tagData;
for (var i = 0; i < data.length; i++) {
var tag = data[i];
if (tag.Tag.name == tagName) {
tagData = data[i]
break
tagName = tag.Tag.name;
proxyMISPElements['tag'][tagName] = tag;
$tag = getTagReprensentation(tag);
cache_tag[tagName] = $tag[0].outerHTML;
}
// If tag name doesn't exists, construct empty placeholder
for (i = 0; i < tagNames.length; i++) {
tagName = tagNames[i];
if (!(tagName in cache_tag)) {
$tag = constructTagHtml(tagName, '#ffffff', {'border': '1px solid #000'});
cache_tag[tagName] = $tag[0].outerHTML;
}
}
if (tagData === undefined) {
tagData = {}
$tag = constructTagHtml(tagName, '#ffffff', {'border': '1px solid #000'})
} else {
$tag = getTagReprensentation(tagData)
proxyMISPElements['tag'][tagName] = tagData
},
error: function (jqXHR, textStatus, errorThrown) {
// Query failed, fill cache with placeholder
var tagName, templateVariables;
for (var i = 0; i < tagNames.length; i++) {
tagName = tagNames[i];
if (!(tagName in cache_tag)) {
templateVariables = sanitizeObject({
scope: 'Error while fetching tag',
id: tagName
});
cache_tag[tagName] = dotTemplateInvalid(templateVariables);
}
}
var cacheKey = eventid + '-' + tagName
cache_tag[cacheKey] = $tag[0].outerHTML;
},
error: function(jqXHR, textStatus, errorThrown) {
var templateVariables = sanitizeObject({
scope: 'Error while fetching tag',
id: tagName
})
var placeholder = dotTemplateInvalid(templateVariables)
cache_tag[cacheKey] = placeholder;
},
complete: function() {
complete: function () {
if (callback !== undefined) {
callback()
}
},
type:"post",
type: "post",
url: baseurl + "/tags/search/0/1/0"
})
}
@ -1423,10 +1431,11 @@ function constructTag(tagName) {
function getTagReprensentation(tagData) {
var $tag
if(tagData.GalaxyCluster !== undefined) {
if (tagData.GalaxyCluster !== undefined) {
$tag = constructClusterTagHtml(tagData)
} else {
$tag = constructTagHtml(tagData.Tag.name, tagData.Tag.colour)
var color = tagData.Tag.colour ? tagData.Tag.colour : tagData.TaxonomyPredicate.colour;
$tag = constructTagHtml(tagData.Tag.name, color)
}
return $tag
}
@ -1491,8 +1500,7 @@ function constructTaxonomyInfo(tagData) {
}
function constructGalaxyInfo(tagData) {
var cacheKey = eventid + '-' + tagData.Tag.name
var tagHTML = cache_tag[cacheKey]
var tagHTML = cache_tag[tagData.Tag.name]
var $tag = $(tagHTML)
var $cluster = $('<div/>').append(
$('<span/>').append($tag),