# InputType

Un InputType correspond à la déclaration: input avec GraphQL (en SDL)

@InputType()
class User {
  @Field()
  email: string;

  @Field()
  username: string;
}

Donnera en SDL:

input User {
  email: String
  username: String
}

# Paramètres

@InputType a plusieurs signatures disponibles permettant de paramétrer votre objet:

# name

Indique le nom du type compilé en SDL.

# params

Un objet acceptant plusieurs paramètres:

Propriété description type
hidden La classe ne sera pas compilée et n'apparaîtra pas dans le schéma (utile pour les types génériques), une classe abstraite est en principe hidden boolean
nullable Tous les champs du type seront nullable boolean
required Tous les champs du type seront requis boolean
description La description du type string
extensions Les extensions (métadonnées) du type any
directives Les directives du type {name: string, args: KeyValue}[]
extends Appliquer l'héritage de façon forcé (ClassType | ObjectType | InterfaceType | InputType)[] (Une class ou un type déclaré avec graphql-composer)[]

# @InputField

Le décorateur @InputField va indiquer les paramètres du champ seulement pour @InputType.

Ceci est utile lorsque vous utiliser une class en tant que que plusieurs types GraphQL (type, input ou/et interface), en la décorant simultanément de @ObjectType et @InputType par exemple.

Car @Field paramètre le champ pour tous les types GraphQL dont la class est décorée.

@InputField override les paramètres de @Field.

@ObjectType()
@InputType("UserInput")
class User {
  @Field(type => R(String))
  @ObjectField()
  username: string;

  @InputField(type => R(String))
  @ObjectField()
  name: string;

  @Field()
  email: string;

  @InputField()
  password: string;
}

Donnera en SDL:

type User {
  username: String;
  name: String;
  email: String;
}

input UserInput {
  username: String!;
  name: String!;
  email: String;
  password: String;
}

# Utilisation avec @Args (et @Arg)

Il y'a deux façons d'utiliser votre type comme argument:

# Avec @Arg

Fonctionne de la même façon avec tous les types

@Resolver()
class Resolver {
  @Query()
  user(@Arg("user") user: User): Boolean {
    // ...
  }
}

Donnera en SDL:

input User {
  email: String
  username: String
}

input Query {
  user(user: User): Boolean
}

# Avec @Args

Il est également très utile de pouvoir utiliser une classe pour déclarer tout les arguments d'un coup (poser les arguments à plat) avec @Args.

Fonctionne uniquement avec les InputType

@Resolver()
class Resolver {
  @Query()
  user(@Args() user: User): Boolean {
    // ...
  }
}

Donnera en SDL:

input User {
  email: String
  username: String
}

input Query {
  user(email: String, username: String): Boolean
}