private Result ValidateRequest(Models.Requests.Permissions managerPermissionsRequest)
 => ValidationHelper.Validate(managerPermissionsRequest, new PermissionsRequestValidator());
        public Task <Result <Models.Responses.ManagerContext> > ModifyPermissions(int managerId, Models.Requests.Permissions permissionsRequest)
        {
            return(_managerContext.GetManagerRelation()
                   .Ensure(managerRelation => HasManagerChangeManagerPermission(managerRelation), "The manager does not have enough rights")
                   .Ensure(managerRelation => DoesManagerChangeNotHisRights(managerRelation), "The manager cannot change his rights")
                   .Check(managerRelation => ValidateRequest(permissionsRequest))
                   .Bind(managerRelation => UpdatePermissions(managerRelation.ServiceSupplierId))
                   .Map(Build));


            bool DoesManagerChangeNotHisRights(Common.Models.ManagerServiceSupplierRelation managerRelation)
            {
                return(managerRelation.ManagerId != managerId);
            }

            async Task <Result <Common.Models.ManagerContext> > UpdatePermissions(int serviceSupplierId)
            {
                var managerRelation = await _dbContext.ManagerServiceSupplierRelations
                                      .SingleOrDefaultAsync(relation => relation.ManagerId == managerId && relation.ServiceSupplierId == serviceSupplierId);

                if (managerRelation is null)
                {
                    return(Result.Failure <Common.Models.ManagerContext>($"Manager with ID {managerId} has no relation with service supplier"));
                }

                if (managerRelation.IsMaster)
                {
                    return(Result.Failure <Common.Models.ManagerContext>("You cannot change the rights of the master manager"));
                }

                var manager = await _dbContext.Managers.SingleOrDefaultAsync(manager => manager.Id == managerId);

                if (manager is null)
                {
                    return(Result.Failure <Common.Models.ManagerContext>($"Manager with ID {managerId} not found"));
                }

                managerRelation.ManagerPermissions = permissionsRequest.ManagerPermissions;
                _dbContext.ManagerServiceSupplierRelations.Update(managerRelation);
                await _dbContext.SaveChangesAsync();

                var managerContext = CollectManagerContext(manager, managerRelation);

                return(Result.Success(managerContext));
            }
        }