Browse Source

Base class for query context

pull/131/head
Sebastian Stehle 9 years ago
parent
commit
a885475e0d
  1. 2
      src/Squidex.Domain.Apps.Read/Contents/GraphQL/CachingGraphQLService.cs
  2. 14
      src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLModel.cs
  3. 67
      src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLQueryContext.cs
  4. 8
      src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/ContentQueryGraphType.cs
  5. 54
      src/Squidex.Domain.Apps.Read/Contents/QueryContext.cs

2
src/Squidex.Domain.Apps.Read/Contents/GraphQL/CachingGraphQLService.cs

@ -84,7 +84,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
}
var modelContext = await GetModelAsync(app);
var queryContext = new QueryContext(app, assetRepository, contentQuery, urlGenerator, user);
var queryContext = new GraphQLQueryContext(app, assetRepository, contentQuery, user, urlGenerator);
return await modelContext.ExecuteAsync(queryContext, query);
}

14
src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLModel.cs

@ -104,7 +104,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
{
var resolver = new FuncFieldResolver<IAssetEntity, object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
return context.UrlGenerator.GenerateAssetUrl(app, c.Source);
});
@ -116,7 +116,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
{
var resolver = new FuncFieldResolver<IAssetEntity, object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
return context.UrlGenerator.GenerateAssetSourceUrl(app, c.Source);
});
@ -128,7 +128,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
{
var resolver = new FuncFieldResolver<IAssetEntity, object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
return context.UrlGenerator.GenerateAssetThumbnailUrl(app, c.Source);
});
@ -140,7 +140,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
{
var resolver = new FuncFieldResolver<IContentEntity, object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
return context.UrlGenerator.GenerateContentUrl(app, schema, c.Source);
});
@ -152,7 +152,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
{
var resolver = new FuncFieldResolver<ContentFieldData, object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
var contentIds = c.Source.GetOrDefault(c.FieldName);
return context.GetReferencedAssetsAsync(contentIds);
@ -173,7 +173,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
var resolver = new FuncFieldResolver<ContentFieldData, object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
var contentIds = c.Source.GetOrDefault(c.FieldName);
return context.GetReferencedContentsAsync(schemaId, contentIds);
@ -184,7 +184,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
return (schemaFieldType, resolver);
}
public async Task<(object Data, object[] Errors)> ExecuteAsync(QueryContext context, GraphQLQuery query)
public async Task<(object Data, object[] Errors)> ExecuteAsync(GraphQLQueryContext context, GraphQLQuery query)
{
Guard.NotNull(context, nameof(context));

67
src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLQueryContext.cs

@ -0,0 +1,67 @@
// ==========================================================================
// GraphQLQueryContext.cs
// Squidex Headless CMS
// ==========================================================================
// Copyright (c) Squidex Group
// All rights reserved.
// ==========================================================================
using System;
using System.Collections.Generic;
using System.Security.Claims;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Read.Apps;
using Squidex.Domain.Apps.Read.Assets;
using Squidex.Domain.Apps.Read.Assets.Repositories;
namespace Squidex.Domain.Apps.Read.Contents.GraphQL
{
public sealed class GraphQLQueryContext : QueryContext
{
public IGraphQLUrlGenerator UrlGenerator { get; }
public GraphQLQueryContext(IAppEntity app, IAssetRepository assetRepository, IContentQueryService contentQuery, ClaimsPrincipal user,
IGraphQLUrlGenerator urlGenerator)
: base(app, assetRepository, contentQuery, user)
{
UrlGenerator = urlGenerator;
}
public Task<IReadOnlyList<IAssetEntity>> GetReferencedAssetsAsync(JToken value)
{
var ids = ParseIds(value);
return GetReferencedAssetsAsync(ids);
}
public Task<IReadOnlyList<IContentEntity>> GetReferencedContentsAsync(Guid schemaId, JToken value)
{
var ids = ParseIds(value);
return GetReferencedContentsAsync(schemaId, ids);
}
private static ICollection<Guid> ParseIds(JToken value)
{
try
{
var result = new List<Guid>();
if (value is JArray)
{
foreach (var id in value)
{
result.Add(Guid.Parse(id.ToString()));
}
}
return result;
}
catch
{
return new List<Guid>();
}
}
}
}

8
src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/ContentQueryGraphType.cs

@ -52,7 +52,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL.Types
ResolvedType = graphQLContext.GetAssetType(),
Resolver = new FuncFieldResolver<object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
var contentId = Guid.Parse(c.GetArgument("id", Guid.Empty.ToString()));
return context.FindAssetAsync(contentId);
@ -78,7 +78,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL.Types
ResolvedType = schemaType,
Resolver = new FuncFieldResolver<object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
var contentId = Guid.Parse(c.GetArgument("id", Guid.Empty.ToString()));
return context.FindContentAsync(schema.Id, contentId);
@ -116,7 +116,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL.Types
ResolvedType = new ListGraphType(new NonNullGraphType(graphQLContext.GetAssetType())),
Resolver = new FuncFieldResolver<object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
var argTop = c.GetArgument("top", 20);
var argSkip = c.GetArgument("skip", 0);
@ -169,7 +169,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL.Types
ResolvedType = new ListGraphType(new NonNullGraphType(schemaType)),
Resolver = new FuncFieldResolver<object>(c =>
{
var context = (QueryContext)c.UserContext;
var context = (GraphQLQueryContext)c.UserContext;
var contentQuery = BuildODataQuery(c);
return context.QueryContentsAsync(schema.Id, contentQuery);

54
src/Squidex.Domain.Apps.Read/Contents/GraphQL/QueryContext.cs → src/Squidex.Domain.Apps.Read/Contents/QueryContext.cs

@ -12,45 +12,35 @@ using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Threading.Tasks;
using Newtonsoft.Json.Linq;
using Squidex.Domain.Apps.Read.Apps;
using Squidex.Domain.Apps.Read.Assets;
using Squidex.Domain.Apps.Read.Assets.Repositories;
using Squidex.Infrastructure;
namespace Squidex.Domain.Apps.Read.Contents.GraphQL
namespace Squidex.Domain.Apps.Read.Contents
{
public sealed class QueryContext
public class QueryContext
{
private readonly ConcurrentDictionary<Guid, IContentEntity> cachedContents = new ConcurrentDictionary<Guid, IContentEntity>();
private readonly ConcurrentDictionary<Guid, IAssetEntity> cachedAssets = new ConcurrentDictionary<Guid, IAssetEntity>();
private readonly IContentQueryService contentQuery;
private readonly IAssetRepository assetRepository;
private readonly IGraphQLUrlGenerator urlGenerator;
private readonly IAppEntity app;
private readonly ClaimsPrincipal user;
public IGraphQLUrlGenerator UrlGenerator
{
get { return urlGenerator; }
}
public QueryContext(
IAppEntity app,
IAssetRepository assetRepository,
IContentQueryService contentQuery,
IGraphQLUrlGenerator urlGenerator,
ClaimsPrincipal user)
{
Guard.NotNull(assetRepository, nameof(assetRepository));
Guard.NotNull(urlGenerator, nameof(urlGenerator));
Guard.NotNull(contentQuery, nameof(contentQuery));
Guard.NotNull(app, nameof(app));
Guard.NotNull(user, nameof(user));
this.assetRepository = assetRepository;
this.contentQuery = contentQuery;
this.urlGenerator = urlGenerator;
this.user = user;
@ -103,9 +93,9 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
return assets;
}
public async Task<IReadOnlyList<IContentEntity>> QueryContentsAsync(Guid schemaId, string query)
public async Task<IReadOnlyList<IContentEntity>> QueryContentsAsync(string schemaIdOrName, string query)
{
var contents = (await contentQuery.QueryWithCountAsync(app, schemaId.ToString(), user, false, query).ConfigureAwait(false)).Items;
var contents = (await contentQuery.QueryWithCountAsync(app, schemaIdOrName, user, false, query).ConfigureAwait(false)).Items;
foreach (var content in contents)
{
@ -115,13 +105,6 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
return contents;
}
public Task<IReadOnlyList<IAssetEntity>> GetReferencedAssetsAsync(JToken value)
{
var ids = ParseIds(value);
return GetReferencedAssetsAsync(ids);
}
public async Task<IReadOnlyList<IAssetEntity>> GetReferencedAssetsAsync(ICollection<Guid> ids)
{
Guard.NotNull(ids, nameof(ids));
@ -141,13 +124,6 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
return ids.Select(id => cachedAssets.GetOrDefault(id)).Where(x => x != null).ToList();
}
public Task<IReadOnlyList<IContentEntity>> GetReferencedContentsAsync(Guid schemaId, JToken value)
{
var ids = ParseIds(value);
return GetReferencedContentsAsync(schemaId, ids);
}
public async Task<IReadOnlyList<IContentEntity>> GetReferencedContentsAsync(Guid schemaId, ICollection<Guid> ids)
{
Guard.NotNull(ids, nameof(ids));
@ -166,27 +142,5 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL
return ids.Select(id => cachedContents.GetOrDefault(id)).Where(x => x != null).ToList();
}
private static ICollection<Guid> ParseIds(JToken value)
{
try
{
var result = new List<Guid>();
if (value is JArray)
{
foreach (var id in value)
{
result.Add(Guid.Parse(id.ToString()));
}
}
return result;
}
catch
{
return new List<Guid>();
}
}
}
}
Loading…
Cancel
Save