sendRecommendation method

Future<bool> sendRecommendation(
  1. String rootType,
  2. RecommendationNodeModel recommendationNodeModel
)

Add a new recommendation

  • Check if the data node has already a recommendation -> not send a new one
  • if the data node does not have a recommendation, or the currentRecommendationId = '', then send a new once

Implementation

Future<bool> sendRecommendation(
    String rootType, RecommendationNodeModel recommendationNodeModel) async {
  String recommendationStatusPath =
      '$recommendationStatusRootPath:${recommendationNodeModel.sensorId}';
  String? currentRecommendationId = await _readValueNode(
      recommendationStatusPath, 'currentRecommendationId');
  if (currentRecommendationId != null && currentRecommendationId.isNotEmpty) {
    log('A recommendation has been sent and unresolved $currentRecommendationId. Do not send a new once');
    return true;
  }
  log('Going to send a new recommendation');
  String recommendationId = getUniqueId();
  String createdDate = DateTime.now().toIso8601String();
  try {
    Node node = NodeImpl(recommendationId, pluginId, recommendationRootPath);
    await addMultilingualValues(node, 'short', recommendationNodeModel.short);
    await addMultilingualValues(node, 'long', recommendationNodeModel.long);
    await node.addOrUpdateValue(
      NodeValueImpl('Action', recommendationNodeModel.action),
    );
    await node.addOrUpdateValue(
      NodeValueImpl('relatedThreatsWeights',
          recommendationNodeModel.relatedThreatsWeights),
    );
    await node.addOrUpdateValue(
      NodeValueImpl('costs', recommendationNodeModel.costs),
    );
    await node.addOrUpdateValue(
      NodeValueImpl(
          'RecommendationType', recommendationNodeModel.recommendationType),
    );
    await node.addOrUpdateValue(
      NodeValueImpl('pluginId', pluginId),
    );
    await node.addOrUpdateValue(
      NodeValueImpl('pluginName', pluginName),
    );
    await node.addOrUpdateValue(
      NodeValueImpl('os', recommendationNodeModel.os),
    );
    await node.addOrUpdateValue(
      NodeValueImpl('createdDate', createdDate),
    );

    log('A recommendation node has been created');
    log(node.toString());
    try {
      await storageController!.addOrUpdate(node);
      log('After adding a recommendation node $recommendationId');
      await sendDataNode(
        recommendationNodeModel.sensorId,
        recommendationStatusRootPath!,
        ['currentRecommendationId'],
        [recommendationId],
      );
      return true;
    } catch (e2, trace2) {
      log('Failed to update Storage');
      log(e2.toString());
      if (exceptionHandler != null) {
        exceptionHandler!(e2, trace2);
      }
      return false;
    }
  } catch (e, trace) {
    log('Failed to add a recommendation node $recommendationId');
    log(e.toString());
    if (exceptionHandler != null) {
      exceptionHandler!(e, trace);
    }
    return false;
  }
}