예제 #1
0
        /// <summary>
        /// Creates a scalar containing field
        /// </summary>
        /// <param name="name">The field name</param>
        /// <param name="type">The field type</param>
        /// <param name="flags">The field flags</param>
        /// <param name="arguments">
        /// The arguments (if is set - this field becomes a method)
        /// </param>
        /// <param name="description">
        /// The field description
        /// </param>
        /// <returns>The new field</returns>
        public static ApiField Scalar(
            [NotNull] string name,
            EnScalarType type,
            EnFieldFlags flags = EnFieldFlags.Queryable,
            IEnumerable <ApiField> arguments = null,
            string description = null)
        {
            if (type == EnScalarType.None)
            {
                throw new ArgumentException("Type cannot be None");
            }

            if (flags.HasFlag(EnFieldFlags.IsConnection))
            {
                throw new ArgumentException("Scalar field can't be used as connected objects");
            }

            return(new ApiField(name, flags)
            {
                ScalarType = type,
                Description = description,
                Arguments =
                    arguments != null
                                   ? new List <ApiField>(arguments)
                                   : new List <ApiField>()
            });
        }
예제 #2
0
 /// <summary>
 /// Initializes a new instance of the <see cref="MergedField"/> class.
 /// </summary>
 /// <param name="name">
 /// The field name.
 /// </param>
 /// <param name="type">
 /// The type.
 /// </param>
 /// <param name="provider">
 /// The api provider for the field
 /// </param>
 /// <param name="field">The original field description</param>
 /// <param name="flags">
 /// The flags.
 /// </param>
 /// <param name="arguments">
 /// The field arguments (in case the field is method).
 /// </param>
 /// <param name="description">
 /// The field description
 /// </param>
 public MergedField(
     string name,
     MergedType type,
     ApiProvider provider,
     ApiField field,
     EnFieldFlags flags = EnFieldFlags.None,
     IReadOnlyDictionary <string, MergedField> arguments = null,
     string description = null)
 {
     this.FieldName   = name;
     this.Type        = type;
     this.Flags       = flags;
     this.Arguments   = (arguments ?? new Dictionary <string, MergedField>()).ToImmutableDictionary();
     this.Description = description;
     this.AddProvider(provider, field);
 }
예제 #3
0
        /// <summary>
        /// Gets the generated arguments
        /// </summary>
        /// <returns>The list of arguments</returns>
        public static IEnumerable <ApiField> GetArguments()
        {
            if (FilterType.Fields.Count > 2)
            {
                yield return
                    (FilterType.CreateField(
                         "filter",
                         EnFieldFlags.CanBeUsedInInput | EnFieldFlags.Queryable | EnFieldFlags.IsTypeArgument));
            }

            if (SortType.Values.Any())
            {
                const EnFieldFlags SortFlags =
                    EnFieldFlags.CanBeUsedInInput | EnFieldFlags.Queryable | EnFieldFlags.IsTypeArgument
                    | EnFieldFlags.IsArray;
                yield return(ApiField.Object("sort", SortType.TypeName, SortFlags));
            }

            if (NodeMetaData.KeyProperty != null)
            {
                var keyMetadata = TypeMetadata.GenerateTypeMetadata(
                    NodeMetaData.KeyProperty.PropertyType,
                    NodeMetaData.KeyProperty.GetCustomAttribute <PublishToApiAttribute>());
                if (keyMetadata.ScalarType != EnScalarType.None)
                {
                    yield return
                        (ApiField.Scalar(
                             "id",
                             keyMetadata.ScalarType,
                             EnFieldFlags.CanBeUsedInInput | EnFieldFlags.Queryable | EnFieldFlags.IsTypeArgument));
                }
            }

            yield return
                (ApiField.Scalar(
                     "limit",
                     EnScalarType.Integer,
                     EnFieldFlags.CanBeUsedInInput | EnFieldFlags.Queryable | EnFieldFlags.IsTypeArgument));

            yield return
                (ApiField.Scalar(
                     "offset",
                     EnScalarType.Integer,
                     EnFieldFlags.CanBeUsedInInput | EnFieldFlags.Queryable | EnFieldFlags.IsTypeArgument));
        }
예제 #4
0
        /// <summary>
        /// Creates an object containing field
        /// </summary>
        /// <param name="name">
        /// The field name
        /// </param>
        /// <param name="typeName">
        /// The field type name
        /// </param>
        /// <param name="flags">
        /// The field flags
        /// </param>
        /// <param name="arguments">
        /// The arguments (if is set - this field becomes a method)
        /// </param>
        /// <param name="description">
        /// The field description
        /// </param>
        /// <returns>
        /// The new field
        /// </returns>
        public static ApiField Object(
            [NotNull] string name,
            [NotNull] string typeName,
            EnFieldFlags flags = EnFieldFlags.Queryable,
            IEnumerable <ApiField> arguments = null,
            string description = null)
        {
            if (flags.HasFlag(EnFieldFlags.IsKey))
            {
                throw new ArgumentException("Object field can't be used as key");
            }

            return(new ApiField(name, flags)
            {
                TypeName = typeName,
                ScalarType = EnScalarType.None,
                Description = description,
                Arguments =
                    arguments != null
                                   ? new List <ApiField>(arguments)
                                   : new List <ApiField>()
            });
        }
예제 #5
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ApiMutation"/> class.
 /// </summary>
 /// <param name="name">
 /// The name.
 /// </param>
 /// <param name="flags">
 /// The flags.
 /// </param>
 protected ApiMutation(string name, EnFieldFlags flags)
     : base(name, flags)
 {
 }
예제 #6
0
 /// <summary>
 /// Creates a field of this type
 /// </summary>
 /// <param name="name">The field name</param>
 /// <param name="flags">The list of field flags</param>
 /// <param name="description">The field description</param>
 /// <returns>The api filed</returns>
 public ApiField CreateField(string name, EnFieldFlags flags = EnFieldFlags.Queryable, string description = null)
 {
     return(ApiField.Object(name, this.TypeName, flags, description: description));
 }
예제 #7
0
        /// <summary>
        /// Creates virtual field
        /// </summary>
        /// <param name="name">
        /// The field name
        /// </param>
        /// <param name="type">
        /// The field type
        /// </param>
        /// <param name="resolver">
        /// The field resolver
        /// </param>
        /// <param name="flags">
        /// The field flags.
        /// </param>
        /// <returns>
        /// The field
        /// </returns>
        private FieldType CreateField(string name, MergedType type, IFieldResolver resolver = null, EnFieldFlags flags = EnFieldFlags.None)
        {
            var mergedField = new MergedField(name, type, this.Provider, null, flags);

            return(this.ConvertApiField(new KeyValuePair <string, MergedField>(name, mergedField), resolver));
        }
예제 #8
0
 /// <summary>
 /// Initializes a new instance of the <see cref="ApiField"/> class.
 /// </summary>
 /// <param name="name">
 /// The name.
 /// </param>
 /// <param name="flags">
 /// The flags.
 /// </param>
 protected ApiField(string name, EnFieldFlags flags)
 {
     this.Name  = name;
     this.Flags = flags;
 }