Skip to content
This repository has been archived by the owner on Jul 18, 2023. It is now read-only.

Commit

Permalink
Added support for passing query parameters in separate POST parameter…
Browse files Browse the repository at this point in the history
… instead of string manipulation. Closes #8
  • Loading branch information
Giorgi committed Mar 20, 2017
1 parent b052bd0 commit 185d5f9
Showing 1 changed file with 44 additions and 21 deletions.
65 changes: 44 additions & 21 deletions GraphQLinq/GraphQuery.cs
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,9 @@
using System.Linq.Expressions;
using System.Net;
using System.Reflection;

using Newtonsoft.Json;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;

namespace GraphQLinq
Expand Down Expand Up @@ -133,7 +136,7 @@ private static bool TryParsePath(Expression expression, out string path)

class GraphQueryBuilder<T>
{
private const string QueryTemplate = @"{{ {0}: {1} {2} {{ {3} }}}}";
private const string QueryTemplate = @"query {0} {{ {1}: {2} {3} {{ {4} }}}}";
internal const string ItemAlias = "item";
internal const string ResultAlias = "result";

Expand Down Expand Up @@ -197,29 +200,18 @@ public string BuildQuery(GraphQuery<T> graphQuery, List<string> includes)

selectClause = Environment.NewLine + selectClause + Environment.NewLine;

//(type: [STANDARD_CHARGER, STORE], openSoon: true)
var argList = graphQuery.Arguments.Where(pair => pair.Value != null).Select(pair =>
{
var value = pair.Value.ToString();
var passedArguments = graphQuery.Arguments.Where(pair => pair.Value != null).ToList();

if (pair.Value is bool)
{
value = value.ToLowerInvariant();
}

var enumerable = pair.Value as IEnumerable;
if (enumerable != null)
{
value = $"[{string.Join(", ", enumerable.Cast<object>())}]";
}
var queryParameters = passedArguments.Any() ? $"({string.Join(", ", passedArguments.Select(pair => $"{pair.Key}: ${pair.Key}"))})" : "";
var queryParameterTypes = passedArguments.Any() ? $"({string.Join(", ", passedArguments.Select(pair => $"${pair.Key}: {pair.Value.GetType().ToGraphQlType()}"))})" : "";

return $"{pair.Key}: {value}";
});
var queryVariables = passedArguments.ToDictionary(pair => pair.Key, pair => pair.Value);
var graphQLQuery = string.Format(QueryTemplate, queryParameterTypes, ResultAlias, graphQuery.QueryName.ToLower(), queryParameters, selectClause);

var args = string.Join(", ", argList);
var argsWithParentheses = string.IsNullOrEmpty(args) ? "" : $"({args})";
var dictionary = new Dictionary<string, object> { { "query", graphQLQuery }, { "variables", queryVariables } };

return string.Format(QueryTemplate, ResultAlias, graphQuery.QueryName.ToLower(), argsWithParentheses, selectClause);
var json = JsonConvert.SerializeObject(dictionary, new StringEnumConverter());
return json;
}

private static string BuildSelectClauseForType(Type targetType, int depth = 1)
Expand Down Expand Up @@ -314,7 +306,7 @@ private IEnumerable<T> DownloadData()

using (var webClient = new WebClient { Proxy = defaultWebProxy })
{
webClient.Headers.Add(HttpRequestHeader.ContentType, "application/graphql");
webClient.Headers.Add(HttpRequestHeader.ContentType, "application/json");

if (!string.IsNullOrEmpty(authorization))
{
Expand Down Expand Up @@ -399,5 +391,36 @@ internal static string ToCamelCase(this string input)
}
return input.Substring(0, 1).ToLower() + input.Substring(1);
}

internal static string ToGraphQlType(this Type type)
{
if (type == typeof(bool))
{
return "Boolean";
}

if (type == typeof(int))
{
return "Int";
}

if (type == typeof(string))
{
return "String";
}

if (type == typeof(float))
{
return "Float";
}

if (type.IsList())
{
var listType = type.GetTypeOrListType();
return "[" + ToGraphQlType(listType) + "]";
}

return type.Name;
}
}
}

0 comments on commit 185d5f9

Please sign in to comment.