Skip to content
Snippets Groups Projects
Commit 9789caad authored by Marcel Nellesen's avatar Marcel Nellesen
Browse files

Merge branch 'Product/1188-LoggingExtended' into 'Sprint/2021-05'

Product/1188 logging extended

See merge request !27
parents 4a4e1908 6f6690cd
No related branches found
No related tags found
2 merge requests!27Product/1188 logging extended,!22Sprint/2021 05
...@@ -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());
...@@ -173,7 +178,11 @@ namespace Coscine.Api.Tree.Controllers ...@@ -173,7 +178,11 @@ namespace Coscine.Api.Tree.Controllers
)) ))
); );
LogAnalytics("View MD", resourceId, path, user); if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics) && path != "/")
{
LogAnalyticsViewMd(_projectResourceModel.GetProjectForResource(resource.Id).Value, resource.Id, path, user, GetMetadataCompleteness(metadataCount, resource));
}
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
{
Type = "Action",
Operation = "View 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 LogAnalyticsUploadMd(Guid projectId, Guid resourceId, string filename, User user, string metadataCompletness)
{
var analyticsLogObject = new AnalyticsLogObject
{ {
_analyticsLogObject.Type = "Action"; Type = "Action",
_analyticsLogObject.Operation = operation; Operation = "Upload 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 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}";
} }
} }
} }
...@@ -18,6 +18,8 @@ ...@@ -18,6 +18,8 @@
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<PackageReference Include="Coscine.ApiCommons" Version="2.*-*" /> <PackageReference Include="Coscine.ApiCommons" Version="2.*-*" />
<PackageReference Include="Coscine.Database" Version="2.*-*" />
<PackageReference Include="Coscine.Logging" Version="2.*-*" />
<PackageReference Include="Coscine.Metadata" Version="2.*-*" /> <PackageReference Include="Coscine.Metadata" Version="2.*-*" />
<PackageReference Include="Coscine.ResourceLoader" Version="2.*-*" /> <PackageReference Include="Coscine.ResourceLoader" Version="2.*-*" />
<PackageReference Include="Coscine.WaterbutlerHelper" Version="2.*-*" /> <PackageReference Include="Coscine.WaterbutlerHelper" Version="2.*-*" />
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment