Esempio n. 1
0
        public async Task <Function> CreateAsync(FunctionSubmit functionSubmit, Guid createdByGuid)
        {
            // Start transactions to allow complete rollback in case of an error
            BeginAllTransactions();

            try
            {
                var function = new FunctionModel();

                function.Name                = functionSubmit.Name;
                function.Description         = functionSubmit.Description;
                function.FunctionPermissions = new List <FunctionPermissionModel>();
                function.ChangedBy           = createdByGuid;

                await CheckForApplicationAndAssignToFunctionIfExists(function, functionSubmit);
                await CheckThatPermissionsExistAndAssignToFunction(function, functionSubmit);

                // All successful
                CommitAllTransactions();

                return(mapper.Map <Function>(await functionRepository.CreateAsync(function)));
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                RollbackAllTransactions();
                throw;
            }
        }
        public FunctionController_Tests()
        {
            functionService  = Substitute.For <IFunctionService>();
            orderByHelper    = Substitute.For <IOrderByHelper>();
            paginationHelper = Substitute.For <IPaginationHelper>();

            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new FunctionResourceFunctionModelProfile());
            });

            mapper = config.CreateMapper();

            functionModel = new Function()
            {
                Uuid          = Guid.NewGuid(),
                Name          = "Test Function Name",
                Description   = "Test Function Description",
                ApplicationId = new Guid(),
                Permissions   = new List <Permission>()
                {
                    new Permission()
                    {
                        Uuid = Guid.NewGuid()
                    },
                    new Permission()
                    {
                        Uuid = Guid.NewGuid()
                    }
                }
            };

            functionSubmitModel = new FunctionSubmit()
            {
                Uuid          = functionModel.Uuid,
                Name          = functionModel.Name,
                Description   = functionModel.Description,
                ApplicationId = functionModel.ApplicationId,
                Permissions   = new List <Guid>()
                {
                    functionModel.Permissions[0].Uuid,
                    functionModel.Permissions[1].Uuid
                }
            };
        }
Esempio n. 3
0
        public async Task <Function> UpdateAsync(FunctionSubmit functionSubmit, Guid updatedByGuid)
        {
            // Start transactions to allow complete rollback in case of an error
            BeginAllTransactions();

            try
            {
                var function = await functionRepository.GetByIdAsync(functionSubmit.Uuid);

                if (function == null)
                {
                    throw new ItemNotFoundException($"Function {functionSubmit.Uuid} not found!");
                }

                if (function.Name != functionSubmit.Name)
                {
                    // Confirm the new name is available
                    var checkExistingNameModel = await functionRepository.GetByNameAsync(functionSubmit.Name);

                    if (checkExistingNameModel != null)
                    {
                        throw new ItemNotProcessableException($"Function with name '{functionSubmit.Name}' already exists.");
                    }
                }

                function.Name                = functionSubmit.Name;
                function.Description         = functionSubmit.Description;
                function.FunctionPermissions = new List <FunctionPermissionModel>();
                function.ChangedBy           = updatedByGuid;

                await CheckForApplicationAndAssignToFunctionIfExists(function, functionSubmit);
                await CheckThatPermissionsExistAndAssignToFunction(function, functionSubmit);

                // All successful
                CommitAllTransactions();

                return(mapper.Map <Function>(await functionRepository.UpdateAsync(function)));
            }
            catch (Exception ex)
            {
                logger.Error(ex);
                RollbackAllTransactions();
                throw;
            }
        }
Esempio n. 4
0
        public async Task <Function> CreateAsync(FunctionSubmit functionSubmit, Guid createdByGuid)
        {
            // Start transactions to allow complete rollback in case of an error
            InitSharedTransaction();

            try
            {
                FunctionModel existingFunction = await functionRepository.GetByNameAsync(functionSubmit.Name);

                if (existingFunction != null)
                {
                    throw new ItemNotProcessableException($"Function with Name '{functionSubmit.Name}' already exist.");
                }

                var function = new FunctionModel
                {
                    Name                = functionSubmit.Name,
                    Description         = functionSubmit.Description,
                    FunctionPermissions = new List <FunctionPermissionModel>(),
                    ChangedBy           = createdByGuid
                };

                await CheckForApplicationAndAssignToFunctionIfExists(function, functionSubmit);
                await CheckForSubRealmAndAssignToFunctionIfExists(function, functionSubmit);
                await CheckThatPermissionsExistAndAssignToFunction(function, functionSubmit);

                // All successful
                CommitTransaction();

                return(mapper.Map <Function>(await functionRepository.CreateAsync(function)));
            }
            catch
            {
                RollbackTransaction();
                throw;
            }
        }
