/// <summary> /// Returns the latest version of the Vndb API that VndbSharp supports. /// This returns a Version object with fields for the API Date, and the completion status of VndbSharp toward that API version /// If the completion status is incomplete, there may be features from the Vndb API that have not been implemented yet. /// </summary> /// <returns></returns> public static Models.ApiVersionInfo GetApiVersion() { var version = new ApiVersionInfo() { ApiVersion = ApiVer, ApiStatus = ApiStatus }; return(version); }
protected override async Task <HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { var _swaggerstore = IocManager.Instance.Resolve <ISwaggerStore>(); var setting = Its.Configuration.Settings.Get <Config.SwaggerToolSettings>(); //using refletions to internal var swaggerProvider = (ISwaggerProvider) _config.GetType() .GetMethod("GetSwaggerProvider", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) .Invoke(_config, new object[] { request }); var rootUrl = (string) _config.GetType() .GetMethod("GetRootUrl", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic) .Invoke(_config, new object[] { request }); var apiVersion = request.GetRouteData().Values["apiVersion"].ToString(); try { var swaggerDoc = swaggerProvider.GetSwagger(rootUrl, apiVersion); var last = _swaggerstore.GetLastVersion(); ApiVersionInfo info = new ApiVersionInfo(); info.GenDateTime = DateTime.Now.ToString(); info.SwaggerDoc = JsonConvert.SerializeObject(swaggerDoc, Formatting.Indented, new JsonSerializerSettings() { NullValueHandling = NullValueHandling.Ignore, Converters = new[] { new VendorExtensionsConverter() } }); var md5 = MD5.Create(); using (var stream = new MemoryStream(Encoding.UTF8.GetBytes(info.SwaggerDoc))) { info.md5 = BitConverter.ToString(md5.ComputeHash(stream)).Replace("-", ""); } if (last != null) { SwaggerDiff diff = new SwaggerDiff(); var re = await diff.Diff(info.SwaggerDoc, last.SwaggerDoc); //info.BackwardsCompatible = re.Item2; info.ChangeLogs = FormatChangelogDesc(re); } _swaggerstore.ImportNewVersion(info); var content = new StringContent(_swaggerstore.GetChangeLogInfo()); return(new HttpResponseMessage { Content = content }); } catch (UnknownApiVersion ex) { return(request.CreateErrorResponse(HttpStatusCode.NotFound, ex)); } }
public virtual IDisposable Change(ApiVersionInfo apiVersionInfo) { var parent = ApiVersionInfo; _currentApiVersionInfo.Value = apiVersionInfo; return(new DisposeAction(() => { _currentApiVersionInfo.Value = parent; })); }
public void ImportNewVersion(ApiVersionInfo newswaggerdoc) { var last = GetLastVersion(); if (last == null || last.md5 != newswaggerdoc.md5) { File.WriteAllText(basepath + "/" + filefolder + "/swagger" + newswaggerdoc.md5 + ".json", JsonConvert.SerializeObject(newswaggerdoc)); //Append new changelogs string changelog = newswaggerdoc.GenDateTime.ToString() + "\r\n" + newswaggerdoc.ChangeLogs + "\r\n"; File.AppendAllText(basepath + "/" + filefolder + "/changelogs.json", changelog); } }
public virtual async Task <HttpContent> BuildContentAsync(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, IJsonSerializer jsonSerializer, ApiVersionInfo apiVersion) { var body = await GenerateBodyAsync(action, methodArguments, jsonSerializer); if (body != null) { return(body); } body = await GenerateFormPostDataAsync(action, methodArguments); return(body); }
protected virtual Task ReplacePathVariablesAsync(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var pathParameters = actionParameters .Where(p => p.BindingSourceId == ParameterBindingSources.Path) .ToArray(); if (!pathParameters.Any()) { return(Task.CompletedTask); } if (pathParameters.Any(p => p.Name == "apiVersion")) { urlBuilder = urlBuilder.Replace("{apiVersion}", apiVersion.Version); } foreach (var pathParameter in pathParameters.Where(p => p.Name != "apiVersion")) //TODO: Constant! { var value = HttpActionParameterHelper.FindParameterValue(methodArguments, pathParameter); if (value == null) { if (pathParameter.IsOptional) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", ""); } else if (pathParameter.DefaultValue != null) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", pathParameter.DefaultValue.ToString()); } else { throw new AbpException($"Missing path parameter value for {pathParameter.Name} ({pathParameter.NameOnMethod})"); } } else { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", value.ToString()); } } return(Task.CompletedTask); }
public async Task <string> GenerateUrlWithParametersAsync(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { // The ASP.NET Core route value provider and query string value provider: // Treat values as invariant culture. // Expect that URLs are culture-invariant. using (CultureHelper.Use(CultureInfo.InvariantCulture)) { var urlBuilder = new StringBuilder(action.Url); await ReplacePathVariablesAsync(urlBuilder, action.Parameters, methodArguments, apiVersion); await AddQueryStringParametersAsync(urlBuilder, action.Parameters, methodArguments, apiVersion); return(urlBuilder.ToString()); } }
protected virtual async Task AddQueryStringParametersAsync(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var queryStringParameters = actionParameters .Where(p => p.BindingSourceId.IsIn(ParameterBindingSources.ModelBinding, ParameterBindingSources.Query)) .ToArray(); var isFirstParam = true; foreach (var queryStringParameter in queryStringParameters) { var value = HttpActionParameterHelper.FindParameterValue(methodArguments, queryStringParameter); if (value == null) { continue; } if (HttpClientProxyingOptions.QueryStringConverts.ContainsKey(value.GetType())) { using (var scope = ServiceScopeFactory.CreateScope()) { var queryString = await(Task <string>) CallObjectToQueryStringAsyncMethod .MakeGenericMethod(value.GetType()) .Invoke(this, new object[] { scope.ServiceProvider.GetRequiredService(HttpClientProxyingOptions.QueryStringConverts[value.GetType()]), value }); if (queryString != null) { urlBuilder.Append(isFirstParam ? "?" : "&"); urlBuilder.Append(queryString); isFirstParam = false; continue; } } } if (await AddQueryStringParameterAsync(urlBuilder, isFirstParam, queryStringParameter.Name, value)) { isFirstParam = false; } } if (apiVersion.ShouldSendInQueryString()) { await AddQueryStringParameterAsync(urlBuilder, isFirstParam, "api-version", apiVersion.Version); //TODO: Constant! } }
protected virtual async Task ReplacePathVariablesAsync(StringBuilder urlBuilder, ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var pathParameters = action.Parameters .Where(p => p.BindingSourceId == ParameterBindingSources.Path) .ToArray(); if (!pathParameters.Any()) { return; } if (pathParameters.Any(p => p.Name == "apiVersion")) { urlBuilder = urlBuilder.Replace("{apiVersion}", apiVersion.Version); } foreach (var pathParameter in pathParameters.Where(p => p.Name != "apiVersion")) //TODO: Constant! { var value = HttpActionParameterHelper.FindParameterValue(methodArguments, pathParameter); if (value == null) { if (pathParameter.IsOptional) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", ""); } else if (pathParameter.DefaultValue != null) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", await ConvertValueToStringAsync(pathParameter.DefaultValue)); } else { throw new AbpException($"Missing path parameter value for {pathParameter.Name} ({pathParameter.NameOnMethod})"); } } else { if (HttpClientProxyingOptions.PathConverts.ContainsKey(value.GetType())) { using (var scope = ServiceScopeFactory.CreateScope()) { var path = await(Task <string>) CallObjectToPathAsyncMethod .MakeGenericMethod(value.GetType()) .Invoke(this, new object[] { scope.ServiceProvider.GetRequiredService(HttpClientProxyingOptions.PathConverts[value.GetType()]), action, pathParameter, value }); if (path != null) { urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", path); continue; } } } urlBuilder = urlBuilder.Replace($"{{{pathParameter.Name}}}", await ConvertValueToStringAsync(value)); } } }
private static void AddQueryStringParameters(StringBuilder urlBuilder, IList <ParameterApiDescriptionModel> actionParameters, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var queryStringParameters = actionParameters .Where(p => p.BindingSourceId.IsIn(ParameterBindingSources.ModelBinding, ParameterBindingSources.Query)) .ToArray(); var isFirstParam = true; foreach (var queryStringParameter in queryStringParameters) { var value = HttpActionParameterHelper.FindParameterValue(methodArguments, queryStringParameter); if (value == null) { continue; } if (AddQueryStringParameter(urlBuilder, isFirstParam, queryStringParameter.Name, value)) { isFirstParam = false; } } if (apiVersion.ShouldSendInQueryString()) { AddQueryStringParameter(urlBuilder, isFirstParam, "api-version", apiVersion.Version); //TODO: Constant! } }
public static string GenerateUrlWithParameters(ActionApiDescriptionModel action, IReadOnlyDictionary <string, object> methodArguments, ApiVersionInfo apiVersion) { var urlBuilder = new StringBuilder(action.Url); ReplacePathVariables(urlBuilder, action.Parameters, methodArguments, apiVersion); AddQueryStringParameters(urlBuilder, action.Parameters, methodArguments, apiVersion); return(urlBuilder.ToString()); }