diff --git a/src/Resources/Controllers/ResourceController.cs b/src/Resources/Controllers/ResourceController.cs index ab8ab7e849f2562fe0f16be8482b445510a33242..f8d5a2e7a66a3a850c258c6e3ce2c70833b4ae43 100644 --- a/src/Resources/Controllers/ResourceController.cs +++ b/src/Resources/Controllers/ResourceController.cs @@ -303,18 +303,13 @@ namespace Coscine.Api.Resources.Controllers if (projectModel.HasAccess(user, project, UserRoles.Owner, UserRoles.Member)) { var orgs = Util.OrganizationsHelper.GetOrganization(user); - + if (orgs?.Any() != true) { orgs = new List<string> { "*" }; } - if (!resourceType.Enabled.HasValue - || !resourceType.Enabled.Value - || !orgs.SelectMany(x => ResourceTypeFactory - .Instance - .GetSpecificResourceTypes(x, ResourceTypes.Base.ResourceTypeStatus.Active)) - .Any(x => x.SpecificTypeName == resourceType.SpecificType)) + if (!Util.ResourceTypeHelper.IsResourceTypeUsable(resourceType, projectId, orgs)) { return Unauthorized("The user is not authorized to add a new resource of this type to the selected project!"); } @@ -546,7 +541,7 @@ namespace Coscine.Api.Resources.Controllers { return (int)resourceTypeDefinition.GetResourceQuotaAvailable(resource.Id.ToString()).Result; } - catch(Exception) + catch (Exception) { // Error communicating with the resource } diff --git a/src/Resources/Controllers/ResourceTypeController.cs b/src/Resources/Controllers/ResourceTypeController.cs index de1e520352f063beb022b95801ad9bebc6e00482..aebc7b80060f26cdaba28eb25f52bcff4a2fc7ce 100644 --- a/src/Resources/Controllers/ResourceTypeController.cs +++ b/src/Resources/Controllers/ResourceTypeController.cs @@ -50,48 +50,18 @@ namespace Coscine.Api.Resources.Controllers /// <summary> /// Returns all enabled resource types according to user's affiliation and allocated quota in the project. /// </summary> - /// <param name="id">Id of the project</param> + /// <param name="projectId">Id of the project</param> /// <returns>List of ResourceTypeInformations for the enabled Resources</returns> - [Route("[controller]/types/{id}/-/enabled")] - public async Task<ActionResult<IEnumerable<ResourceTypeInformation>>> GetEnabledResourceTypes(Guid id) + [Route("[controller]/types/{projectId}/-/enabled")] + public async Task<ActionResult<IEnumerable<ResourceTypeInformation>>> GetEnabledResourceTypes(Guid projectId) { var user = _authenticator.GetUser(); var orgs = Util.OrganizationsHelper.GetOrganization(user).ToList(); - if (orgs?.Any() != true) - { - orgs = new List<string> { "*" }; - } - - var listOfAffiliatedResources = orgs.SelectMany(x => ResourceTypeFactory - .Instance - .GetSpecificResourceTypes(x, ResourceTypes.Base.ResourceTypeStatus.Active) - .Select(x => x.SpecificTypeName)); - - var listOfEnabledResources = listOfAffiliatedResources; - - var listOfAllActiveResources = ResourceTypeFactory.Instance.GetSpecificResourceTypes(ResourceTypes.Base.ResourceTypeStatus.Active).Select(x => x.SpecificTypeName); - - foreach (var resourceType in listOfAllActiveResources) - { - // check if the resource type is not in the list of affiliated ressource types and if so, if the project has reserved maxQuota for this resource type - if (!listOfAffiliatedResources.Contains(resourceType)) - { - var resourceId = _resourceTypeModel.GetAllWhere(x => x.SpecificType == resourceType).FirstOrDefault().Id; - var quotas = _projectQuotaModel.GetAllWhere(x => x.ProjectId == id && x.ResourceTypeId == resourceId); - if (quotas.FirstOrDefault().MaxQuota > 0) - { - listOfEnabledResources = listOfEnabledResources.Append(resourceType).ToList(); - } - } - } - - var allEnabledResourceTypes = _resourceTypeModel.GetAllWhere((resourceType) => listOfEnabledResources.Contains(resourceType.SpecificType)); - return Json(await CreateListOfResourceTypeInformation(allEnabledResourceTypes)); + return Json(await CreateListOfResourceTypeInformation(Util.ResourceTypeHelper.GetAvailableResourceTypesForProject(projectId, orgs))); } - /// <summary> /// Returns all enabled resource types. /// </summary> @@ -117,7 +87,6 @@ namespace Coscine.Api.Resources.Controllers return Json(await CreateListOfResourceTypeInformation(allEnabledResourceTypes)); } - /// <summary> /// Returns all fields of the specified resource type. /// </summary> diff --git a/src/Resources/Util/ResourceTypeHelper.cs b/src/Resources/Util/ResourceTypeHelper.cs new file mode 100644 index 0000000000000000000000000000000000000000..88761d922a180f66cf694c6c20fe3f85c386bd4b --- /dev/null +++ b/src/Resources/Util/ResourceTypeHelper.cs @@ -0,0 +1,56 @@ +using Coscine.Database.DataModel; +using Coscine.Database.Models; +using Coscine.ResourceTypes; +using System; +using System.Collections.Generic; +using System.Linq; + +namespace Coscine.Api.Resources.Util +{ + internal static class ResourceTypeHelper + { + private static readonly ResourceTypeModel _resourceTypeModel = new(); + private static readonly ProjectQuotaModel _projectQuotaModel = new(); + + internal static IEnumerable<ResourceType> GetAvailableResourceTypesForProject(Guid projectId, IEnumerable<string> affiliatedOrganizaions) + { + if (affiliatedOrganizaions?.Any() != true) + { + affiliatedOrganizaions = new List<string> { "*" }; + } + + var listOfAffiliatedResources = affiliatedOrganizaions.SelectMany(x => ResourceTypeFactory + .Instance + .GetSpecificResourceTypes(x, ResourceTypes.Base.ResourceTypeStatus.Active) + .Select(x => x.SpecificTypeName)); + + var listOfEnabledResources = listOfAffiliatedResources; + + foreach (var resourceType in ResourceTypeFactory + .Instance + .GetSpecificResourceTypes(ResourceTypes.Base.ResourceTypeStatus.Active) + .Select(x => x.SpecificTypeName)) + { + // check if the resource type is not in the list of affiliated resource types and if so, if the project has reserved maxQuota for this resource type + if (!listOfAffiliatedResources.Contains(resourceType)) + { + var resourceId = _resourceTypeModel.GetAllWhere(x => x.SpecificType == resourceType).FirstOrDefault().Id; + var quotas = _projectQuotaModel.GetAllWhere(x => x.ProjectId == projectId && x.ResourceTypeId == resourceId); + if (quotas.Any() && quotas.First().MaxQuota > 0) + { + listOfEnabledResources = listOfEnabledResources.Append(resourceType).ToList(); + } + } + } + + return _resourceTypeModel.GetAllWhere((resourceType) => listOfEnabledResources.Contains(resourceType.SpecificType)); + } + + internal static bool IsResourceTypeUsable(ResourceType resourceType, Guid projectId, IEnumerable<string> affiliatedOrganizations) + { + return resourceType.Enabled == true && GetAvailableResourceTypesForProject(projectId, affiliatedOrganizations) + .Select(x => x.Id) + .Contains(resourceType.Id); + } + } +} \ No newline at end of file