Slide 1

Slide 1 text

ゴリ押しでどうにかする HasuraのPermission Testing Hasura User Group Tokyo #3, 2023/10/20 こばやしとおる@DHH, LLC

Slide 2

Slide 2 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみ

Slide 3

Slide 3 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみ

Slide 4

Slide 4 text

自己紹介 - こばやしとおる - Webアプリケーション開発者 - DHH, LLCのCTO - Hasura歴 1年 - PostgreSQL歴 10+N年

Slide 5

Slide 5 text

アジェンダ - 自己紹介 - 所属企業について - アプリケーションについて - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみについて

Slide 6

Slide 6 text

所属企業 - DHH, LLC https://dhh.co.jp/ - Ruby on Railsの作者・DHH(David Heinemeier Hansson) のビジネス感覚が好き な2人が作った会社 - http://www.turnyourideasintoreality.com/2014/02/dhh/ - 自社サービスと受託開発の両輪

Slide 7

Slide 7 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみについて

Slide 8

Slide 8 text

アプリケーションについて - H

Slide 9

Slide 9 text

アプリケーション - Hooolders Analytics https://lp.hooolders.com/ - 株式会社 Figurout https://figurout.co.jp/ が開発/サービス提供 - DHH, LLC.はシステム設計・開発を担当

Slide 10

Slide 10 text

アプリケーション - Hooolders Analytics https://lp.hooolders.com/ - 株式会社 Figurout https://figurout.co.jp/ が開発/サービス提供 - DHH, LLC.はシステム設計・開発を担当 - 企業と投資家とのエンゲージメントプラットフォーム / IRアナリティクスツール - 自社分析機能 - 企業比較機能 - ニュース検索機能 - カスタムアラート機能

Slide 11

Slide 11 text

アプリケーション - Demo

Slide 12

Slide 12 text

アプリケーション - 構成

Slide 13

Slide 13 text

アプリケーション Firebase Hosting Firebase Auth Hasura Cloud Run Hasura Actions Backend Cloud Functions PostgreSQL Cloud SQL Cloud Storage Transfer/Parser Cloud Functions Hasura Actions Backend Cloud Functions PostgreSQL Cloud SQL Hasura Cloud Run Firebase Auth Firebase Hosting Scheduled Notification Cloud Functions

Slide 14

Slide 14 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみ

Slide 15

Slide 15 text

マルチテナントの実現方法

Slide 16

Slide 16 text

マルチテナントの実現方法

Slide 17

Slide 17 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみ

Slide 18

Slide 18 text

パーミッション

Slide 19

Slide 19 text

パーミッション - Hasura上のRole - staff: サービスの運営 - user: 契約ユーザー - system: バックエンドからのアクセス用

Slide 20

Slide 20 text

パーミッション - Hasura上のRole - staff: サービスの運営 - user: 契約ユーザー - system: バックエンドからのアクセス用 - 論理的なRole - GroupでのRoleにuserを分割 - staff: サービスの運営 - owner: 所属グループのリソースへのアクセス、所属グループへの招待、 ownerへの昇格 - member: 所属グループのリソースへのアクセス - invitee: あるグループから招待を受けている - system: バックエンドからのアクセス

Slide 21

Slide 21 text

パーミッション staff owner invitee member

Slide 22

Slide 22 text

パーミッション - groupsに対するRole×操作のパーミッション Role insert select update delete staff ◯ ◯ ◯ ◯ owner - ◯ ◯ - member - ◯ - - invitee - ◯ - -

Slide 23

Slide 23 text

- Hasura上のGroupsに対するstaff のパーミッション - DBの内容とJWTが乖離する可能 性があるので毎通信staffであるこ とを特定 パーミッション

Slide 24

Slide 24 text

- Hasura上のGroupsに対する owner/member/inviteeのselect パーミッション - 招待中のユーザーはgroup名など を知る必要がある パーミッション

Slide 25

Slide 25 text

- Hasura上のGroupsに対する owner/member/inviteeのupdate パーミッション - ownerのみがgroup名を更新可 パーミッション

Slide 26

Slide 26 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみ

Slide 27

Slide 27 text

