hasura cloudを使ってみて

10/4/2023

このブログ記事はGraphQLサーバのHasuraを使ってデータを保存取得しています。

普段はフロントエンドで主に見た目の部分、取得/送信データの整形部分、をやっています

殆どバックエンドには触れてこなかったので、試しに…と思いhasura

当然ツマズキポイント盛りだくさんでした

特に権限周りは最初よく分からず(現在はわかっているとは言っていない)、覚書としてこの記事を書きます

hasuraに登録してデータベースの接続、これは簡単でhasuraがおすすめしてくれているneonを選択すると登録などを済ませば勝手に接続してくれます

そうしたらcreate tableで適当な名前(todoやarticleなどなど)をつけて、

  • id
    • title
      • description
        • user-id

          というテーブルを作りましょう(とりあえず最小限の構成)

          idは自動で振ってくれた方が良さそうなのでuuidにしてgen_random_uuid()を選択します。そのほかは全部textでok

          次にusersを作ります

          とりあえずは

          • id
            • name

              だけで良いでしょう。どちらもtextでok

              これだけでqueryとmutation,subscriptionを自動で作ってくれます。

              次にForeign Keysを作ります

              DATA->(todoやarticleなどなど)に移動->Modify->Foreign Keysをクリック

              Fromを先程のuser-id、Toをidにします

              この時わかると思いますがFromにはtodoやarticleなどなどのテーブル,Toにはusersのテーブルのキーがあるのがわかります

              これでtodoやarticleなどなどのuser-idとuserのidが紐付けられる

              Relationshipを見てみましょう、何もなければAddして名前をつけて今の関係を保存

              次に権限

              todoやarticleなどなどのテーブル->Permissionsに移動

              adminは全てにチェックが入っています

              Enter New Roleにuserとでも入れて権限を追加して行きます

              insert,update,deleteはWith custom checkを下記のように設定

              {
              "user-id" :{
              "_eq" : "X-Hasura-User-Id" [X-Hasura-User-Id]
               }
              }

              _eqはイコールって意味

              select(取得)だけはWithout any checksにしています

              もう一つ権限を作り、anonymousとでもしておいてselect(取得)だけWithout any checksにして設定。残りは何も設定しません

              要はuser-idがなくても取得だけはできるよって事ですね

              データを表示する権限はフリーにして特にuserを作らなくても見ることはできる状態にするということ

              試しにDATA->users->Insert Rowで適当なuserを一人作ってみましょう

              APIに移動してRequest Headersのkey(わかりにくい位置にある!)にx-hasura-user-idとして(リクエストヘッダーなので大文字小文字関係ないです)、valueに先程作ったuserのidを追加してみると

              先程の権限どおりtodoやarticleなどなど)のQuery(select)、mitationのinsert(新規追加)、update,deleteができるようになっているはずです

              試しにmutationのinsertをやってみましょう、この時user-idに先程作ったusersのidを入れるのを忘れないように

              queryで取得してみると取得したデータの中にuserの情報もあることが確認できると思います

              この後フロントではhasuraにリクエストを送る際にRequest Headersにuser-idを渡してあげれば良いということになります

              以上!!!!!