ProxyScriptingHelper.cs 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using Abp.Collections.Extensions;
  5. using Abp.Extensions;
  6. using Abp.Web.Api.Modeling;
  7. namespace Abp.Web.Api.ProxyScripting.Generators
  8. {
  9. public static class ProxyScriptingHelper
  10. {
  11. public const string DefaultHttpVerb = "POST";
  12. public static string GenerateUrlWithParameters(ActionApiDescriptionModel action)
  13. {
  14. //TODO: Can be optimized using StringBuilder?
  15. var url = ReplacePathVariables(action.Url, action.Parameters);
  16. url = AddQueryStringParameters(url, action.Parameters);
  17. return url;
  18. }
  19. public static string GenerateHeaders(ActionApiDescriptionModel action, int indent = 0)
  20. {
  21. var parameters = action
  22. .Parameters
  23. .Where(p => p.BindingSourceId == ParameterBindingSources.Header)
  24. .ToArray();
  25. if (!parameters.Any())
  26. {
  27. return null;
  28. }
  29. return ProxyScriptingJsFuncHelper.CreateJsObjectLiteral(parameters, indent);
  30. }
  31. public static string GenerateBody(ActionApiDescriptionModel action)
  32. {
  33. var parameters = action
  34. .Parameters
  35. .Where(p => p.BindingSourceId == ParameterBindingSources.Body)
  36. .ToArray();
  37. if (parameters.Length <= 0)
  38. {
  39. return null;
  40. }
  41. if (parameters.Length > 1)
  42. {
  43. throw new AbpException(
  44. $"Only one complex type allowed as argument to a controller action that's binding source is 'Body'. But {action.Name} ({action.Url}) contains more than one!"
  45. );
  46. }
  47. return ProxyScriptingJsFuncHelper.GetParamNameInJsFunc(parameters[0]);
  48. }
  49. public static string GenerateFormPostData(ActionApiDescriptionModel action, int indent = 0)
  50. {
  51. var parameters = action
  52. .Parameters
  53. .Where(p => p.BindingSourceId == ParameterBindingSources.Form)
  54. .ToArray();
  55. if (!parameters.Any())
  56. {
  57. return null;
  58. }
  59. return ProxyScriptingJsFuncHelper.CreateJsObjectLiteral(parameters, indent);
  60. }
  61. private static string ReplacePathVariables(string url, IList<ParameterApiDescriptionModel> actionParameters)
  62. {
  63. var pathParameters = actionParameters
  64. .Where(p => p.BindingSourceId == ParameterBindingSources.Path)
  65. .ToArray();
  66. if (!pathParameters.Any())
  67. {
  68. return url;
  69. }
  70. foreach (var pathParameter in pathParameters)
  71. {
  72. url = url.Replace($"{{{pathParameter.Name}}}", $"' + {ProxyScriptingJsFuncHelper.GetParamNameInJsFunc(pathParameter)} + '");
  73. }
  74. return url;
  75. }
  76. private static string AddQueryStringParameters(string url, IList<ParameterApiDescriptionModel> actionParameters)
  77. {
  78. var queryStringParameters = actionParameters
  79. .Where(p => p.BindingSourceId.IsIn(ParameterBindingSources.ModelBinding, ParameterBindingSources.Query))
  80. .ToArray();
  81. if (!queryStringParameters.Any())
  82. {
  83. return url;
  84. }
  85. var qsBuilderParams = queryStringParameters
  86. .Select(p => $"{{ name: '{p.Name.ToCamelCase()}', value: {ProxyScriptingJsFuncHelper.GetParamNameInJsFunc(p)} }}")
  87. .JoinAsString(", ");
  88. return url + $"' + abp.utils.buildQueryString([{qsBuilderParams}]) + '";
  89. }
  90. public static string GetConventionalVerbForMethodName(string methodName)
  91. {
  92. if (methodName.StartsWith("Get", StringComparison.OrdinalIgnoreCase))
  93. {
  94. return "GET";
  95. }
  96. if (methodName.StartsWith("Put", StringComparison.OrdinalIgnoreCase) ||
  97. methodName.StartsWith("Update", StringComparison.OrdinalIgnoreCase))
  98. {
  99. return "PUT";
  100. }
  101. if (methodName.StartsWith("Delete", StringComparison.OrdinalIgnoreCase) ||
  102. methodName.StartsWith("Remove", StringComparison.OrdinalIgnoreCase))
  103. {
  104. return "DELETE";
  105. }
  106. if (methodName.StartsWith("Patch", StringComparison.OrdinalIgnoreCase))
  107. {
  108. return "PATCH";
  109. }
  110. if (methodName.StartsWith("Post", StringComparison.OrdinalIgnoreCase) ||
  111. methodName.StartsWith("Create", StringComparison.OrdinalIgnoreCase) ||
  112. methodName.StartsWith("Insert", StringComparison.OrdinalIgnoreCase))
  113. {
  114. return "POST";
  115. }
  116. //Default
  117. return DefaultHttpVerb;
  118. }
  119. }
  120. }