テストのやり方 - テーブルに対して各ロールがCRUD表の動作を満たすか確認 - テーブル - permissionを構成するテーブル 7個 (users, staffs, staffInvitations, memberships, ownerships, groupInvitaitons, groups) - 機能を構成するテーブル N個 (groupWatchLists, groupWatchListStocks, stockIssues, stockPrices, ….) - ロール 6種 (staff, owner, member, invitee, anonymous, system) - CRUD 条件によって様々ある

Slide 28

Slide 28 text

テストのやり方 - 道具 - TypeScript + URQL+ Jest - 構成 - /test - /utils/clients/ 各パーミッションのクライアントを生成するファンクション - /permissions/ - /groups, /memberships, /ownerships,… 各テーブル毎 - /queries GraphQLのQuery/Mutation - /insert.ts, /select.ts, /update.ts, /delete.ts, /fragment.ts - /insert, /select, /update, /delete CRUD毎 - /staff.test.ts, member.test.ts,... Permission毎のテストコード

Slide 29

Slide 29 text

テストのやり方 - 時間があればテストコードを眺めてみる

Slide 30

Slide 30 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみ

Slide 31

Slide 31 text

つらみ - 数が多くてつらい - テーブル数 58 (2023/10/20時点) - Role 6 - CRUD 4 - 可不可を両方テストする必要があるので 2 - 58 x 6 x 4 x 2 = 2592ケース

Slide 32

Slide 32 text

つらみ - 数が多くてつらい - テーブル数 58 (2023/10/20時点) - Role 6 - CRUD 4 - 可不可を両方テストする必要があるので 2 - 58 x 6 x 4 x 2 = 2592ケース ゴリ押し!!!

Slide 33

Slide 33 text

アジェンダ - 自己紹介 - 所属企業 - アプリケーション - マルチテナントの実現方法 - パーミッション - テストのやり方 - つらみ - 共通化

Slide 34

Slide 34 text

共通化

Slide 35

Slide 35 text

共通化 permissionを 実現するための テーブル

Slide 36

Slide 36 text

共通化 permissionを 実現するための テーブル ログインしてい れば誰でも閲 覧可能

Slide 37

Slide 37 text

共通化 permissionを 実現するための テーブル ログインしてい れば誰でも閲 覧可能 グループに所 属していれば 閲覧可能

Slide 38

Slide 38 text

共通化 - permission

Slide 39

Slide 39 text

共通化

Slide 40

Slide 40 text

共通化 - テストの共通化

Slide 41

Slide 41 text

共通化 - テストの共通化 - 基本的には共通化するべきでない

Slide 42

Slide 42 text

共通化 - テストの共通化 - 基本的には共通化するべきでない - コピペ + sedでどうにかできる

Slide 43

Slide 43 text

共通化 - テストの共通化 - 基本的には共通化するべきでない - コピペ + sedでどうにかできる - cp -r hasura/test/permissions/templateTable hasura/test/permissions/targetTable - sed -e ‘s/templateTable/targetTable/g’ hasura/test/permissions/targetTable/**/*.ts -i

Slide 44

Slide 44 text

共通化 - テストの共通化 -> 省力化 - 基本的には共通化するべきでない - コピペ + sedでどうにかできる - cp -r hasura/test/permissions/templateTable hasura/test/permissions/targetTable - sed -e ‘s/templateTable/targetTable/g’ hasura/test/permissions/targetTable/**/*.ts -i

Slide 45

Slide 45 text

まとめ - Hasuraにおけるマルチテナントの実現方法例を示した - もちろん違う方法もある - JWTにgroupIdをもたせる方法でもできるよ - HasuraにおけるPermissionテストのやり方を示した - ロジックは単純 - まともにやったら数はすごい ゴリ押しでどうにかしてはならない - 共通化・省力化は設計しだいで可能だよ

Slide 46

Slide 46 text

ゴリ押しでどうにかする HasuraのPermission Testing Hasura User Group Tokyo #3, 2023/10/20 こばやしとおる@DHH, LLC

Slide 47

Slide 47 text

スマートに解決する HasuraのPermission Testing Hasura User Group Tokyo #3, 2023/10/20 こばやしとおる@DHH, LLC

Slide 48

Slide 48 text

Enjoy Development With Hasura