Пример #1
0
        private void AddApiDescriptionToModel(ApiDescription apiDescription, ApplicationApiDescriptionModel model)
        {
            var moduleModel     = model.GetOrAddModule(GetModuleName(apiDescription));
            var controllerModel = moduleModel.GetOrAddController(GetControllerName(apiDescription));

            var method     = (apiDescription.ActionDescriptor as ControllerActionDescriptor)?.MethodInfo;
            var methodName = GetNormalizedMethodName(controllerModel, method);

            if (controllerModel.Actions.ContainsKey(methodName))
            {
                _logger.LogWarning($"Controller '{controllerModel.Name}' contains more than one action with name '{methodName}' for module '{moduleModel.Name}'. Ignored: " + method);
                return;
            }

            var returnValue = new ReturnValueApiDescriptionModel(method.ReturnType);

            var actionModel = controllerModel.AddAction(new ActionApiDescriptionModel(
                                                            methodName,
                                                            returnValue,
                                                            apiDescription.RelativePath,
                                                            apiDescription.HttpMethod
                                                            ));

            AddParameterDescriptionsToModel(actionModel, method, apiDescription);
        }
    public ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionModelRequestDto input)
    {
        //TODO: Can cache the model?

        var model = ApplicationApiDescriptionModel.Create();

        foreach (var descriptionGroupItem in _descriptionProvider.ApiDescriptionGroups.Items)
        {
            foreach (var apiDescription in descriptionGroupItem.Items)
            {
                if (!apiDescription.ActionDescriptor.IsControllerAction())
                {
                    continue;
                }

                AddApiDescriptionToModel(apiDescription, model, input);
            }
        }

        foreach (var(_, module) in model.Modules)
        {
            var controllers = module.Controllers.GroupBy(x => x.Value.Type).ToList();
            foreach (var controller in controllers.Where(x => x.Count() > 1))
            {
                var removedController = module.Controllers.RemoveAll(x => x.Value.IsRemoteService && controller.OrderBy(c => c.Value.ControllerGroupName).Skip(1).Contains(x));
                foreach (var removed in removedController)
                {
                    Logger.LogInformation($"The controller named '{removed.Value.Type}' was removed from ApplicationApiDescriptionModel because it same with other controller.");
                }
            }
        }

        return(model);
    }
        public string CreateScript(ApplicationApiDescriptionModel model)
        {
            var script = new StringBuilder();

            foreach (var module in model.Modules.Values)
            {
                var moduleName = module.Name.ToCamelCase();

                foreach (var controller in module.Controllers.Values)
                {
                    var controllerName = controller.Name.ToCamelCase();

                    script.AppendLine("(function(){");
                    script.AppendLine();

                    script.AppendLine($"    var serviceNamespace = site.utils.createNamespace(site.api, 'services.{moduleName}.{controllerName}');");
                    script.AppendLine();

                    foreach (var action in controller.Actions.Values)
                    {
                        AddActionScript(script, controller, action);
                        script.AppendLine();
                    }

                    script.AppendLine();
                    script.AppendLine("})();");
                    script.AppendLine();
                }
            }

            return(script.ToString());
        }
Пример #4
0
        private void AddApiDescriptionToModel(ApiDescription apiDescription, ApplicationApiDescriptionModel model)
        {
            var controllerType = apiDescription.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType();
            var setting        = FindSetting(controllerType);

            var moduleModel = model.GetOrAddModule(GetRootPath(controllerType, setting));

            var controllerModel = moduleModel.GetOrAddController(controllerType.FullName, CalculateControllerName(controllerType, setting), controllerType, _modelOptions.IgnoredInterfaces);

            var method = apiDescription.ActionDescriptor.GetMethodInfo();

            var uniqueMethodName = GetUniqueActionName(method);

            if (controllerModel.Actions.ContainsKey(uniqueMethodName))
            {
                Logger.LogWarning($"Controller '{controllerModel.ControllerName}' contains more than one action with name '{uniqueMethodName}' for module '{moduleModel.RootPath}'. Ignored: " + method);
                return;
            }

            var actionModel = controllerModel.AddAction(uniqueMethodName, ActionApiDescriptionModel.Create(
                                                            uniqueMethodName,
                                                            method,
                                                            apiDescription.RelativePath,
                                                            apiDescription.HttpMethod,
                                                            setting?.ApiVersions.Select(v => v.ToString()).ToList() ?? new List <string>() //TODO: Also get from ApiVersion attributes if available..?
                                                            ));

            AddParameterDescriptionsToModel(actionModel, method, apiDescription);
        }
