Skip to content
Snippets Groups Projects

Product/1188 logging extended

Merged Marcel Nellesen requested to merge Product/1188-LoggingExtended into Sprint/2021-05
2 files
+ 93
30
Compare changes
  • Side-by-side
  • Inline

Files

@@ -37,10 +37,10 @@ namespace Coscine.Api.Tree.Controllers
@@ -37,10 +37,10 @@ namespace Coscine.Api.Tree.Controllers
private readonly ProjectRoleModel _projectRoleModel;
private readonly ProjectRoleModel _projectRoleModel;
private readonly ProjectResourceModel _projectResourceModel;
private readonly ProjectResourceModel _projectResourceModel;
private readonly CoscineLogger _coscineLogger;
private readonly CoscineLogger _coscineLogger;
private readonly AnalyticsLogObject _analyticsLogObject;
private readonly string _blobApiLink;
private readonly string _blobApiLink;
private readonly string _prefix;
private readonly string _prefix;
private readonly IConfiguration _configuration;
private readonly IConfiguration _configuration;
 
private readonly string _shaclPropertyUrl = "http://www.w3.org/ns/shacl#property";
/// <summary>
/// <summary>
/// Tree controller constructor
/// Tree controller constructor
@@ -56,11 +56,10 @@ namespace Coscine.Api.Tree.Controllers
@@ -56,11 +56,10 @@ namespace Coscine.Api.Tree.Controllers
_projectResourceModel = new ProjectResourceModel();
_projectResourceModel = new ProjectResourceModel();
_coscineLogger = new CoscineLogger(logger);
_coscineLogger = new CoscineLogger(logger);
_analyticsLogObject = new AnalyticsLogObject();
var rule = _configuration.GetStringAndWait("traefik/frontends/Coscine.Api.Blob/routes/Coscine.Api.Blob/rule");
var rule = _configuration.GetStringAndWait("traefik/frontends/Coscine.Api.Blob/routes/Coscine.Api.Blob/rule");
var host = rule.Substring("Host:".Length, rule.IndexOf(";") - "Host:".Length);
var host = rule["Host:".Length..rule.IndexOf(";")];
var path = rule.Substring(rule.IndexOf("/"));
var path = rule[rule.IndexOf("/")..];
_blobApiLink = $"https://{host}{path}/blob/";
_blobApiLink = $"https://{host}{path}/blob/";
_prefix = _configuration.GetStringAndWait("coscine/global/epic/prefix");
_prefix = _configuration.GetStringAndWait("coscine/global/epic/prefix");
}
}
@@ -94,6 +93,11 @@ namespace Coscine.Api.Tree.Controllers
@@ -94,6 +93,11 @@ namespace Coscine.Api.Tree.Controllers
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
var check = CheckResourceIdAndPath(resourceId, path, out Resource resource);
var check = CheckResourceIdAndPath(resourceId, path, out Resource resource);
 
if (resource.ApplicationProfile[^1] != '/')
 
{
 
resource.ApplicationProfile += '/';
 
}
 
if (user == null || !_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
if (user == null || !_resourceModel.HasAccess(user, resource, UserRoles.Owner, UserRoles.Member))
{
{
return Forbid("User has no Access to this resource.");
return Forbid("User has no Access to this resource.");
@@ -115,13 +119,14 @@ namespace Coscine.Api.Tree.Controllers
@@ -115,13 +119,14 @@ namespace Coscine.Api.Tree.Controllers
var infos = await resourceTypeDefinition.ListEntries(resourceId, path, resourceTypeOptions);
var infos = await resourceTypeDefinition.ListEntries(resourceId, path, resourceTypeOptions);
var graphs = new List<JToken>();
var graphs = new List<JToken>();
int metadataCount = 0;
foreach (var info in infos)
foreach (var info in infos)
{
{
var id = GenerateId(resourceId, info.Key);
var id = GenerateId(resourceId, info.Key);
if (_rdfStoreConnector.HasGraph(id.AbsoluteUri))
if (_rdfStoreConnector.HasGraph(id.AbsoluteUri))
{
{
var graph = _rdfStoreConnector.GetGraph(id);
var graph = _rdfStoreConnector.GetGraph(id);
 
metadataCount = graph.Triples.Count;
graphs.Add(JToken.Parse(VDS.RDF.Writing.StringWriter.Write(graph, new RdfJsonWriter())));
graphs.Add(JToken.Parse(VDS.RDF.Writing.StringWriter.Write(graph, new RdfJsonWriter())));
}
}
}
}
@@ -133,10 +138,10 @@ namespace Coscine.Api.Tree.Controllers
@@ -133,10 +138,10 @@ namespace Coscine.Api.Tree.Controllers
{
{
var objectMetaInfo = new ObjectMetaInfo
var objectMetaInfo = new ObjectMetaInfo
{
{
Name = x.Key.Substring(x.Key.LastIndexOf("/") + 1),
Name = x.Key[(x.Key.LastIndexOf("/") + 1)..],
Path = x.Key,
Path = x.Key,
Size = (int)x.BodyBytes,
Size = (int)x.BodyBytes,
Kind = x.Key.Substring(x.Key.LastIndexOf(".") + 1),
Kind = x.Key[(x.Key.LastIndexOf(".") + 1)..],
Provider = resource.Type.DisplayName
Provider = resource.Type.DisplayName
};
};
var objectMetaInfoReturnObject = new ObjectMetaInfoReturnObject(objectMetaInfo, _blobApiLink, resource.Id.ToString());
var objectMetaInfoReturnObject = new ObjectMetaInfoReturnObject(objectMetaInfo, _blobApiLink, resource.Id.ToString());
@@ -170,10 +175,14 @@ namespace Coscine.Api.Tree.Controllers
@@ -170,10 +175,14 @@ namespace Coscine.Api.Tree.Controllers
};
};
return result;
return result;
})))
})))
))
))
);
);
 
 
if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics) && path != "/")
 
{
 
LogAnalyticsViewMd(_projectResourceModel.GetProjectForResource(resource.Id).Value, resource.Id, path, user, GetMetadataCompleteness(metadataCount, resource));
 
}
LogAnalytics("View MD", resourceId, path, user);
return Json(jObject);
return Json(jObject);
}
}
catch
catch
@@ -213,10 +222,11 @@ namespace Coscine.Api.Tree.Controllers
@@ -213,10 +222,11 @@ namespace Coscine.Api.Tree.Controllers
return Forbid("User is no project member!");
return Forbid("User is no project member!");
}
}
if (resource.ApplicationProfile[resource.ApplicationProfile.Length - 1] != '/')
if (resource.ApplicationProfile[^1] != '/')
{
{
resource.ApplicationProfile += '/';
resource.ApplicationProfile += '/';
}
}
 
json[graphNameUri.AbsoluteUri]["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"] = new JArray
json[graphNameUri.AbsoluteUri]["http://www.w3.org/1999/02/22-rdf-syntax-ns#type"] = new JArray
{
{
new JObject
new JObject
@@ -282,16 +292,25 @@ namespace Coscine.Api.Tree.Controllers
@@ -282,16 +292,25 @@ namespace Coscine.Api.Tree.Controllers
{
{
return BadRequest("Data has the wrong format!");
return BadRequest("Data has the wrong format!");
}
}
 
// store the data
// store the data
if (_rdfStoreConnector.HasGraph(graphNameUri))
if (_rdfStoreConnector.HasGraph(graphNameUri))
{
{
_rdfStoreConnector.ClearGraph(graphNameUri);
_rdfStoreConnector.ClearGraph(graphNameUri);
LogAnalytics("Update MD", resourceId, path, user);
 
if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics))
 
{
 
LogAnalyticsUpdateMd(_projectResourceModel.GetProjectForResource(resource.Id).Value, resource.Id, path, user, GetMetadataCompleteness(graph.Triples.Count, resource));
 
}
}
}
else
else
{
{
_rdfStoreConnector.CreateNamedGraph(graphNameUri);
_rdfStoreConnector.CreateNamedGraph(graphNameUri);
LogAnalytics("Upload MD", resourceId, path, user);
 
if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics))
 
