Skip to content
Snippets Groups Projects

Release: Sprint/2022 05 :robot:

Merged Petar Hristov requested to merge dev into master
3 files
+ 158
70
Compare changes
  • Side-by-side
  • Inline
Files
3
@@ -114,6 +114,34 @@ namespace Coscine.Api.Project.Controllers
@@ -114,6 +114,34 @@ namespace Coscine.Api.Project.Controllers
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
var project = _projectModel.GetById(Guid.Parse(id));
var project = _projectModel.GetById(Guid.Parse(id));
if (_projectModel.HasAccess(user, project, UserRoles.Member, UserRoles.Owner))
if (_projectModel.HasAccess(user, project, UserRoles.Member, UserRoles.Owner))
 
{
 
var subProjectModel = new SubProjectModel();
 
var subProjectRel = subProjectModel.GetAllWhere((subProject) => subProject.SubProjectId == project.Id && !project.Deleted);
 
 
var parentProjectRelation = subProjectRel.FirstOrDefault();
 
if (parentProjectRelation != null && _projectModel.HasAccess(user, parentProjectRelation.ProjectId, UserRoles.Member, UserRoles.Owner))
 
{
 
return Ok(_projectModel.CreateReturnObjectFromDatabaseObject(project, parentProjectRelation.ProjectId));
 
}
 
return Ok(_projectModel.CreateReturnObjectFromDatabaseObject(project));
 
}
 
else
 
{
 
return Unauthorized($"User has no access to a project with id: {id}");
 
}
 
}
 
 
/// <summary>
 
/// This returns the project if the user has access to it
 
/// </summary>
 
/// <param name="slug">Slug of the project</param>
 
/// <returns>OK or status code 401</returns>
 
[HttpGet("[controller]/slug/{slug}")]
 
public ActionResult<ProjectObject> GetBySlug(string slug)
 