Пример #5
0
        public ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionModelRequestDto input)
        {
            //TODO: Can cache the model?

            var model = ApplicationApiDescriptionModel.Create();

            foreach (var descriptionGroupItem in _descriptionProvider.ApiDescriptionGroups.Items)
            {
                foreach (var apiDescription in descriptionGroupItem.Items)
                {
                    if (!apiDescription.ActionDescriptor.IsControllerAction())
                    {
                        continue;
                    }

                    if (apiDescription.HttpMethod.IsNullOrEmpty())
                    {
                        apiDescription.HttpMethod = "GET";
                    }

                    AddApiDescriptionToModel(apiDescription, model, input);
                }
            }

            return(model);
        }
Пример #6
0
        private void AddApiDescriptionToModel(ApiDescription apiDescription, ApplicationApiDescriptionModel model)
        {
            var controllerType = apiDescription.ActionDescriptor.AsControllerActionDescriptor().ControllerTypeInfo.AsType();
            var setting        = FindSetting(controllerType);

            var moduleModel = model.GetOrAddModule(GetRootPath(controllerType, setting));

            var controllerModel = moduleModel.GetOrAddController(controllerType.FullName, CalculateControllerName(controllerType, setting), controllerType, _modelOptions.IgnoredInterfaces);

            var method = apiDescription.ActionDescriptor.GetMethodInfo();

            var uniqueMethodName = GetUniqueActionName(method);

            if (controllerModel.Actions.ContainsKey(uniqueMethodName))
            {
                Logger.LogWarning($"Controller '{controllerModel.ControllerName}' contains more than one action with name '{uniqueMethodName}' for module '{moduleModel.RootPath}'. Ignored: " + method);
                return;
            }

            Logger.LogDebug($"ActionApiDescriptionModel.Create: {controllerModel.ControllerName}.{uniqueMethodName}");
            var actionModel = controllerModel.AddAction(uniqueMethodName, ActionApiDescriptionModel.Create(
                                                            uniqueMethodName,
                                                            method,
                                                            apiDescription.RelativePath,
                                                            apiDescription.HttpMethod,
                                                            GetSupportedVersions(controllerType, method, setting)
                                                            ));

            AddParameterDescriptionsToModel(actionModel, method, apiDescription);
        }
    private void AddCustomTypesToModel(ApplicationApiDescriptionModel applicationModel, MethodInfo method)
    {
        foreach (var parameterInfo in method.GetParameters())
        {
            AddCustomTypesToModel(applicationModel, parameterInfo.ParameterType);
        }

        AddCustomTypesToModel(applicationModel, method.ReturnType);
    }
        private void AddApiDescriptionToModel(
            ApiDescription apiDescription,
            ApplicationApiDescriptionModel applicationModel,
            ApplicationApiDescriptionModelRequestDto input)
        {
            var controllerType = apiDescription
                                 .ActionDescriptor
                                 .AsControllerActionDescriptor()
                                 .ControllerTypeInfo;

            var setting = FindSetting(controllerType);

            var moduleModel = applicationModel.GetOrAddModule(
                GetRootPath(controllerType, setting),
                GetRemoteServiceName(controllerType, setting)
                );

            var controllerModel = moduleModel.GetOrAddController(
                controllerType.FullName,
                _options.ControllerNameGenerator(controllerType, setting),
                controllerType,
                _modelOptions.IgnoredInterfaces
                );

            var method = apiDescription.ActionDescriptor.GetMethodInfo();

            var uniqueMethodName = _options.ActionNameGenerator(method);

            if (controllerModel.Actions.ContainsKey(uniqueMethodName))
            {
                Logger.LogWarning(
                    $"Controller '{controllerModel.ControllerName}' contains more than one action with name '{uniqueMethodName}' for module '{moduleModel.RootPath}'. Ignored: " +
                    method);
                return;
            }

            Logger.LogDebug($"ActionApiDescriptionModel.Create: {controllerModel.ControllerName}.{uniqueMethodName}");

            var actionModel = controllerModel.AddAction(
                uniqueMethodName,
                ActionApiDescriptionModel.Create(
                    uniqueMethodName,
                    method,
                    apiDescription.RelativePath,
                    apiDescription.HttpMethod,
                    GetSupportedVersions(controllerType, method, setting)
                    )
                );

            if (input.IncludeTypes)
            {
                AddCustomTypesToModel(applicationModel, method);
            }

            AddParameterDescriptionsToModel(actionModel, method, apiDescription);
        }
