Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Hasuraにコントリビュートした話

 Hasuraにコントリビュートした話

Nakano as a Service

February 10, 2023
Tweet

More Decks by Nakano as a Service

Other Decks in Programming

Transcript

  1. 自己紹介 中野 匡浩(まさひろ) 24歳 ハンドルネーム: Nakano as a Service 福岡スタートアップ 株式会社デンタライト

    ジニーメモリーという製品のプロダクトオーナー インフラ・バックエンド・フロントエンドまんべんなくできるなんでも屋さん 2
  2. 例: Userテーブルから名前が田中太郎のユーザーを引く id name 1 田中太郎 2 山田花子 # Hasura

    に出すGraphQL クエリ query GetUserByName { user(where: { name: { _eq: " 田中太郎" }}) { id name } } -- Hasura がDB から引くクエリ select id, name from User where name=' 田中太郎'; 5
  3. 例: deleted_atに値がない( is null )レコードしか引けないようにPermissionで設定 id name deleted_at 1 田中太郎

    2023/02/09 2 山田花子 # Hasura に出す全件取得のクエリ query GetAllUser { user { id name } } select id, name from User where deleted_at is null; -- 暗黙的にwhere がつく [{id: 2, name: " 山田花子"}] 7
  4. デンタライトで遭遇した問題 SQLServerではPermissionで is null が使えない Inconsistent object: in table \"user\":

    in permission for role \"user\": Unknown operator: _is_null is null ? 知らない演算子ですね (意訳) 弊社では deleted_at に削除日を入れて削除したことにする運用(論理削除) ないと結構困る 9
  5. 色々検証した結果 PostgreSQLでは使える Hasuraは主にPostgreSQLを前提に作られている Permissionでは設定できないがクエリでは is null が使える つまり以下のようなクエリは通る query GetNotDeletedUser

    { user(where: { deleted_at: { _is_null: true }}) {id, name} } クエリは出せるのだから、Permissionさえ直せばよいのでは? PostgreSQLのPermissionの実装が参考になるのでは? → 自分でも直せるのでは? 10
  6. やったこと1: エラー文でリポジトリ内を検索 Inconsistent object: in table \"user\": in permission for

    role \"user\": Unknown operator: _is_null Unknown Operator で検索するとPermissionのMSSQLの場合の実装がヒット case opStr of "_eq" -> parseEq "$eq" -> parseEq "_neq" -> parseNeq "$neq" -> parseNeq ... x -> throw400 UnexpectedPayload $ "Unknown operator: " <> x ここでPermissionに設定したオペレーターごとに場合分けをしているようだ そもそもここに _is_null が無くて Unknown Operator が出ていたようだ 11
  7. やったこと2: PostgreSQLの実装と見比べた 似たような場所にPostgreSQLの場合の実装もあったので見比べる case opStr of ... "$eq" -> parseEq

    "_eq" -> parseEq ... "$is_null" -> parseIsNull "_is_null" -> parseIsNull ... x -> throw400 UnexpectedPayload $ "Unknown operator: " <> x 確かにここには _is_null がある 12