Skip to content
This repository has been archived by the owner on May 25, 2019. It is now read-only.

Commit

Permalink
#8 integrated with paging
Browse files Browse the repository at this point in the history
  • Loading branch information
thangchung committed Jan 5, 2018
1 parent b705e2d commit 017435c
Show file tree
Hide file tree
Showing 11 changed files with 155 additions and 136 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

<ItemGroup>
<PackageReference Include="GraphQL" Version="0.17.3" />
<PackageReference Include="System.Linq.Dynamic.Core" Version="1.0.8.1" />
</ItemGroup>

<ItemGroup>
Expand Down
18 changes: 18 additions & 0 deletions src/modules/crm/CRMCore.Module.GraphQL/DbContextExtensions.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Reflection;

namespace CRMCore.Module.GraphQL
{
public static class DbContextExtensions
{
public static IQueryable Query(this DbContext context, string entityName) =>
context.Query(context.Model.FindEntityType(entityName).ClrType);

static readonly MethodInfo SetMethod = typeof(DbContext).GetMethod(nameof(DbContext.Set));

public static IQueryable Query(this DbContext context, Type entityType) =>
(IQueryable)SetMethod.MakeGenericMethod(entityType).Invoke(context, null);
}
}
17 changes: 15 additions & 2 deletions src/modules/crm/CRMCore.Module.GraphQL/GraphQLController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -17,8 +17,16 @@ public GraphQLController(Schema schema)
graphQLSchema = schema;
}

[HttpPost("")]
public async Task<string> Get([FromQuery] string query = "{ crm_Tasks_list { id } }")
/// <summary>
/// Try as following
/// { crm_Tasks_list(offset:1, first:10) { name } }
/// { crm_Tasks_list { name } }
/// { crm_Tasks(id: "5BEF390D-5B71-4DBA-853A-00E164D4EA93") { name } }
/// </summary>
/// <param name="query"></param>
/// <returns></returns>
[HttpPost]
public async Task<string> Get([FromQuery] string query = "{ crm_Tasks_list(offset:1, first:10) { id, name } }")
{
var result = await new DocumentExecuter().ExecuteAsync(
new ExecutionOptions()
Expand All @@ -28,6 +36,11 @@ public async Task<string> Get([FromQuery] string query = "{ crm_Tasks_list { id
}
).ConfigureAwait(false);

if (result.Errors?.Count > 0)
{
return result.Errors.ToString();
}

var json = new DocumentWriter(indent: true).Write(result.Data);
return json;
}
Expand Down
73 changes: 10 additions & 63 deletions src/modules/crm/CRMCore.Module.GraphQL/GraphQLQuery.cs
Original file line number Diff line number Diff line change
@@ -1,19 +1,16 @@
using CRMCore.Module.Data;
using CRMCore.Module.GraphQL.Models;
using GraphQL.Resolvers;
using CRMCore.Module.GraphQL.Models;
using CRMCore.Module.GraphQL.Resolvers;
using GraphQL.Types;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;

namespace CRMCore.Module.GraphQL
{
public class GraphQLQuery : ObjectGraphType<object>
{
private IDatabaseMetadata _dbMetadata;
private ApplicationDbContext _dbContext;
private DbContext _dbContext;

public GraphQLQuery(ApplicationDbContext dbContext, IDatabaseMetadata dbMetadata)
public GraphQLQuery(DbContext dbContext, IDatabaseMetadata dbMetadata)
{
_dbMetadata = dbMetadata;
_dbContext = dbContext;
Expand All @@ -23,7 +20,7 @@ public GraphQLQuery(ApplicationDbContext dbContext, IDatabaseMetadata dbMetadata
foreach (var metaTable in _dbMetadata.GetMetadataTables())
{
var tableType = new TableType(metaTable);
/*AddField(new FieldType()
AddField(new FieldType
{
Name = metaTable.TableName,
Type = tableType.GetType(),
Expand All @@ -32,71 +29,21 @@ public GraphQLQuery(ApplicationDbContext dbContext, IDatabaseMetadata dbMetadata
Arguments = new QueryArguments(
tableType.TableArgs
)
});*/
});

//lets add key to get list of current table
// lets add key to get list of current table
var listType = new ListGraphType(tableType);
AddField(new FieldType
{
Name = $"{metaTable.TableName}_list",
Type = listType.GetType(),
ResolvedType = listType,
Resolver = new MyFieldResolver(metaTable, _dbContext),
/*Arguments = new QueryArguments(
tableType.TableArgs
) */
Arguments = new QueryArguments(
tableType.TableArgs
)
});
}
}
}