{
 
var user = _authenticator.GetUser();
 
var project = _projectModel.GetBySlug(slug);
 
if (_projectModel.HasAccess(user, project, UserRoles.Member, UserRoles.Owner))
{
{
SubProjectModel subProjectModel = new SubProjectModel();
SubProjectModel subProjectModel = new SubProjectModel();
var subProjectRel = subProjectModel.GetAllWhere((subProject) => subProject.SubProjectId == project.Id && !project.Deleted);
var subProjectRel = subProjectModel.GetAllWhere((subProject) => subProject.SubProjectId == project.Id && !project.Deleted);
@@ -127,14 +155,14 @@ namespace Coscine.Api.Project.Controllers
@@ -127,14 +155,14 @@ namespace Coscine.Api.Project.Controllers
}
}
else
else
{
{
return Unauthorized($"User is not allowed to see given the project {id}");
return Unauthorized($"User has no access to a project with slug: {slug}");
}
}
}
}
/// <summary>
/// <summary>
/// Gets the resources
/// Gets the resources
/// </summary>
/// </summary>
/// <param name="id">Id of the resource</param>
/// <param name="id">Id of the project</param>
/// <returns>JSON object or status code 401</returns>
/// <returns>JSON object or status code 401</returns>
[HttpGet("[controller]/{id}/resources")]
[HttpGet("[controller]/{id}/resources")]
public ActionResult<IEnumerable<ResourceObject>> GetResources(string id)
public ActionResult<IEnumerable<ResourceObject>> GetResources(string id)
@@ -160,30 +188,30 @@ namespace Coscine.Api.Project.Controllers
@@ -160,30 +188,30 @@ namespace Coscine.Api.Project.Controllers
}
}
else
else
{
{
return Unauthorized($"User is not allowed to see given the project {id}");
return Unauthorized($"User has no access to a project with id: {id}");
}
}
}
}
/// <summary>
/// <summary>
/// Retrieves the quota for the selected project.
/// Retrieves the quota for the selected project.
/// </summary>
/// </summary>
/// <param name="projectId">Id of the project.</param>
/// <param name="id">Id of the project</param>
/// <returns>List of project quotas</returns>
/// <returns>List of project quotas</returns>
[HttpGet("[controller]/{projectId}/quota/-/all")]
[HttpGet("[controller]/{id}/quota/-/all")]
public ActionResult<IEnumerable<ProjectQuota>> Quotas(string projectId)
public ActionResult<IEnumerable<ProjectQuotaReturnObject>> Quotas(string id)
{
{
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
if (!Guid.TryParse(projectId, out Guid projectGuid))
if (!Guid.TryParse(id, out Guid projectGuid))
{
{
return BadRequest($"{projectId} is not a GUID.");
return BadRequest($"{id} is not a GUID.");
}
}
var project = _projectModel.GetById(projectGuid);
var project = _projectModel.GetById(projectGuid);
if (project == null)
if (project == null)
{
{
return NotFound($"Could not find project with id: {projectId}");
return NotFound($"Could not find project with id: {id}");
}
}
if (!_projectModel.HasAccess(user, project, UserRoles.Member, UserRoles.Owner))
if (!_projectModel.HasAccess(user, project, UserRoles.Member, UserRoles.Owner))
@@ -234,24 +262,24 @@ namespace Coscine.Api.Project.Controllers
@@ -234,24 +262,24 @@ namespace Coscine.Api.Project.Controllers
/// <summary>
/// <summary>
/// Retrieves the quota for the selected project and resource Type.
/// Retrieves the quota for the selected project and resource Type.
/// </summary>
/// </summary>
/// <param name="projectId">Id of the project</param>
/// <param name="id">Id of the project</param>
/// <param name="resourceTypeId">Id of the resource type</param>
/// <param name="resourceTypeId">Id of the resource type</param>
/// <returns>The project quota for the resource type.</returns>
/// <returns>The project quota for the resource type.</returns>
[HttpGet("[controller]/{projectId}/quota/{resourceTypeId}")]
[HttpGet("[controller]/{id}/quota/{resourceTypeId}")]
public ActionResult<ProjectQuotaReturnObject> Quota(string projectId, string resourceTypeId)
public ActionResult<ProjectQuotaReturnObject> Quota(string id, string resourceTypeId)
{
{
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
if (!Guid.TryParse(projectId, out Guid projectGuid))
if (!Guid.TryParse(id, out Guid projectGuid))
{
{
return BadRequest($"{projectId} is not a GUID.");
return BadRequest($"{id} is not a GUID.");
}
}
var project = _projectModel.GetById(projectGuid);
var project = _projectModel.GetById(projectGuid);
if (project == null)
if (project == null)
{
{
return NotFound($"Could not find project with id: {projectId}");
return NotFound($"Could not find project with id: {id}");
}
}
if (!_projectModel.HasAccess(user, project, UserRoles.Owner))
if (!_projectModel.HasAccess(user, project, UserRoles.Owner))
@@ -291,24 +319,24 @@ namespace Coscine.Api.Project.Controllers
@@ -291,24 +319,24 @@ namespace Coscine.Api.Project.Controllers
/// <summary>
/// <summary>
/// Get the max quota for a resource type.
/// Get the max quota for a resource type.
/// </summary>
/// </summary>
/// <param name="projectId">Id of the project.</param>
/// <param name="id">Id of the project.</param>
/// <param name="resourceTypeId">Id of the resource</param>
/// <param name="resourceTypeId">Id of the resource</param>
/// <returns>The maximum value for the quota.</returns>
/// <returns>The maximum value for the quota.</returns>
[HttpGet("[controller]/{projectId}/quota/{resourceTypeId}/max")]
[HttpGet("[controller]/{id}/quota/{resourceTypeId}/max")]
public ActionResult<MaxProjectQuota> GetQuotaMax(string projectId, string resourceTypeId)
public ActionResult<MaxProjectQuota> GetQuotaMax(string id, string resourceTypeId)
{
{
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
if (!Guid.TryParse(projectId, out Guid projectGuid))
if (!Guid.TryParse(id, out Guid projectGuid))
{
{
return BadRequest($"{projectId} is not a GUID.");
return BadRequest($"{id} is not a GUID.");
}
}
var project = _projectModel.GetById(projectGuid);
var project = _projectModel.GetById(projectGuid);
if (project == null)
if (project == null)
{
{
return NotFound($"Could not find project with id: {projectId}");
return NotFound($"Could not find project with id: {id}");
}
}
if (!_projectModel.HasAccess(user, project, UserRoles.Owner))
if (!_projectModel.HasAccess(user, project, UserRoles.Owner))
@@ -334,25 +362,25 @@ namespace Coscine.Api.Project.Controllers
@@ -334,25 +362,25 @@ namespace Coscine.Api.Project.Controllers
/// <summary>
/// <summary>
/// Update the project quota.
/// Update the project quota.
/// </summary>
/// </summary>
/// <param name="projectId">Id of the project.</param>
/// <param name="id">Id of the project.</param>
/// <param name="resourceTypeId">Id of the resource.</param>
/// <param name="resourceTypeId">Id of the resource.</param>
/// <param name="updateProjectQuotaObject">Object containing the update values.</param>
/// <param name="updateProjectQuotaObject">Object containing the update values.</param>
/// <returns>NoContent (204).</returns>
/// <returns>NoContent (204).</returns>
[HttpPost("[controller]/{projectId}/quota/{resourceTypeId}")]
[HttpPost("[controller]/{id}/quota/{resourceTypeId}")]
public IActionResult UpdateQuota(string projectId, string resourceTypeId, [FromBody] UpdateProjectQuotaObject updateProjectQuotaObject)
public IActionResult UpdateQuota(string id, string resourceTypeId, [FromBody] UpdateProjectQuotaObject updateProjectQuotaObject)
{
{
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
if (!Guid.TryParse(projectId, out Guid projectGuid))
if (!Guid.TryParse(id, out Guid projectGuid))
{
{
return BadRequest($"{projectId} is not a GUID.");
return BadRequest($"{id} is not a GUID.");
}
}
var project = _projectModel.GetById(projectGuid);
var project = _projectModel.GetById(projectGuid);
if (project == null)
if (project == null)
{
{
return NotFound($"Could not find project with id: {projectId}");
return NotFound($"Could not find project with id: {id}");
}
}
if (!_projectModel.HasAccess(user, project, UserRoles.Owner))
if (!_projectModel.HasAccess(user, project, UserRoles.Owner))
@@ -422,20 +450,26 @@ namespace Coscine.Api.Project.Controllers
@@ -422,20 +450,26 @@ namespace Coscine.Api.Project.Controllers
projectQuotaForCurrent.Quota = updateProjectQuotaObject.Allocated;
projectQuotaForCurrent.Quota = updateProjectQuotaObject.Allocated;
_projectQuotaModel.Update(projectQuotaForCurrent);
_projectQuotaModel.Update(projectQuotaForCurrent);
}
}
 
 
if (Request.Query != null && Request.Query["noanalyticslog"] != "true")
 
{
 
LogAnalyticsOwnerProjectQuotaChange(project, user);
 
}
 
return NoContent();
return NoContent();
}
}
/// <summary>
/// <summary>
/// Updates the selected project
/// Updates the selected project
/// </summary>
/// </summary>
/// <param name="id">Id of the resource</param>
/// <param name="id">Id of the project</param>
 
/// <param name="projectObject">A Project Object</param>
/// <returns>OK or status code 401</returns>
/// <returns>OK or status code 401</returns>
[HttpPost("[controller]/{id}")]
[HttpPost("[controller]/{id}")]
public IActionResult Update(string id)
public IActionResult Update(Guid id, [FromBody] ProjectObject projectObject)
{
{
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
var projectObject = ObjectFactory<ProjectObject>.DeserializeFromStream(Request.Body);
var project = _projectModel.GetById(id);
var project = _projectModel.GetById(Guid.Parse(id));
if (_projectModel.HasAccess(user, project, UserRoles.Owner))
if (_projectModel.HasAccess(user, project, UserRoles.Owner))
{
{
LogAnalyticsEditProject(project, _projectModel.GetMetadataCompleteness(projectObject), projectObject.Disciplines, projectObject.Organizations, user);
LogAnalyticsEditProject(project, _projectModel.GetMetadataCompleteness(projectObject), projectObject.Disciplines, projectObject.Organizations, user);
@@ -450,7 +484,7 @@ namespace Coscine.Api.Project.Controllers
@@ -450,7 +484,7 @@ namespace Coscine.Api.Project.Controllers
/// <summary>
/// <summary>
/// Deletes the selected project
/// Deletes the selected project
/// </summary>
/// </summary>
/// <param name="id">Id of the resource</param>
/// <param name="id">Id of the project</param>
/// <returns>JSON object or status code 401</returns>
/// <returns>JSON object or status code 401</returns>
[HttpDelete("[controller]/{id}")]
[HttpDelete("[controller]/{id}")]
public IActionResult Delete(string id)
public IActionResult Delete(string id)
@@ -569,14 +603,14 @@ namespace Coscine.Api.Project.Controllers
@@ -569,14 +603,14 @@ namespace Coscine.Api.Project.Controllers
/// <summary>
/// <summary>
/// Creates a project
/// Creates a project
/// </summary>
/// </summary>
 
/// <param name="projectObject">A Project Object</param>
/// <returns>JSON object or status code 401</returns>
/// <returns>JSON object or status code 401</returns>
[HttpPost("[controller]")]
[HttpPost("[controller]")]
public IActionResult Store()
public IActionResult Store([FromBody] ProjectObject projectObject)
{
{
var user = _authenticator.GetUser();
var user = _authenticator.GetUser();
var projectObject = ObjectFactory<ProjectObject>.DeserializeFromStream(Request.Body);
if (projectObject?.ParentId != new Guid()
if (projectObject.ParentId != new Guid()
&& !_projectModel.HasAccess(user, _projectModel.GetById(projectObject.ParentId), UserRoles.Member, UserRoles.Owner))
&& !_projectModel.HasAccess(user, _projectModel.GetById(projectObject.ParentId), UserRoles.Member, UserRoles.Owner))
{
{
return Unauthorized("User is not allowed to create SubProjects.");
return Unauthorized("User is not allowed to create SubProjects.");
@@ -652,6 +686,33 @@ namespace Coscine.Api.Project.Controllers
@@ -652,6 +686,33 @@ namespace Coscine.Api.Project.Controllers
return new ActionResult<IEnumerable<InvitationReturnObject>>(invitations);
return new ActionResult<IEnumerable<InvitationReturnObject>>(invitations);
}
}
 
/// <summary>
 
/// Call to analytics logger.
 
/// </summary>
 
/// <param name="projectId">Project id of the project</param>
 
/// <returns>204 no content</returns>
 
[HttpGet("[controller]/{projectId}/-/create-profile")]
 
public IActionResult CreateApplicationProfile(Guid projectId)
 
{
 
var project = _projectModel.GetById(projectId);
 
 
if (project == null)
 
{
 
return NotFound($@"The project ""{projectId}"" was not found.");
 
}
 
 
var user = _authenticator.GetUser();
 
 
if (!_projectModel.HasAccess(user, project, UserRoles.Owner))
 
{
 
return Unauthorized("You are not an owner of the project.");
 
}
 
 
LogAnalyticsCreateApplicationProfile(project, user);
 
 
return NoContent();
 
}
 
/// <summary>
/// <summary>
/// Create and send an invitation to specified mail.
/// Create and send an invitation to specified mail.
/// </summary>
/// </summary>
@@ -724,6 +785,8 @@ namespace Coscine.Api.Project.Controllers
@@ -724,6 +785,8 @@ namespace Coscine.Api.Project.Controllers
return NoContent();
return NoContent();
}
}
 
 
/// <summary>
/// <summary>
/// Deletes an invitation.
/// Deletes an invitation.
/// </summary>
/// </summary>
@@ -914,5 +977,50 @@ namespace Coscine.Api.Project.Controllers
@@ -914,5 +977,50 @@ namespace Coscine.Api.Project.Controllers
Visibility = project.VisibilityId.HasValue ? _visibilityModel.GetById(project.VisibilityId.Value)?.DisplayName : null,
Visibility = project.VisibilityId.HasValue ? _visibilityModel.GetById(project.VisibilityId.Value)?.DisplayName : null,
});
});
}
}
 
 
private void LogAnalyticsOwnerProjectQuotaChange(Database.DataModel.Project project, User user)
 
{
 
var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled == true);
 
 
var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id));
 
 
_coscineLogger.AnalyticsLog(
 
new AnalyticsLogObject
 
{
 
Type = "Action",
 
Operation = "Owner Project Quota Change",
 
RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(),
 
ProjectId = project.Id.ToString(),
 
QuotaSize = objects.Select(x => $"{x.Name}: {x.Used}/{x.Allocated}").ToList()
 
});
 
}
 
 
private void LogAnalyticsInviteExternalUser(Database.DataModel.Project project, User user)
 
{
 
var resourceTypes = _resourceTypeModel.GetAllWhere(x => x.Enabled == true);
 
 
var objects = resourceTypes.Select(x => CreateProjectQuotaReturnObject(x, project.Id));
 
 
_coscineLogger.AnalyticsLog(
 
new AnalyticsLogObject
 
{
 
Type = "Action",
 
Operation = "Invite External User",
 
RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(),
 
ProjectId = project.Id.ToString()
 
});
 
}
 
 
private void LogAnalyticsCreateApplicationProfile(Database.DataModel.Project project, User user)
 
{
 
_coscineLogger.AnalyticsLog(
 
new AnalyticsLogObject
 
{
 
Type = "Action",
 
Operation = "Create Application Profile",
 
RoleId = _projectRoleModel.GetGetUserRoleForProject(project.Id, user.Id).ToString(),
 
ProjectId = project.Id.ToString()
 
});
 
}
}
}
}
}
 
\ No newline at end of file
Loading