Ejemplo n.º 1
0
        public string GetClientMethodCode(MethodInfo method, string url)
        {
            var model = new ClientMethodModel();

            var parameterInfos  = method.GetParameters();
            var inputParameters = parameterInfos.Select(p => string.Format("{0}: {1}", p.Name, TypeMapper.GetTypeScriptType(p.ParameterType)))
                                  .ToList();

            model.Traditional = parameterInfos.Any(p => p.ParameterType.IsArray);

            var returnType = method.ReturnType;

            if (returnType.Name != "Void")
            {
                var onSucces = "callback: (data: " + TypeMapper.GetTypeScriptType(returnType) + ") => any";
                inputParameters.Add(onSucces);
                model.OnSucces = "callback";
            }

            //hacky
            var isPost = method.GetCustomAttributes(typeof(HttpPostAttribute), true).Any() || returnType.IsJsonResult() || returnType == typeof(JsonResult);

            model.AjaxMethod = isPost ? "POST" : "";

            var allParameters = string.Join(", ", inputParameters);

            model.Signature = method.Name + "(" + allParameters + ")";



            model.Url = url;
            var inputJsonTuples = method.GetParameters().Select(p => string.Format("{0}: {0}", p.Name));

            model.Data = "{ " + string.Join(", ", inputJsonTuples) + " }";


            var template = GetTemplate("ClientMethod");


            return(RemoveEmptyLines(Razor.Parse(template, model)));//.Split("\r\n".ToCharArray(),StringSplitOptions.RemoveEmptyEntries);
        }
        public ClientGroupsModel Bind(CodeModelTs codeModel)
        {
            var model = new ClientGroupsModel
            {
                ModelModuleName = "model",
                Header          = new HeaderModel(),
                Clients         = new List <ClientModel>()
            };

            foreach (var group in codeModel.MethodGroups)
            {
                var groupName = group.Key;
                var methods   = group.ToArray();

                var client = new ClientModel
                {
                    Name    = $"{groupName.ToPascalCase().Replace("Api", "")}Api",
                    Methods = new List <ClientMethodModel>()
                };

                client.InterfaceName = $"I{client.Name}";

                foreach (var method in methods)
                {
                    IModelType modelType    = null;
                    string     responseName = null;
                    string     requestName  = null;
                    if (!TryGetResponseName(method, out modelType, out responseName, out requestName, model.ModelModuleName))
                    {
                        continue;
                    }

                    var clientMethod = new ClientMethodModel
                    {
                        OperationId         = method.SerializedName.ToString(),
                        UrlTemplate         = GetUrlTemplate(method),
                        QueryStringTemplate = GetQueryParameterTemplate(method),
                        HttpMethod          = method.HttpMethod.ToString().ToLower(),
                        MethodName          = method.Name.Value.Replace($"{groupName}_", "").ToCamelCase(),
                        RequestTypeName     = requestName,
                        ResponseTypeName    = responseName,
                        ParamNamesInPath    =
                            method.Parameters.Where(p => p.Location == ParameterLocation.Path)
                            .Select(p => p.Name.Value)
                            .ToList(),

                        ParamNamesInQuery =
                            method.Parameters.Where(p => p.Location == ParameterLocation.Query)
                            .Select(p => p.Name.Value)
                            .ToList(),

                        ParamNamesInBody =
                            method.Parameters.Where(p => p.Location == ParameterLocation.Body)
                            .Select(p => p.Name.Value)
                            .ToList(),

                        ParamNamesInHeader =
                            method.Parameters.Where(p => p.Location == ParameterLocation.Header)
                            .Select(p => p.Name.Value)
                            .ToList()
                    };

                    clientMethod.ResponsePromiseTypeName = $"Promise<{clientMethod.ResponseTypeName}>";
                    client.Methods.Add(clientMethod);
                }

                model.Clients.Add(client);
            }

            return(model);
        }