Пример #9
0
        private static void AddCustomTypesToModel(ApplicationApiDescriptionModel applicationModel, [CanBeNull] Type type)
        {
            if (type == null)
            {
                return;
            }

            type = AsyncHelper.UnwrapTask(type);

            if (type == typeof(object) ||
                type == typeof(void) ||
                type == typeof(Enum) ||
                type == typeof(ValueType) ||
                TypeHelper.IsPrimitiveExtended(type))
            {
                return;
            }

            if (TypeHelper.IsEnumerable(type, out var itemType))
            {
                AddCustomTypesToModel(applicationModel, itemType);
                return;
            }

            if (TypeHelper.IsDictionary(type, out var keyType, out var valueType))
            {
                AddCustomTypesToModel(applicationModel, keyType);
                AddCustomTypesToModel(applicationModel, valueType);
                return;
            }

            /* TODO: Add interfaces
             */

            var typeName = TypeHelper.GetFullNameHandlingNullableAndGenerics(type);

            if (applicationModel.Types.ContainsKey(typeName))
            {
                return;
            }

            var typeModel = TypeApiDescriptionModel.Create(type);

            applicationModel.Types[typeName] = typeModel;

            AddCustomTypesToModel(applicationModel, type.BaseType);

            foreach (var propertyInfo in type.GetProperties())
            {
                AddCustomTypesToModel(applicationModel, propertyInfo.PropertyType);
            }
        }
Пример #10
0
    public ApplicationApiDescriptionModel CreateSubModel(string[] modules = null, string[] controllers = null, string[] actions = null)
    {
        var subModel = ApplicationApiDescriptionModel.Create();;

        foreach (var module in Modules.Values)
        {
            if (modules == null || modules.Contains(module.RootPath))
            {
                subModel.AddModule(module.CreateSubModel(controllers, actions));
            }
        }

        return(subModel);
    }
        public ApplicationApiDescriptionModel CreateModel()
        {
            var model = new ApplicationApiDescriptionModel();

            foreach (var descriptionGroupItem in _descriptionProvider.ApiDescriptionGroups.Items)
            {
                foreach (var apiDescription in descriptionGroupItem.Items)
                {
                    AddApiDescriptionToModel(apiDescription, model);
                }
            }

            return(model);
        }
Пример #12
0
        public string CreateScript(ApplicationApiDescriptionModel model)
        {
            var script = new StringBuilder();

            script.AppendLine("/* This file is automatically generated by ABP framework to use MVC Controllers from javascript. */");
            script.AppendLine();

            foreach (var module in model.Modules.Values)
            {
                script.AppendLine();
                AddModuleScript(script, module);
            }

            return(script.ToString());
        }
        public string CreateScript(ApplicationApiDescriptionModel model)
        {
            var script = new StringBuilder();

            script.AppendLine("/* This file is automatically generated by OpenApp. */");
            script.AppendLine();
            script.AppendLine("var abp = abp || {};");
            script.AppendLine("abp.schemas = abp.schemas || {};");
            foreach (var module in model.Modules.Values)
            {
                script.AppendLine();
                AddModuleScript(script, module);
            }
            return(script.ToString());
        }
