public Result Add(string roleId, AddRoleAssignmentRequest addRoleAssignment)
        {
            ValidationResult validationResult = _addRoleAssignmentValidator.Validate(addRoleAssignment);

            if (!validationResult.IsValid)
            {
                _logger.LogWarning($"Invalid AddRoleAssignmentRequest model");
                return(Result.Fail(validationResult.Errors));
            }

            if (roleId == addRoleAssignment.RoleId)
            {
                _logger.LogError($"Can not assign Role to itself. RoleId {roleId}");
                return(Result.Fail("can_not_assigne_to_itself", "Can not assign Role to itself"));
            }

            Result roleExist = ValidateRole(roleId);

            if (roleExist.Failure)
            {
                return(Result.Fail(roleExist.Errors));
            }

            Result canAssigneRoleExist = ValidateRole(addRoleAssignment.RoleId);

            if (canAssigneRoleExist.Failure)
            {
                return(Result.Fail(canAssigneRoleExist.Errors));
            }

            BaseSpecification <RoleAssignmentEntity> roleAlreadyAssignedSpecification = new BaseSpecification <RoleAssignmentEntity>();

            roleAlreadyAssignedSpecification.AddFilter(x => x.RoleId == roleId);
            roleAlreadyAssignedSpecification.AddFilter(x => x.CanAssigneRoleId == addRoleAssignment.RoleId);

            bool roleAlreadyAssigned = _groupRoleAssignmentRepository.Exist(roleAlreadyAssignedSpecification);

            if (roleAlreadyAssigned)
            {
                _logger.LogError($"Role is already assigned. RoleId {roleId}, CanAssigneRoleId {addRoleAssignment.RoleId}");
                return(Result.Fail("role_is_already_assigned", "Role is already assigned"));
            }

            //TODO: check for recursion loop if we are going to use role assignment recursion

            RoleAssignmentEntity roleAssignment = new RoleAssignmentEntity(
                roleId: roleId,
                canAssigneRoleId: addRoleAssignment.RoleId);

            bool addResult = _groupRoleAssignmentRepository.Add(roleAssignment);

            if (!addResult)
            {
                _logger.LogError($"Failed to add GroupRoleAssignment, RoleId {roleId}, CanAssignedRoleId {addRoleAssignment.RoleId}");
                return(Result.Fail("failed_to_add_role_assignment", "Failed to add RoleAssignment"));
            }

            return(Result.Ok());
        }
Esempio n. 2
0
        public IActionResult Add([FromRoute] string roleId, [FromBody] AddRoleAssignmentRequest addRoleAssignment)
        {
            if (!ModelState.IsValid)
            {
                return(BadRequest(ModelState));
            }

            Result result = _roleAssignmentService.Add(roleId, addRoleAssignment);

            if (result.Failure)
            {
                ModelState.AddErrors(result.Errors);
                return(BadRequest(ModelState));
            }

            return(Ok(new EmptyResult()));
        }