{
 
LogAnalyticsUploadMd(_projectResourceModel.GetProjectForResource(resource.Id).Value, resource.Id, path, user, GetMetadataCompleteness(graph.Triples.Count, resource));
 
}
}
}
// BaseUri must be set for the sparql query
// BaseUri must be set for the sparql query
@@ -351,25 +370,67 @@ namespace Coscine.Api.Tree.Controllers
@@ -351,25 +370,67 @@ namespace Coscine.Api.Tree.Controllers
return null;
return null;
}
}
/// <summary>
private void LogAnalyticsViewMd(Guid projectId, Guid resourceId, string filename, User user, string metadataCompletness)
/// Log analytics
/// </summary>
/// <param name="operation">Operation</param>
/// <param name="resourceId">Resource of the id</param>
/// <param name="filename">Name of the file</param>
/// <param name="user">User object</param>
private void LogAnalytics(string operation, string resourceId, string filename, User user)
{
{
if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics))
var analyticsLogObject = new AnalyticsLogObject
{
{
_analyticsLogObject.Type = "Action";
Type = "Action",
_analyticsLogObject.Operation = operation;
Operation = "View MD",
_analyticsLogObject.FileId = resourceId + "/" + HttpUtility.UrlDecode(filename).Substring(1);
RoleId = _projectRoleModel.GetGetUserRoleForProject(projectId, user.Id).ToString(),
_analyticsLogObject.ResourceId = resourceId;
ProjectId = projectId.ToString(),
_analyticsLogObject.ProjectId = _projectResourceModel.GetProjectForResource(new Guid(resourceId)).ToString();
ResourceId = resourceId.ToString(),
_analyticsLogObject.RoleId = _projectRoleModel.GetGetUserRoleForProject(new Guid(_analyticsLogObject.ProjectId), user.Id).ToString();
FileId = resourceId.ToString() + "/" + HttpUtility.UrlDecode(filename)[1..],
_coscineLogger.AnalyticsLog(_analyticsLogObject);
ApplicationsProfile = _resourceModel.CreateReturnObjectFromDatabaseObject(_resourceModel.GetById(resourceId)).ApplicationProfile,
}
MetadataCompleteness = metadataCompletness,
 
};
 
 
_coscineLogger.AnalyticsLog(analyticsLogObject);
 
}
 
 
private void LogAnalyticsUploadMd(Guid projectId, Guid resourceId, string filename, User user, string metadataCompletness)
 
{
 
var analyticsLogObject = new AnalyticsLogObject
 
{
 
Type = "Action",
 
Operation = "Upload MD",
 
RoleId = _projectRoleModel.GetGetUserRoleForProject(projectId, user.Id).ToString(),
 
ProjectId = projectId.ToString(),
 
ResourceId = resourceId.ToString(),
 
FileId = resourceId.ToString() + "/" + HttpUtility.UrlDecode(filename)[1..],
 
ApplicationsProfile = _resourceModel.CreateReturnObjectFromDatabaseObject(_resourceModel.GetById(resourceId)).ApplicationProfile,
 
MetadataCompleteness = metadataCompletness,
 
};
 
 
_coscineLogger.AnalyticsLog(analyticsLogObject);
 
}
 
 
private void LogAnalyticsUpdateMd(Guid projectId, Guid resourceId, string filename, User user, string metadataCompletness)
 
{
 
var analyticsLogObject = new AnalyticsLogObject
 
{
 
Type = "Action",
 
Operation = "Update MD",
 
RoleId = _projectRoleModel.GetGetUserRoleForProject(projectId, user.Id).ToString(),
 
ProjectId = projectId.ToString(),
 
ResourceId = resourceId.ToString(),
 
FileId = resourceId.ToString() + "/" + HttpUtility.UrlDecode(filename)[1..],
 
ApplicationsProfile = _resourceModel.CreateReturnObjectFromDatabaseObject(_resourceModel.GetById(resourceId)).ApplicationProfile,
 
MetadataCompleteness = metadataCompletness,
 
};
 
 
_coscineLogger.AnalyticsLog(analyticsLogObject);
 
}
 
 
private string GetMetadataCompleteness(int metadataCount, Resource resource)
 
{
 
var shapesGraph = _rdfStoreConnector.GetGraph(resource.ApplicationProfile);
 
var nodeFactory = new NodeFactory();
 
var uriNode = (UriNode)nodeFactory.CreateUriNode(new Uri(_shaclPropertyUrl));
 
 
var total = shapesGraph.GetTriplesWithPredicate(uriNode).Count();
 
var present = metadataCount;
 
 
return $"{present}/{total}";
}
}
}
}
}
}
Loading