Пример #14
0
        public string CreateScript(ApplicationApiDescriptionModel model)
        {
            var script = new StringBuilder();

            script.AppendLine("/* This file is automatically generated by SharePlatform framework to use MVC Controllers from JavaScript. */");
            script.AppendLine();
            script.AppendLine("var SharePlatform = SharePlatform || {};");
            script.AppendLine("SharePlatform.services = SharePlatform.services || {};");

            foreach (var module in model.Modules.Values)
            {
                script.AppendLine();
                AddModuleScript(script, module);
            }

            return(script.ToString());
        }
Пример #15
0
        public ApplicationApiDescriptionModel CreateModel()
        {
            var model = new ApplicationApiDescriptionModel();

            foreach (var descriptionGroupItem in _descriptionProvider.ApiDescriptionGroups.Items)
            {
                foreach (var apiDescription in descriptionGroupItem.Items)
                {
                    if (!(apiDescription.ActionDescriptor is ControllerActionDescriptor))
                    {
                        continue;
                    }

                    AddApiDescriptionToModel(apiDescription, model);
                }
            }

            return(model);
        }
    private void Initialize()
    {
        ApplicationApiDescriptionModel = GetApplicationApiDescriptionModel();
        var controllers = ApplicationApiDescriptionModel.Modules.Select(x => x.Value).SelectMany(x => x.Controllers.Values).ToList();

        foreach (var controller in controllers.Where(x => x.Interfaces.Any()))
        {
            var appServiceType = controller.Interfaces.Last().Type;

            foreach (var actionItem in controller.Actions.Values)
            {
                var actionKey = $"{appServiceType}.{actionItem.Name}.{string.Join("-", actionItem.ParametersOnMethod.Select(x => x.Type))}";

                if (!ActionApiDescriptionModels.ContainsKey(actionKey))
                {
                    ActionApiDescriptionModels.Add(actionKey, actionItem);
                }
            }
        }
    }
Пример #17
0
        private void AddApiDescriptionToModel(ApiDescription apiDescription, ApplicationApiDescriptionModel model)
        {
            var moduleModel     = model.GetOrAddModule(GetModuleName(apiDescription));
            var controllerModel = moduleModel.GetOrAddController(apiDescription.GroupName);
            var method          = apiDescription.ActionDescriptor.GetMethodInfo();

            if (controllerModel.Actions.ContainsKey(method.Name))
            {
                Logger.Warn($"Controller '{controllerModel.Name}' contains more than one action with name '{method.Name}' for module '{moduleModel.Name}'. Ignored: " + apiDescription.ActionDescriptor.GetMethodInfo());
                return;
            }

            var actionModel = controllerModel.AddAction(new ActionApiDescriptionModel(
                                                            method.Name,
                                                            apiDescription.RelativePath,
                                                            apiDescription.HttpMethod
                                                            ));

            AddParameterDescriptionsToModel(actionModel, method, apiDescription);
        }
Пример #18
0
        public ApplicationApiDescriptionModel CreateApiModel()
        {
            //TODO: Can cache the model?

            var model = ApplicationApiDescriptionModel.Create();

            foreach (var descriptionGroupItem in _descriptionProvider.ApiDescriptionGroups.Items)
            {
                foreach (var apiDescription in descriptionGroupItem.Items)
                {
                    if (!apiDescription.ActionDescriptor.IsControllerAction())
                    {
                        continue;
                    }

                    AddApiDescriptionToModel(apiDescription, model);
                }
            }

            return(model);
        }
        public ApplicationApiDescriptionModel CreateApiModel(ApplicationApiDescriptionModelRequestDto input)
        {
            //TODO: 优化性能,考虑对模块进行缓存处理?

            var model = ApplicationApiDescriptionModel.Create();

            foreach (var descriptionGroupItem in _descriptionProvider.ApiDescriptionGroups.Items)
            {
                foreach (var apiDescription in descriptionGroupItem.Items)
                {
                    if (!apiDescription.ActionDescriptor.IsControllerAction())
                    {
                        continue;
                    }

                    AddApiDescriptionToModel(apiDescription, model, input);
                }
            }

            return(model);
        }
        public string CreateScript(ApplicationApiDescriptionModel model)
        {
            var script = new StringBuilder();

            script.AppendLine("/* This file is automatically generated by ABP framework. */");
            script.AppendLine();
            script.AppendLine("var abp = abp || {};");
            script.AppendLine("abp.schemas = abp.schemas || {};");

            foreach (var module in model.Modules.Values)
            {
                script.AppendLine();
                AddModuleScript(script, module);
            }



            //script.Append(Newtonsoft.Json.JsonConvert.SerializeObject(model));

            return(script.ToString());
        }
