Hasuraアクションを使用してGraphqlにあなたの残りのAPIを回してください


この投稿は、既存のREST APIを型を定義し、エンドポイントを設定するだけで、GraphSQLに変換する方法の一部です.

導入


このポストでは、あなたのGo - REST APIをGraphqlに変えるために、Hasuraアクションを使用するのを見ます.
典型的には、GraphSQLサーバをゼロから書くと、GraphSQLスキーマを設定し、型定義を定義し、言語/フレームワークのレゾルバでそれを配線します.このサーバーコンポーネントについてのハードパーツは、各タイプのAuthロジックを取得またはポストして処理するためにREST APIを書くのに使用される人のためのリゾルバコードですアプリが大きくなるにつれて複雑になります.
Hasuraはあなたのデータを取得し、リアルタイムのサブスクリプションを使用するケースのほとんどをカバーする必要がありますデータベース(現在のPostgres)のインスタントGraphSQL CRUDを与えることによって、ゼロからGraphSQL APIを設定するの複雑さを減らす.
カスタムビジネスロジックの場合、ハサラは、異なる方法でグラフを拡張することができます.あなたがGraphSQLサーバーを書くのが快適であるならば、あなたは完全にリモートスキーマとしてカスタムGraphSQLサーバーを加えることができます、そして、ハハラはあなたのために自動的にそれを合併します.新しいロジックを書くか、既存のREST APIをカスタムロジックのままにしたい場合は、この投稿にフォーカスするアクションを使用することができます.

新しいREST API


最初から起動している場合は、アクションに必要なGraphSQL型を定義し、リゾルバビットを処理する簡単なExpressアプリを作成します.ユーザ登録の例を挙げましょう.
始める前に、Hasuraクラウドでプロジェクトを作成してアクションを設定しましょう.下記のHasuraボタンへの展開をクリックし、無料でサインアップし、新しいプロジェクトを作成します.

hasuraにはPostgresデータベースが必要です.我々はHerokuの無料Postgresデータベースティアを使用して、このアプリを試すことができます.

Herokuに署名した後、プロジェクトを作成するオプションが表示されます.

プロジェクトを作成したら、新しく作成したプロジェクトのプロジェクトページのコンソールボタンをクリックし、Hasuraコンソールを表示します.このプロジェクトを作成することによって、GraphSQLのエンドポイントをすでにGlobalallyに利用可能で、最初からセキュアでスケーラブルなPostgresデータベースに持っています.
さあ、Hasuraコンソールのアクションタブを見て、我々のアプリのGraphSQLタイプを定義しましょう.

ここでは、突然変異型を定義していますregisterUsername , email and password 引数とid を返します.
ハンドラのURLを後で設定できます.をクリックしてアクションを作成します.
ここで、Graphqlのサンプル突然変異を試して、生成されたグラフの突然変異を検証しましょう.
mutation {
  registerUser(
    email: "[email protected]"
    name: "Person Name"
    password: "mypass"
  ) {
    id
  }
}

ハンドラのURLがまだ構成されていないので、上記の突然変異は明らかにHTTP例外を与えるはずです.しかし、このテストでは、Hasuraが同じGraphSQLのエンドポイント上のクエリに定義されている型に基づいて、あなたのために突然変異を生成することを確認することです.

今すぐ行って、実際に行くアプリを定義し、突然変異を試してみましょう.

自動生成ボイラプレートコード


今すぐあなたのゴランサーバのためのボイラープレートのコードを自動生成するCodeGenタブに頭を.私たちはゼロからAPIを生成しているので、我々は完全なサーバーのセットアップだけではなくPOST ハンドラ.

コンソールは、あなたにnodejs急行、nodejs zeit、nodejs azure機能などを含むが、限られたフレームワークのためにコードを生成するオプションを与えます.
アプリケーションをローカルに実行して、テストしましょう.例えばファイルを作成するmain.go or app.go ディレクトリで、registerUser.go and registerUserTypes.go その中に.
その後、走るgo run <filename>.go は、http://localhost:3000あなたはすぐにそれがエンドポイントを押すことによって正しく機能していることを確認することができますcurl アクションペイロードをシミュレートします.
$ curl http://localhost:3000/registerUser \
    --data '{ "input": { "name": "Person Name", "email": "[email protected]", "password": "mypass" } }'
$ {"id":"<sample value>"}

今、我々は我々のクラウド・アプリがそれに達することができるように、我々のローカルAPIを公開する必要があります.これを行うには、サービスを使用することができますhttps://ngrok.com 当社のローカルアプリケーションへのパブリックアクセス可能なトンネルのURLを作成します.
の使用を仮定するngrok , 走るngrok http 3000 端末で使用できる一意のURLを指定します.の変更タブに戻るregisterUser hasuraコンソールで作成されたアクション.ハンドラURLをngrok .
最後に、Graphqlを通して同じ突然変異を試してみましょう.接続はIDのダミーを返します.

ああ!我々は、バックグラウンドでGO REST APIを使用して解決されて動作するグラフィカルSQL APIを持っている.
今、あなたは任意のビジネスロジックを行うために必要に応じてハンドラコードを変更することができます別のAPIに接続したり、データベースに接続したり(HasuraのAPIを優先的に使用したり)、異なるデータベースに対してORMを使用するようにしましょう.hasuraは、GraphSQLの突然変異を内部の正しいREST APIハンドラにプロキシするよう注意します.

パーミッション


パーミッションは?誰がクライアントからこのgraphql突然変異を作ることができますか?たった今、それは管理者だけであるように構成されます.他の種類のユーザーがこの突然変異を行うことができるように、我々は役割を構成することができます.

上の例では、この突然変異を行うことができるパブリックと呼ばれるロールを作成しました.全体の認証と認可がHasuraでどのように機能するかについてもっと読むためには、docsをチェックアウトできます.

関係データ


Postgresデータベースがユーザテーブルを持っていることを考える.RegisterUser出力のIDをユーザーテーブルのIDに接続できます.

関連データは、それぞれのテーブルに対して定義されたアクセス許可にも適合します.(ユーザ名)

既存のAPI


今私はすでにいくつかのカスタムビジネスロジックを処理するために書かれたエンドポイントの束を持つサーバーを持っているかどうか疑問に思うかもしれません.その場合、ポストエンドポイントであれば、必要なGraphSQLタイプを定義して、リクエスト本文を処理する方法に変更を加えることができます.
リクエストペイロードは形式です.
{
  "action": {
    "name": "<action-name>"
  },
  "input": {
    "arg1": "<value>",
    "arg2": "<value>"
  },
  "session_variables": {
    "x-hasura-user-id": "<session-user-id>",
    "x-hasura-role": "<session-user-role>"
  }
}

この例では、入力引数- name、email、passwordを入力オブジェクトの中にラップしました.このリクエスト本文を処理するために、既存のREST APIに必要な変更を加えることができれば、GraphSQL APIは期待通りに動作します).

クエリアクション


上の例は、GraphSQL突然変異を実行する方法を示します.同じワークフローをバックグラウンドでGO REST APIへプロキシを実行するために拡張することができます.クエリ動作の典型的なユースケースには、計算されたフィールド、データの強化、データ変換、複数のデータベースやAPIソースからのフェッチなどがあります.

サポートフレームワーク


残りのAPIは、GIN、エコー、FASTTTTP、またはServerless関数のような任意のフレームワークにすることができます.結局のところ、hasuraには、到達可能なポストエンドポイントが必要です.APIをServerless関数に展開する場合は、クラウドプロバイダのフォーマットに従う必要があります.