Esempio n. 5
0
        private async Task CheckThatPermissionsExistAndAssignToFunction(FunctionModel function, FunctionSubmit functionSubmit)
        {
            if (functionSubmit.Permissions != null && functionSubmit.Permissions.Count > 0)
            {
                foreach (var permissionId in functionSubmit.Permissions)
                {
                    var permission = await permissionRepository.GetByIdWithApplicationAsync(permissionId);

                    if (permission == null)
                    {
                        throw new ItemNotFoundException($"Permission with UUID: '{permissionId}' not found. Not adding it to function '{functionSubmit.Name}'.");
                    }

                    // NB!! Must check that the permission actually attached to an application function where the application is the same as the Funciton
                    // application. Functions cannot be created from permissions across applications.
                    if (permission.ApplicationFunctionPermissions.First().ApplicationFunction.Application.Id != functionSubmit.ApplicationId)
                    {
                        throw new ItemNotProcessableException($"Permission with UUID: '{permissionId}' does not belong to application with ID: {functionSubmit.ApplicationId}. Not adding it to function '{functionSubmit.Name}'.");
                    }

                    PerformSubrealmCheck(function, permission);

                    function.FunctionPermissions.Add(new FunctionPermissionModel
                    {
                        Function   = function,
                        Permission = permission
                    });
                }
            }
        }
Esempio n. 6
0
        private async Task CheckForApplicationAndAssignToFunctionIfExists(FunctionModel function, FunctionSubmit functionSubmit)
        {
            var application = await applicationRepository.GetByIdAsync(functionSubmit.ApplicationId);

            function.Application = application ?? throw new ItemNotFoundException($"Application with UUID: '{functionSubmit.ApplicationId}' not found. Cannot create function '{functionSubmit.Name}' with this application.");
        }
Esempio n. 7
0
        private async Task CheckForSubRealmAndAssignToFunctionIfExists(FunctionModel function, FunctionSubmit functionSubmit)
        {
            // Recall that submit models with empty GUIDs will not be null but rather Guid.Empty.
            if (functionSubmit.SubRealmId == null || functionSubmit.SubRealmId == Guid.Empty)
            {
                return;
            }

            var existingSubRealm = await subRealmRepository.GetByIdAsync(functionSubmit.SubRealmId, false);

            function.SubRealm = existingSubRealm ?? throw new ItemNotFoundException($"Sub-realm with ID '{functionSubmit.SubRealmId}' does not exist.");
        }
        public FunctionService_Tests()
        {
            var config = new MapperConfiguration(cfg =>
            {
                cfg.AddProfile(new FunctionResourceFunctionModelProfile());
                cfg.AddProfile(new PermissionResourcePermisionModelProfile());
            });

            mapper = config.CreateMapper();

            guid = Guid.NewGuid();
            var applicationGuid = Guid.NewGuid();
            var permissionsGuid = Guid.NewGuid();

            mockedFunctionModel             = new FunctionModel();
            mockedFunctionModel.Id          = guid;
            mockedFunctionModel.Name        = "Test function name";
            mockedFunctionModel.Description = "Test description";
            mockedFunctionModel.Application = new ApplicationModel
            {
                Name = "Test Application",
                Id   = applicationGuid
            };

            mockedFunctionModel.FunctionPermissions = new List <FunctionPermissionModel>
            {
                new FunctionPermissionModel
                {
                    Function   = mockedFunctionModel,
                    Permission = new PermissionModel
                    {
                        Name        = "Test permission",
                        Description = "Test permissions description",
                        Id          = permissionsGuid,
                        ApplicationFunctionPermissions = new List <ApplicationFunctionPermissionModel>()
                        {
                            new ApplicationFunctionPermissionModel()
                            {
                                ApplicationFunctionId = mockedFunctionModel.Application.Id,
                                PermissionId          = permissionsGuid,
                                ApplicationFunction   = new ApplicationFunctionModel()
                                {
                                    Application = mockedFunctionModel.Application
                                }
                            }
                        }
                    }
                }
            };

            mockedFunctionSubmitModel = new FunctionSubmit()
            {
                Uuid          = mockedFunctionModel.Id,
                Name          = mockedFunctionModel.Name,
                ApplicationId = mockedFunctionModel.Application.Id,
                Permissions   = new List <Guid>()
            };

            foreach (var permission in mockedFunctionModel.FunctionPermissions)
            {
                mockedFunctionSubmitModel.Permissions.Add(permission.PermissionId);
            }
        }
Esempio n. 9
0
        public async override Task <IActionResult> UpdateFunctionAsync([FromRoute, Required] Guid functionId, [FromBody] FunctionSubmit functionSubmit)
        {
            if (functionId == Guid.Empty || functionSubmit.Uuid == Guid.Empty)
            {
                return(BadRequest());
            }

            var loggedOnUser = ClaimsHelper.GetScalarClaimValue <Guid>(User, ClaimTypes.NameIdentifier, Guid.Empty);

            return(Ok(await functionService.UpdateAsync(functionSubmit, loggedOnUser)));
        }
Esempio n. 10
0
        public async override Task <IActionResult> CreateFunctionAsync([FromBody] FunctionSubmit functionSubmit)
        {
            var loggedOnUser = ClaimsHelper.GetScalarClaimValue <Guid>(User, ClaimTypes.NameIdentifier, Guid.Empty);

            return(Ok(await functionService.CreateAsync(functionSubmit, loggedOnUser)));
        }
Esempio n. 11
0
 public abstract Task <IActionResult> CreateFunctionAsync([FromBody] FunctionSubmit functionSubmit);
Esempio n. 12
0
 public abstract Task <IActionResult> UpdateFunctionAsync([FromRoute][Required] Guid functionId, [FromBody] FunctionSubmit functionSubmit);