From a885475e0db90a34d337b8f2702bdc7506f39ba4 Mon Sep 17 00:00:00 2001 From: Sebastian Stehle Date: Tue, 3 Oct 2017 18:20:16 +0200 Subject: [PATCH] Base class for query context --- .../Contents/GraphQL/CachingGraphQLService.cs | 2 +- .../Contents/GraphQL/GraphQLModel.cs | 14 ++-- .../Contents/GraphQL/GraphQLQueryContext.cs | 67 +++++++++++++++++++ .../GraphQL/Types/ContentQueryGraphType.cs | 8 +-- .../Contents/{GraphQL => }/QueryContext.cs | 54 ++------------- 5 files changed, 83 insertions(+), 62 deletions(-) create mode 100644 src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLQueryContext.cs rename src/Squidex.Domain.Apps.Read/Contents/{GraphQL => }/QueryContext.cs (76%) diff --git a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/CachingGraphQLService.cs b/src/Squidex.Domain.Apps.Read/Contents/GraphQL/CachingGraphQLService.cs index 2c43a4c79..cfabcb279 100644 --- a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/CachingGraphQLService.cs +++ b/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); } diff --git a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLModel.cs b/src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLModel.cs index d41b4f456..6afac5493 100644 --- a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLModel.cs +++ b/src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLModel.cs @@ -104,7 +104,7 @@ namespace Squidex.Domain.Apps.Read.Contents.GraphQL { var resolver = new FuncFieldResolver(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(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(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(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(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(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)); diff --git a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLQueryContext.cs b/src/Squidex.Domain.Apps.Read/Contents/GraphQL/GraphQLQueryContext.cs new file mode 100644 index 000000000..e1abc0316 --- /dev/null +++ b/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> GetReferencedAssetsAsync(JToken value) + { + var ids = ParseIds(value); + + return GetReferencedAssetsAsync(ids); + } + + public Task> GetReferencedContentsAsync(Guid schemaId, JToken value) + { + var ids = ParseIds(value); + + return GetReferencedContentsAsync(schemaId, ids); + } + + private static ICollection ParseIds(JToken value) + { + try + { + var result = new List(); + + if (value is JArray) + { + foreach (var id in value) + { + result.Add(Guid.Parse(id.ToString())); + } + } + + return result; + } + catch + { + return new List(); + } + } + } +} diff --git a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/ContentQueryGraphType.cs b/src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/ContentQueryGraphType.cs index ba45dffd5..b732d9c9b 100644 --- a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/Types/ContentQueryGraphType.cs +++ b/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(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(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(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(c => { - var context = (QueryContext)c.UserContext; + var context = (GraphQLQueryContext)c.UserContext; var contentQuery = BuildODataQuery(c); return context.QueryContentsAsync(schema.Id, contentQuery); diff --git a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/QueryContext.cs b/src/Squidex.Domain.Apps.Read/Contents/QueryContext.cs similarity index 76% rename from src/Squidex.Domain.Apps.Read/Contents/GraphQL/QueryContext.cs rename to src/Squidex.Domain.Apps.Read/Contents/QueryContext.cs index f1e5f29c1..81cc281a7 100644 --- a/src/Squidex.Domain.Apps.Read/Contents/GraphQL/QueryContext.cs +++ b/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 cachedContents = new ConcurrentDictionary(); private readonly ConcurrentDictionary cachedAssets = new ConcurrentDictionary(); 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> QueryContentsAsync(Guid schemaId, string query) + public async Task> 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> GetReferencedAssetsAsync(JToken value) - { - var ids = ParseIds(value); - - return GetReferencedAssetsAsync(ids); - } - public async Task> GetReferencedAssetsAsync(ICollection 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> GetReferencedContentsAsync(Guid schemaId, JToken value) - { - var ids = ParseIds(value); - - return GetReferencedContentsAsync(schemaId, ids); - } - public async Task> GetReferencedContentsAsync(Guid schemaId, ICollection 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 ParseIds(JToken value) - { - try - { - var result = new List(); - - if (value is JArray) - { - foreach (var id in value) - { - result.Add(Guid.Parse(id.ToString())); - } - } - - return result; - } - catch - { - return new List(); - } - } } }