gqlgenでTypeにプロパティを追加してみよう

gqlgenでTypeにプロパティを追加してみよう

前回ではgqlgenでサーバーをlocalhostに立ち上げて、GraphQL Playgroundから実際に Query が実行されるところまで確認できました。

今回は一度コード生成された後にGraphQLのインタフェースを変えたい場合どう実装していくのか書いていこうと思います。

gqlgenSchema first でGraphQLなAPIを作るためのライブラリです。
schema.grpahqlを編集してGoのコードを再生成するところまで確認していきましょう。

前回

まず前回までのまとめなのですが、下記のQueryを実行すると Todo.id の一覧が取得できたことまで確認しました。

Query

query {
  todos {
    id
  }
}

Response

{
  "data": {
    "todos": [
      {
        "id": "1"
      },
      {
        "id": "2"
      },
      {
        "id": "3"
      }
    ]
  }
}

今回はこの Todotitle というプロパティを足していきたいと思います。

schema.graphqlの編集

初めに schema.graphql を編集していきましょう。今回は Todo にプロパティを追加していくので下記のスキームに注目します。

type Todo {
  id: ID!
  text: String!
  done: Boolean!
  user: User!
}

上の type Todo から始まるものはレスポンスの形式を表しています。 ID! 型の idString! 型の text というプロパティがあるといった具合ですね。これは gqlgen generate の後に models_gen.go にコードが吐き出されます。 今のままの Todo では id,text,done,user の4つのフィールドはレスポンスとして返せますが title は返すことができません。title を返せるようにするためにまず schema.graphql を編集して Todotitle を追加しましょう。

type Todo {
  id: ID!
  text: String!
  done: Boolean!
  user: User!

  title: String! # ここが追加
}

Scehma first を謳っているgqlgenではスキーマファイルと実装するGraphQLのインtらフェースが合うように開発を進めていきます。
先ほど、titlte: String! の部分を追加しました。続いてこのschemaの情報をGo のコードに反映させていきます。

Goのコードを生成する

前回ではgqlgen initした結果、ExmapleのGoのコードが作成されました。
追加したフィールドをGoに反映させたい場合はgqlgen generateを実行します。

$ gqlgen generate

ちなみに短縮して gqlgen とだけ打って実行しても構いません。

$ gqlgen

実行後 generated.go, models_gen.goが変更されていれば成功です。
特に models_gen.goの中身を確認してみましょう。
TodoTitle というプロパティが追加されていることが確認できると思います。

 type Todo struct {
    ID    string `json:"id"`
    Text  string `json:"text"`
    Done  bool   `json:"done"`
    User  User   `json:"user"`
    Title string `json:"title"`
 }

次に前回と同様にresolver.goTodos メソッドを編集していきましょう。

func (r *queryResolver) Todos(ctx context.Context) ([]Todo, error) {
    return []Todo{
        Todo{
            ID:    "1",
            Title: "First",
        },
        Todo{
            ID:    "2",
            Title: "Second",
        },
        Todo{
            ID:    "3",
            Title: "Third",
        },
    }, nil
}

これで完了です。GraphQL Playgroundから結果を確認してみましょう。

$ go run ./server/server.go

サーバーが立ち上がったあら下記のQueryを貼り付けて実行してみましょう。

{
  todos {
    id
    title
  }
}
{
  "data": {
    "todos": [
      {
        "id": "1",
        "title": "First"
      },
      {
        "id": "2",
        "title": "Second"
      },
      {
        "id": "3",
        "title": "Third"
      }
    ]
  }
}

画面はこのような具合になっていると思います。

終わりに

今回はプロパティの追加するというユースケースを通して gqlgen の機能を使い Schema first で実装をしていきました。

GitHubにここまでの内容を公開しています。
https://github.com/bannzai/gqlgen-demo

branchは fix/add/field となっています。前回からの差分としてPRを一つ作ってあります。
https://github.com/bannzai/gqlgen-demo/pull/2

この記事がいいと思ったら、GitHubのスターください

おしまい \(^o^)/