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

Merge branch 'Sprint/2021-05' into 'master'

Sprint/2021 05

See merge request !132
parents b6931905 b5165e6e
No related branches found
No related tags found
1 merge request!132Sprint/2021 05
{
"version": 1,
"isRoot": true,
"tools": {
"gitversion.tool": {
"version": "5.6.6",
"commands": [
"dotnet-gitversion"
]
},
"dotnet-version-cli": {
"version": "2.1.1",
"commands": [
"dotnet-version"
]
}
}
}
\ No newline at end of file
......@@ -271,3 +271,6 @@ dist/
#linq2db
src/.tools/
# Dotnet Tool Manifest
.config/*
......@@ -38,7 +38,7 @@ namespace Coscine.Api.Project.Controllers
private readonly ResourceTypeModel _resourceTypeModel;
private readonly ResourceModel _resourceModel;
private readonly CoscineLogger _coscineLogger;
private readonly AnalyticsLogObject _analyticsLogObject;
private readonly VisibilityModel _visibilityModel;
private readonly int _maxAvailable = 100;
/// <summary>
......@@ -57,7 +57,7 @@ namespace Coscine.Api.Project.Controllers
_resourceModel = new ResourceModel();
_projectQuotaModel = new ProjectQuotaModel();
_coscineLogger = new CoscineLogger(logger);
_analyticsLogObject = new AnalyticsLogObject();
_visibilityModel = new VisibilityModel();
}
/// <summary>
......@@ -72,11 +72,6 @@ namespace Coscine.Api.Project.Controllers
.Select((project) => _projectModel.CreateReturnObjectFromDatabaseObject(project))
.OrderBy(element => element.DisplayName);
if (Request.Query != null && Request.Query["noanalyticslog"] != "true")
{
LogAnalytics("List Projects", result);
}
return Ok(result);
}
......@@ -88,16 +83,16 @@ namespace Coscine.Api.Project.Controllers
public ActionResult<IEnumerable<ProjectObject>> GetTopLevelProjects()
{
var user = _authenticator.GetUser();
var result = _projectModel.GetTopLevelWithAccess(user, UserRoles.Member, UserRoles.Owner).ToList()
var projects = _projectModel.GetTopLevelWithAccess(user, UserRoles.Member, UserRoles.Owner).ToList()
.Select((project) => _projectModel.CreateReturnObjectFromDatabaseObject(project))
.OrderBy(element => element.DisplayName);
if (Request.Query != null && Request.Query["noanalyticslog"] != "true")
{
LogAnalytics("View Home", result);
LogAnalyticsViewHome(projects.Select(x => x.Id.ToString()).ToList());
}
return Ok(result);
return Ok(projects);
}
/// <summary>
......@@ -153,7 +148,8 @@ namespace Coscine.Api.Project.Controllers
}).OrderBy(element => element.DisplayName);
if (Request.Query != null && Request.Query["noanalyticslog"] != "true")
{
LogAnalytics("View Project", null, resources, id, user); // intentionally log as view project to help identify the related user action
var projectObject = _projectModel.CreateReturnObjectFromDatabaseObject(_projectModel.GetById(project.Id));
LogAnalyticsViewProject(project, resources.ToList(), projectObject.Disciplines, projectObject.Organizations, user);
}
return Json(resources);
}
......@@ -190,14 +186,12 @@ namespace Coscine.Api.Project.Controllers
return Unauthorized("The user is not authorized to perform a get on the selected project!");
}
var projectQuotas =
_projectQuotaModel.GetAllWhere((projectQuota) =>
projectQuota.ProjectId == projectGuid
&& projectQuota.ResourceType.Enabled == true);
var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled.HasValue && x.Enabled.Value);
return Json(resourceTypes.Select(x =>
return Json(resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, projectGuid)));
}
private ProjectQuotaReturnObject CreateProjectQuotaReturnObject(ResourceType x, Guid projectGuid)
{
var projectQuota = _projectQuotaModel.GetWhere((y) =>
y.ProjectId == projectGuid &&
......@@ -209,7 +203,6 @@ namespace Coscine.Api.Project.Controllers
Used = CalculateUsed(x, projectGuid),
Allocated = projectQuota == null ? 0 : projectQuota.Quota
};
}));
}
private int CalculateUsed(ResourceType resourceType, Guid projectId)
......@@ -276,7 +269,8 @@ namespace Coscine.Api.Project.Controllers
Id = resourceTypeGuid,
Name = resourceType.DisplayName,
Used = CalculateUsed(resourceType, projectGuid),
Allocated = projectQuota.Quota};
Allocated = projectQuota.Quota
};
return Json(projectQuotaReturnObject);
}
......@@ -402,7 +396,7 @@ namespace Coscine.Api.Project.Controllers
var project = _projectModel.GetById(Guid.Parse(id));
if (_projectModel.HasAccess(user, project, UserRoles.Owner))
{
LogAnalytics("Edit Project", null, null, id, user);
LogAnalyticsEditProject(project, _projectModel.GetMetadataCompleteness(projectObject), projectObject.Disciplines, projectObject.Organizations, user);
return Ok(_projectModel.UpdateByObject(project, projectObject));
}
else
......@@ -423,7 +417,8 @@ namespace Coscine.Api.Project.Controllers
var project = _projectModel.GetById(Guid.Parse(id));
if (_projectModel.HasAccess(user, project, UserRoles.Owner))
{
LogAnalytics("Delete Project", null, null, id, user);
var projectObject = _projectModel.CreateReturnObjectFromDatabaseObject(_projectModel.GetById(project.Id));
LogAnalyticsDeleteProject(project, projectObject.Disciplines, projectObject.Organizations, user);
DeleteProject(project);
return Json(_projectModel.CreateReturnObjectFromDatabaseObject(project));
}
......@@ -557,7 +552,7 @@ namespace Coscine.Api.Project.Controllers
ProjectOwner = user
});
LogAnalytics("Add Project", null, null, project.Id.ToString(), user);
LogAnalyticsAddProject(project, _projectModel.GetMetadataCompleteness(projectObject), projectObject.Disciplines, projectObject.Organizations, user);
return Json(_projectModel.CreateReturnObjectFromDatabaseObject(project));
}
......@@ -570,7 +565,7 @@ namespace Coscine.Api.Project.Controllers
private bool IsRWTHMember(User user)
{
var externalIds = new ExternalIdModel().GetAllWhere((externalId) => externalId.UserId == user.Id);
if(externalIds.Count() == 0)
if (!externalIds.Any())
{
return false;
}
......@@ -580,57 +575,101 @@ namespace Coscine.Api.Project.Controllers
{
externalIdList.Add(externalId.ExternalId1);
}
return new RdfStoreConnector(Program.Configuration.GetStringAndWait("coscine/local/virtuoso/additional/url")).GetTriples(new Uri("https://ror.org/04xfq0f34"), null, null, 1, externalIdList).Count() != 0;
return new RdfStoreConnector(Program.Configuration.GetStringAndWait("coscine/local/virtuoso/additional/url")).GetTriples(new Uri("https://ror.org/04xfq0f34"), null, null, 1, externalIdList).Any();
}
/// <summary>
/// LogAnalytics
/// </summary>
/// <param name="operation">Operation</param>
/// <param name="projects">Projects</param>
/// <param name="resources">Resources</param>
/// <param name="projectId">Id of the project</param>
/// <param name="user">User object</param>
private void LogAnalytics(string operation,
IEnumerable<ProjectObject> projects = null,
IEnumerable<ResourceObject> resources = null,
string projectId = null,
User user = null
)
private void LogAnalyticsViewHome(List<string> projectIds)
{
if (CoscineLoggerConfiguration.IsLogLevelActivated(LogType.Analytics))
_coscineLogger.AnalyticsLog(
new AnalyticsLogObject
{
_analyticsLogObject.Type = "Action";
_analyticsLogObject.Operation = operation;
Type = "Action",
Operation = "View Home",
ProjectList = projectIds
});
}
if (projects != null)
private void LogAnalyticsViewProject(Database.DataModel.Project project, List<ResourceObject> resources, IEnumerable<DisciplineObject> disciplines, IEnumerable<OrganizationObject> organizations, User user)
{
List<string> projectList = new List<string>();
foreach (var entry in projects)
var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled.HasValue && x.Enabled.Value);
var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id));
_coscineLogger.AnalyticsLog(
new AnalyticsLogObject
{
projectList.Add(entry.Id.ToString());
}
_analyticsLogObject.ProjectList = projectList;
Type = "Action",
Operation = "View Project",
RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(),
ProjectId = project.Id.ToString(),
QuotaSize = objects.Select(x => $"{x.Name}: {x.Used}/{x.Allocated}").ToList(),
Disciplines = disciplines.Select(x => x.DisplayNameEn).ToList(),
Organizations = organizations.Select(x => x.DisplayName).ToList(),
Visibility = project.VisibilityId.HasValue ? _visibilityModel.GetById(project.VisibilityId.Value)?.DisplayName : null,
ResourceList = resources.Select(x => x.Id.ToString()).ToList(),
});
}
if (resources != null)
private void LogAnalyticsEditProject(Database.DataModel.Project project, string metadataCompletness, IEnumerable<DisciplineObject> disciplines, IEnumerable<OrganizationObject> organizations, User user)
{
List<string> shownResources = new List<string>();
foreach (var entry in resources)
var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled.HasValue && x.Enabled.Value);
var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id));
_coscineLogger.AnalyticsLog(
new AnalyticsLogObject
{
shownResources.Add(entry.Id.ToString());
}
_analyticsLogObject.ResourceList = shownResources;
Type = "Action",
Operation = "Edit Project",
RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(),
ProjectId = project.Id.ToString(),
QuotaSize = objects.Select(x => $"{x.Name}: {x.Used}/{x.Allocated}").ToList(),
MetadataCompleteness = metadataCompletness,
Disciplines = disciplines.Select(x => x.DisplayNameEn).ToList(),
Organizations = organizations.Select(x => x.DisplayName).ToList(),
Visibility = project.VisibilityId.HasValue ? _visibilityModel.GetById(project.VisibilityId.Value)?.DisplayName : null,
});
}
if (projectId != null)
private void LogAnalyticsAddProject(Database.DataModel.Project project, string metadataCompletness, IEnumerable<DisciplineObject> disciplines, IEnumerable<OrganizationObject> organizations, User user)
{
_analyticsLogObject.ProjectId = projectId;
if (user != null)
var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled.HasValue && x.Enabled.Value);
var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id));
_coscineLogger.AnalyticsLog(
new AnalyticsLogObject
{
_analyticsLogObject.RoleId = _projectRoleModel.GetGetUserRoleForProject(new Guid(_analyticsLogObject.ProjectId), user.Id).ToString();
}
}
_coscineLogger.AnalyticsLog(_analyticsLogObject);
Type = "Action",
Operation = "Add Project",
RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(),
ProjectId = project.Id.ToString(),
QuotaSize = objects.Select(x => $"{x.Name}: {x.Used}/{x.Allocated}").ToList(),
MetadataCompleteness = metadataCompletness,
Disciplines = disciplines.Select(x => x.DisplayNameEn).ToList(),
Organizations = organizations.Select(x => x.DisplayName).ToList(),
Visibility = project.VisibilityId.HasValue ? _visibilityModel.GetById(project.VisibilityId.Value)?.DisplayName : null,
});
}
private void LogAnalyticsDeleteProject(Database.DataModel.Project project, IEnumerable<DisciplineObject> disciplines, IEnumerable<OrganizationObject> organizations, User user)
{
var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled.HasValue && x.Enabled.Value);
var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id));
_coscineLogger.AnalyticsLog(
new AnalyticsLogObject
{
Type = "Action",
Operation = "Delete Project",
RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(),
ProjectId = project.Id.ToString(),
QuotaSize = objects.Select(x => $"{x.Name}: {x.Used}/{x.Allocated}").ToList(),
Disciplines = disciplines.Select(x => x.DisplayNameEn).ToList(),
Organizations = organizations.Select(x => x.DisplayName).ToList(),
Visibility = project.VisibilityId.HasValue ? _visibilityModel.GetById(project.VisibilityId.Value)?.DisplayName : null,
});
}
}
}
......@@ -3,6 +3,7 @@
<OutputType>Exe</OutputType>
<RootNamespace>Coscine.Api.Project</RootNamespace>
<AssemblyName>Coscine.Api.Project</AssemblyName>
<GenerateDocumentationFile>true</GenerateDocumentationFile>
<TargetFramework>net5.0</TargetFramework>
<Version>2.0.2</Version>
</PropertyGroup>
......@@ -18,6 +19,8 @@
<ItemGroup>
<PackageReference Include="Coscine.Action" 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.ResourceLoader" Version="2.*-*" />
</ItemGroup>
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment