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()); }
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); }
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); }
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); }
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); } }
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); }
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()); }
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()); }
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); } } } }
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); }
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()); }
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()); }
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); }
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); } }