Пример #21
0
    public string CreateScript(ApplicationApiDescriptionModel model)
    {
        var script = new StringBuilder();

        script.AppendLine("/* This file is automatically generated by ABP framework to use MVC Controllers from javascript. */");
        script.AppendLine();

        foreach (var module in model.Modules)
        {
            if (!ShouldCreateModuleScript(module))
            {
                continue;
            }

            script.AppendLine();
            AddModuleScript(script, module.Value);
        }

        AddInitializedEventTrigger(script);

        return(script.ToString());
    }
Пример #22
0
        private void AddApiDescriptionToModel(ApiDescription apiDescription, ApplicationApiDescriptionModel model)
        {
            var moduleModel     = model.GetOrAddModule(this.GetModuleName(apiDescription));
            var controllerModel = moduleModel.GetOrAddController(apiDescription.GroupName.RemovePostFix(ApplicationService.CommonPostfixes));
            var method          = apiDescription.ActionDescriptor.GetMethodInfo();

            if (controllerModel.Actions.ContainsKey(method.Name))
            {
                this.Logger.Warn($"Controller '{controllerModel.Name}' contains more than one action with name '{method.Name}' for module '{moduleModel.Name}'. Ignored: " + apiDescription.ActionDescriptor.GetMethodInfo());
                return;
            }

            var returnValue = new ReturnValueApiDescriptionModel(method.ReturnType);

            var actionModel = controllerModel.AddAction(new ActionApiDescriptionModel(
                                                            method.Name,
                                                            returnValue,
                                                            apiDescription.RelativePath,
                                                            apiDescription.HttpMethod
                                                            ));

            this.AddParameterDescriptionsToModel(actionModel, method, apiDescription);
        }
