public virtual async Task <PermissionedObjectDto> SetAsync(PermissionedObjectDto permissionedObject)
        {
            // ToDo: AS - check if permission names exist
            var obj = await _permissionedObjectRepository.GetAll().FirstOrDefaultAsync(x =>
                                                                                       x.Object == permissionedObject.Object &&
                                                                                       x.Type == permissionedObject.Type &&
                                                                                       x.Module == permissionedObject.Module)
                      ??
                      new PermissionedObject()
            {
                Object = permissionedObject.Object,
                Type   = permissionedObject.Type,
                Module = permissionedObject.Module,
                Parent = permissionedObject.Parent,
                Name   = permissionedObject.Name,
            };

            obj.Category    = permissionedObject.Category;
            obj.Description = permissionedObject.Description;
            obj.Permissions = string.Join(",", permissionedObject.Permissions ?? new ConcurrentHashSet <string>());
            //obj.Inherited = permissionedObject.Inherited;
            obj.Hidden = permissionedObject.Hidden;
            obj.Access = (RefListPermissionedAccess?)permissionedObject.Access ?? RefListPermissionedAccess.Inherited;

            await _permissionedObjectRepository.InsertOrUpdateAsync(obj);

            await _cacheManager.GetPermissionedObjectCache().SetAsync(permissionedObject.Object, permissionedObject);

            return(permissionedObject);
        }
        public List <PermissionedObjectDto> GetAll(string objectType = null)
        {
            if (objectType != null && !GetObjectTypes().Contains(objectType))
            {
                return(new List <PermissionedObjectDto>());
            }

            var api = _apiDescriptionsProvider.ApiDescriptionGroups.Items.SelectMany(g => g.Items.Select(a =>
            {
                var descriptor = a.ActionDescriptor.AsControllerActionDescriptor();
                var module     = GetModuleOfType(descriptor.ControllerTypeInfo.AsType());
                return(new ApiDescriptor()
                {
                    Description = a,
                    Module = module,
                    Service = descriptor.ControllerTypeInfo.AsType(),
                    HttpMethod = a.HttpMethod,
                    Endpoint = a.RelativePath,
                    Action = descriptor.MethodInfo
                });
            })).ToList();

            var allApiPermissions = new List <PermissionedObjectDto>();

            var modules = api.Select(x => x.Module).Distinct().ToList();

            foreach (var module in modules)
            {
                var services = api.Where(a => a.Module == module).Select(x => x.Service).Distinct().ToList();

                foreach (var service in services)
                {
                    var isDynamic = service.GetInterfaces().Any(x =>
                                                                x.IsGenericType &&
                                                                x.GetGenericTypeDefinition() == typeof(IDynamicCrudAppService <, ,>));

                    var objType = isDynamic
                        ? PermissionedObjectsSheshaTypes.WebCrudApi
                        : GetObjectType(service);

                    if (objectType != null && objType != objectType)
                    {
                        continue;
                    }

                    string name        = null;
                    string fullName    = null;
                    string description = null;
                    Type   eModule     = null;

                    Type entityType = null;
                    if (objType == PermissionedObjectsSheshaTypes.WebCrudApi)
                    {
                        entityType = service.FindBaseGenericType(typeof(AbpAsyncCrudAppService <, , , , , , ,>))?.GetGenericArguments()[0];
                        if (isDynamic && entityType != null)
                        {
                            name        = $"{entityType.Name}DynamicCrudAppService";
                            fullName    = $"{entityType.Namespace}.Dynamic{entityType.Name}CrudAppService";
                            description = $"CRUD API service for {entityType.Name} entity";
                            eModule     = GetModuleOfType(entityType);
                        }
                    }


                    var parent = new PermissionedObjectDto()
                    {
                        Object      = fullName ?? service.FullName,
                        Module      = (eModule ?? module)?.FullName ?? "",
                        Name        = name ?? GetName(service),
                        Type        = objType,
                        Description = description ?? GetDescription(service),
                        Dependency  = entityType != null
                    ? entityType.FullName
                    : null
                    };
                    allApiPermissions.Add(parent);

                    var methods = api.Where(a => a.Module == module && a.Service == service).ToList();

                    foreach (var methodInfo in methods)
                    {
                        var methodName = methodInfo.Action.Name.RemovePostfix("Async");

                        var child = new PermissionedObjectDto()
                        {
                            Object      = parent.Object + "@" + methodInfo.Action.Name,
                            Module      = parent.Module,
                            Name        = GetName(methodInfo.Action),
                            Type        = GetMethodType(objType),
                            Parent      = parent.Object,
                            Description = GetDescription(methodInfo.Action),
                            Dependency  = entityType != null && CrudMethods.ContainsKey(methodName)
                                ? entityType.FullName + "@" + CrudMethods.GetValueOrDefault(methodName)
                                : null,
                        };

                        child.AdditionalParameters.Add("HttpMethod", methodInfo.HttpMethod);
                        child.AdditionalParameters.Add("Endpoint", methodInfo.Endpoint);
                        //parent.Child.Add(child);
                        allApiPermissions.Add(child);
                    }
                }
            }

            return(allApiPermissions);
        }