diff --git a/src/Project/Controllers/ProjectRoleController.cs b/src/Project/Controllers/ProjectRoleController.cs index 702a94039f10a48140febe54d3aa51dff40e44fa..1143babb39f05619dda07e9e0a542e6e00368522 100644 --- a/src/Project/Controllers/ProjectRoleController.cs +++ b/src/Project/Controllers/ProjectRoleController.cs @@ -85,6 +85,8 @@ namespace Coscine.Api.Project.Controllers ProjectModel projectModel = new ProjectModel(); if (projectModel.OwnsProject(user, projectModel.GetById(projectId))) { + _projectRoleModel.CheckIfLastOwnerWillBeRemoved(roleId, projectId); + return _projectRoleModel.Delete(_projectRoleModel.GetWhere((projectRole) => projectRole.ProjectId == projectId && projectRole.UserId == userId diff --git a/src/Project/Models/ProjectRoleModel.cs b/src/Project/Models/ProjectRoleModel.cs index 34625f0ec102773515d75e6b58bf86a507929d5c..c3c5d16a01da083ab0c76d085b811f17fdf93ff9 100644 --- a/src/Project/Models/ProjectRoleModel.cs +++ b/src/Project/Models/ProjectRoleModel.cs @@ -1,4 +1,5 @@ using Coscine.Api.Project.ReturnObjects; +using Coscine.ApiCommons.Exceptions; using Coscine.ApiCommons.Models; using Coscine.Database.Model; using LinqToDB; @@ -18,11 +19,13 @@ namespace Coscine.Api.Project.Models public ProjectRole SetFromObject(ProjectRoleObject projectRoleObject) { // Remove existing roles if they exist - var existingRoles = GetAllWhere((dbProjectRole) => dbProjectRole.ProjectId == projectRoleObject.ProjectId && dbProjectRole.UserId == projectRoleObject.User.Id); - if(existingRoles.Count() > 0) + var existingRoles = GetAllWhere((dbProjectRole) => dbProjectRole.ProjectId == projectRoleObject.ProjectId && dbProjectRole.UserId == projectRoleObject.User.Id); + + if (existingRoles.Count() > 0) { foreach(var role in existingRoles) { + CheckIfLastOwnerWillBeRemoved(role.RoleId, projectRoleObject.ProjectId); Delete(role); } } @@ -36,6 +39,24 @@ namespace Coscine.Api.Project.Models return projectRole; } + public void CheckIfLastOwnerWillBeRemoved(Guid roleId, Guid projectId) + { + RoleModel roleModel = new RoleModel(); + var ownerRole = roleModel.GetOwnerRole(); + + if (roleId == ownerRole.Id) + { + var moreThanOneOwnerExists = GetAllWhere((projectRole) => + projectRole.ProjectId == projectId + && projectRole.RoleId == ownerRole.Id + ).Count() > 1; + if (!moreThanOneOwnerExists) + { + throw new NotAuthorizedException("The last owner cannot be removed!"); + } + } + } + public override Expression<Func<ProjectRole, Guid>> GetIdFromObject() { return databaseObject => databaseObject.RelationId;