public class MyFieldResolver : IFieldResolver
{
private TableMetadata _tableMetadata;
private ApplicationDbContext _dbContext;

public MyFieldResolver(TableMetadata tableMetadata, ApplicationDbContext dbContext)
{
_tableMetadata = tableMetadata;
_dbContext = dbContext;
}

public object Resolve(ResolveFieldContext context)
{
var source = context.Source;

List<Dictionary<string, object>> finalResult = new List<Dictionary<string, object>>();
if (context.FieldName.Contains("_list"))
{

using (var command = _dbContext.Database.GetDbConnection().CreateCommand())
{
command.CommandText = "SELECT * FROM " + _tableMetadata.TableName;
_dbContext.Database.OpenConnection();
using (var result = command.ExecuteReader())
{
while (result.Read())
{
var temp = new Dictionary<string, object>();

for (var index = 0; index < result.FieldCount; index++)
{
var lowerCase = Char.ToLowerInvariant(result.GetName(index)[0]) + result.GetName(index).Substring(1);
temp.Add(lowerCase, result[result.GetName(index)]);
}

finalResult.Add(temp);
}
}

if (_dbContext.Database.GetDbConnection().State == System.Data.ConnectionState.Open)
{
_dbContext.Database.CloseConnection();
}
}
}

return finalResult;
}
}
}
12 changes: 1 addition & 11 deletions src/modules/crm/CRMCore.Module.GraphQL/Models/ColumnMetadata.cs
Original file line number Diff line number Diff line change
@@ -1,25 +1,15 @@
using System.ComponentModel.DataAnnotations.Schema;

namespace CRMCore.Module.GraphQL.Models
namespace CRMCore.Module.GraphQL.Models
{
public class ColumnMetadata
{
[Column("name")]
public string ColumnName
{
get; set;
}

[Column("type")]
public string DataType
{
get; set;
}

[Column("notnull")]
public string IsNullable
{
get; set;
}
}
}
21 changes: 4 additions & 17 deletions src/modules/crm/CRMCore.Module.GraphQL/Models/DatabaseMetadata.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
using CRMCore.Module.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Metadata;
using System.Collections.Generic;
using System.Linq;
Expand All @@ -8,9 +7,9 @@ namespace CRMCore.Module.GraphQL.Models
{
public class DatabaseMetadata : IDatabaseMetadata
{
protected ApplicationDbContext _dbContext;
protected DbContext _dbContext;

public DatabaseMetadata(ApplicationDbContext dbContext)
public DatabaseMetadata(DbContext dbContext)
{
_dbContext = dbContext;
DatabaseName = _dbContext.Database.GetDbConnection().Database;
Expand All @@ -37,22 +36,9 @@ public IEnumerable<TableMetadata> GetMetadataTables()

private void LoadMetaData()
{
// var res = new List<TableMetadata>();
/*res.Add(
FetchTableMetaData("Customers")
);*/

Tables = FetchTableMetaData();
}

/*public List<TableMetadata> GetMetadataTables()
{
if (Tables == null)
return new List<TableMetadata>();
return Tables;
} */

private List<TableMetadata> FetchTableMetaData()
{
var metaTables = new List<TableMetadata>();
Expand All @@ -63,6 +49,7 @@ private List<TableMetadata> FetchTableMetaData()
var tableName = relational.TableName;

metaTable.TableName = tableName;
metaTable.AssemblyFullName = entityType.ClrType.FullName;
metaTable.Columns = GetColumnsMetadata(entityType).ToList();

metaTables.Add(metaTable);
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;
using System.Collections.Generic;

namespace CRMCore.Module.GraphQL.Models
{
public class TableMetadata
{
[Column("table_name")]
public string TableName { get; set; }

public string AssemblyFullName { get; set; }

public List<ColumnMetadata> Columns { get; set; }
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
using CRMCore.Module.GraphQL.Models;
using GraphQL.Resolvers;
using GraphQL.Types;
using Microsoft.EntityFrameworkCore;
using System;
using System.Linq;
using System.Linq.Dynamic.Core;

namespace CRMCore.Module.GraphQL.Resolvers
{
public class MyFieldResolver : IFieldResolver
{
private TableMetadata _tableMetadata;
private DbContext _dbContext;

public MyFieldResolver(TableMetadata tableMetadata, DbContext dbContext)
{
_tableMetadata = tableMetadata;
_dbContext = dbContext;
}

public object Resolve(ResolveFieldContext context)
{
var queryable = _dbContext.Query(_tableMetadata.FullQualifiedName);
if (context.FieldName.Contains("_list"))
{

var first = context.Arguments["first"] != null ?
context.GetArgument("first", int.MaxValue) :
int.MaxValue;

var offset = context.Arguments["offset"] != null ?
context.GetArgument("offset", 0) :
0;

return queryable
.Skip(offset)
.Take(first)
.ToDynamicList<object>();
}
else
{
var id = context.GetArgument<Guid>("id");
return queryable.FirstOrDefault($"Id == @0", id);
}
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
using GraphQL.Resolvers;
using GraphQL.Types;
using System;

namespace CRMCore.Module.GraphQL.Resolvers
{
public class NameFieldResolver : IFieldResolver
{
public object Resolve(ResolveFieldContext context)
{
var source = context.Source;

if (source == null)
{
return null;
}

var name = Char.ToUpperInvariant(context.FieldAst.Name[0]) + context.FieldAst.Name.Substring(1);
var value = GetPropValue(source, name);

if (value == null)
{
throw new InvalidOperationException($"Expected to find property {context.FieldAst.Name} on {context.Source.GetType().Name} but it does not exist.");
}

return value;
}

private static object GetPropValue(object src, string propName)
{
return src.GetType().GetProperty(propName).GetValue(src, null);
}
}
}
Loading

0 comments on commit 017435c

Please sign in to comment.