Пример #23
0
    protected virtual async Task <ApplicationApiDescriptionModel> GetApplicationApiDescriptionModelAsync(GenerateProxyArgs args)
    {
        Check.NotNull(args.Url, nameof(args.Url));

        var client = CliHttpClientFactory.CreateClient();

        var apiDefinitionResult = await client.GetStringAsync(CliUrls.GetApiDefinitionUrl(args.Url));

        var apiDefinition = JsonSerializer.Deserialize <ApplicationApiDescriptionModel>(apiDefinitionResult);

        var moduleDefinition = apiDefinition.Modules.FirstOrDefault(x => string.Equals(x.Key, args.Module, StringComparison.CurrentCultureIgnoreCase)).Value;

        if (moduleDefinition == null)
        {
            throw new CliUsageException($"Module name: {args.Module} is invalid");
        }

        var apiDescriptionModel = ApplicationApiDescriptionModel.Create();

        apiDescriptionModel.AddModule(moduleDefinition);

        return(apiDescriptionModel);
    }
    private void AddApiDescriptionToModel(
        ApiDescription apiDescription,
        ApplicationApiDescriptionModel applicationModel,
        ApplicationApiDescriptionModelRequestDto input)
    {
        var controllerType = apiDescription
                             .ActionDescriptor
                             .AsControllerActionDescriptor()
                             .ControllerTypeInfo;

        var setting = FindSetting(controllerType);

        var moduleModel = applicationModel.GetOrAddModule(
            GetRootPath(controllerType, setting),
            GetRemoteServiceName(controllerType, setting)
            );

        var controllerModel = moduleModel.GetOrAddController(
            _options.ControllerNameGenerator(controllerType, setting),
            FindGroupName(controllerType) ?? apiDescription.GroupName,
            controllerType,
            _modelOptions.IgnoredInterfaces
            );

        var method = apiDescription.ActionDescriptor.GetMethodInfo();

        var uniqueMethodName = _options.ActionNameGenerator(method);

        if (controllerModel.Actions.ContainsKey(uniqueMethodName))
        {
            Logger.LogWarning(
                $"Controller '{controllerModel.ControllerName}' contains more than one action with name '{uniqueMethodName}' for module '{moduleModel.RootPath}'. Ignored: " +
                method);
            return;
        }

        Logger.LogDebug($"ActionApiDescriptionModel.Create: {controllerModel.ControllerName}.{uniqueMethodName}");

        bool?allowAnonymous = null;

        if (apiDescription.ActionDescriptor.EndpointMetadata.Any(x => x is IAllowAnonymous))
        {
            allowAnonymous = true;
        }
        else if (apiDescription.ActionDescriptor.EndpointMetadata.Any(x => x is IAuthorizeData))
        {
            allowAnonymous = false;
        }

        var implementFrom = controllerType.FullName;

        var interfaceType = controllerType.GetInterfaces().FirstOrDefault(i => i.GetMethods().Any(x => x.ToString() == method.ToString()));

        if (interfaceType != null)
        {
            implementFrom = TypeHelper.GetFullNameHandlingNullableAndGenerics(interfaceType);
        }

        var actionModel = controllerModel.AddAction(
            uniqueMethodName,
            ActionApiDescriptionModel.Create(
                uniqueMethodName,
                method,
                apiDescription.RelativePath,
                apiDescription.HttpMethod,
                GetSupportedVersions(controllerType, method, setting),
                allowAnonymous,
                implementFrom
                )
            );

        if (input.IncludeTypes)
        {
            AddCustomTypesToModel(applicationModel, method);
        }

        AddParameterDescriptionsToModel(actionModel, method, apiDescription);
    }
    private static void AddCustomTypesToModel(ApplicationApiDescriptionModel applicationModel,
                                              [CanBeNull] Type type)
    {
        if (type == null)
        {
            return;
        }

        if (type.IsGenericParameter)
        {
            return;
        }

        type = AsyncHelper.UnwrapTask(type);

        if (type == typeof(object) ||
            type == typeof(void) ||
            type == typeof(Enum) ||
            type == typeof(ValueType) ||
            TypeHelper.IsPrimitiveExtended(type))
        {
            return;
        }

        if (TypeHelper.IsDictionary(type, out var keyType, out var valueType))
        {
            AddCustomTypesToModel(applicationModel, keyType);
            AddCustomTypesToModel(applicationModel, valueType);
            return;
        }

        if (TypeHelper.IsEnumerable(type, out var itemType))
        {
            AddCustomTypesToModel(applicationModel, itemType);
            return;
        }

        if (type.IsGenericType && !type.IsGenericTypeDefinition)
        {
            var genericTypeDefinition = type.GetGenericTypeDefinition();

            AddCustomTypesToModel(applicationModel, genericTypeDefinition);

            foreach (var genericArgument in type.GetGenericArguments())
            {
                AddCustomTypesToModel(applicationModel, genericArgument);
            }

            return;
        }

        var typeName = CalculateTypeName(type);

        if (applicationModel.Types.ContainsKey(typeName))
        {
            return;
        }

        applicationModel.Types[typeName] = TypeApiDescriptionModel.Create(type);

        AddCustomTypesToModel(applicationModel, type.BaseType);

        foreach (var propertyInfo in type.GetProperties().Where(p => p.DeclaringType == type))
        {
            AddCustomTypesToModel(applicationModel, propertyInfo.PropertyType);
        }
    }