public void Build(FieldType contentQuery, ContentTypeDefinition contentTypeDefinition, ContentItemType contentItemType) { var serviceProvider = _httpContextAccessor.HttpContext.RequestServices; var contentFieldProviders = serviceProvider.GetServices <IContentFieldProvider>().ToList(); foreach (var part in contentTypeDefinition.Parts) { var partName = part.Name; // Check if another builder has already added a field for this part. if (contentItemType.HasField(partName)) { continue; } // This builder only handles parts with fields. if (!part.PartDefinition.Fields.Any()) { continue; } if (_contentOptions.ShouldSkip(part)) { continue; } if (_contentOptions.ShouldCollapse(part)) { foreach (var field in part.PartDefinition.Fields) { foreach (var fieldProvider in contentFieldProviders) { var fieldType = fieldProvider.GetField(field); if (fieldType != null) { if (_contentOptions.ShouldSkip(fieldType.Type, fieldType.Name)) { continue; } contentItemType.AddField(fieldType); break; } } } } else { var field = contentItemType.Field( typeof(DynamicPartGraphType), partName.ToFieldName(), description: T["Represents a {0}.", part.PartDefinition.Name], resolve: context => { var nameToResolve = partName; var typeToResolve = context.ReturnType.GetType().BaseType.GetGenericArguments().First(); return(context.Source.Get(typeToResolve, nameToResolve)); }); field.ResolvedType = new DynamicPartGraphType(_httpContextAccessor, part); } } }
public void Build(FieldType contentQuery, ContentTypeDefinition contentTypeDefinition, ContentItemType contentItemType) { var serviceProvider = _httpContextAccessor.HttpContext.RequestServices; var typeActivator = serviceProvider.GetService <ITypeActivatorFactory <ContentPart> >(); foreach (var part in contentTypeDefinition.Parts) { if (_contentOptions.ShouldSkip(part)) { continue; } var partName = part.Name; // Check if another builder has already added a field for this part. if (contentItemType.HasField(partName)) { continue; } var activator = typeActivator.GetTypeActivator(part.PartDefinition.Name); var queryGraphType = typeof(ObjectGraphType <>).MakeGenericType(activator.Type); var collapsePart = _contentOptions.ShouldCollapse(part); if (serviceProvider.GetService(queryGraphType) is IObjectGraphType queryGraphTypeResolved) { if (collapsePart) { foreach (var field in queryGraphTypeResolved.Fields) { if (_contentOptions.ShouldSkip(queryGraphType, field.Name)) { continue; } var rolledUpField = new FieldType { Name = field.Name, Type = field.Type, Description = field.Description, DeprecationReason = field.DeprecationReason, Arguments = field.Arguments, Resolver = new FuncFieldResolver <ContentItem, object>(context => { var nameToResolve = partName; var resolvedPart = context.Source.Get(activator.Type, nameToResolve); return(field.Resolver.Resolve(new ResolveFieldContext { Arguments = context.Arguments, Source = resolvedPart, FieldDefinition = field, UserContext = context.UserContext })); }) }; contentItemType.AddField(rolledUpField); } } else { contentItemType.Field( queryGraphTypeResolved.GetType(), partName.ToFieldName(), description: queryGraphTypeResolved.Description, resolve: context => { var nameToResolve = partName; var typeToResolve = context.ReturnType.GetType().BaseType.GetGenericArguments().First(); return(context.Source.Get(typeToResolve, nameToResolve)); }); } } var inputGraphType = typeof(InputObjectGraphType <>).MakeGenericType(activator.Type); if (serviceProvider.GetService(inputGraphType) is IInputObjectGraphType inputGraphTypeResolved) { var whereArgument = contentQuery.Arguments.FirstOrDefault(x => x.Name == "where"); if (whereArgument == null) { return; } var whereInput = (ContentItemWhereInput)whereArgument.ResolvedType; if (collapsePart) { foreach (var field in inputGraphTypeResolved.Fields) { whereInput.AddField(field.WithPartCollapsedMetaData().WithPartNameMetaData(partName)); } } else { whereInput.AddField(new FieldType { Type = inputGraphTypeResolved.GetType(), Name = partName.ToFieldName(), Description = inputGraphTypeResolved.Description }.WithPartNameMetaData(partName)); } } } }