Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
async_graphqlのguardが便利だった話
Search
estie | エスティ
June 05, 2023
Programming
0
710
async_graphqlのguardが便利だった話
「Rust、何もわからない...#8」
estie | エスティ
June 05, 2023
Tweet
Share
More Decks by estie | エスティ
See All by estie | エスティ
Snowflakeで眠ったデータを起こそう!
estie
0
340
会社説明資料|株式会社estie / company profile
estie
8
180k
SnowflakeをRustで使おう!
estie
0
210
コアデータを起点にした商業用不動産の未来を導くマルチプロダクト戦略
estie
0
950
不動産データの複雑さをRustで解きほぐす話
estie
0
790
満を持して始めるRust
estie
19
14k
Enumを自動で網羅的にテストしてみた
estie
0
2.1k
Railsでモデリングする不動産データ分析
estie
0
860
Digital Hack Day 2022 オフィス不動産データ説明
estie
0
350
Other Decks in Programming
See All in Programming
ECMAScript、Web標準の型はどう管理されているか / How ECMAScript and Web standards types are maintained
petamoriken
3
370
New Order in Cascade Sorting Order
mugi_uno
3
2.5k
Go Code Generation at newmo / 2024-08-27 #newmo_layerx_go
genkey6
0
510
座談会 「Strict ConcurrencyとSwift 6が開く新時代: 私たちはどう生きるか?」
shiz
4
2.9k
Swift Concurrencyとレースコンディション
objectiveaudio
1
380
Swiftで高速フーリエ変換してオーディオビジュアライザーを作る / iOSDC Japan 2024 Day1 Track D
kyome22
2
460
仮想ファイルシステムを導入して開発環境のストレージ課題を解消する
segadevtech
2
390
Mastering AsyncSequence - 使う・作る・他のデザインパターン(クロージャ、Delegate など)から移行する
treastrain
3
1.3k
1人で挑むSwiftコンパイラ 〜型システム入門編〜
s_shimotori
0
310
Ruby Parser progress report 2024
yui_knk
2
180
Wallet API, Verifier APIで実現するIDカード on iPhoneの世界
shitamori1272
1
320
Playwrightから始めるVisual Regression Testingのススメ by とっと
totto2727
2
1.8k
Featured
See All Featured
Thoughts on Productivity
jonyablonski
65
4.2k
4 Signs Your Business is Dying
shpigford
179
21k
Intergalactic Javascript Robots from Outer Space
tanoku
268
26k
Reflections from 52 weeks, 52 projects
jeffersonlam
346
20k
How GitHub (no longer) Works
holman
309
140k
Ruby is Unlike a Banana
tanoku
96
10k
The Art of Programming - Codeland 2020
erikaheidi
48
13k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
33
1.7k
Web development in the modern age
philhawksworth
204
10k
Keith and Marios Guide to Fast Websites
keithpitt
408
22k
The Pragmatic Product Professional
lauravandoore
30
6.2k
Why You Should Never Use an ORM
jnunemaker
PRO
53
8.9k
Transcript
async_graphqlのguardが便利だった話 2022/5/22 Rust、何もわからない….vol8 hige_yy @kia5n_y2_mud
higeです。 • 本名は山中です • 202012~ estie • 元々はフロントエンド領域 • オーディオオタク
• ビアポンなるパーティゲームの元日本代表 1
2 1. async_graphqlを使ってGraphQL移行した話 2. 便利だったものの話 3. 大変だったことの話 4. まとめ こういう話しますよ
GraphQLに移行するぞ!!!
4 1. 現状はReact + Rust(REST)の構成だが、ユースケースごとにフロントでリソースの結合 成形を行っている箇所が複数あってちょっとつらい 2. 見た目のちょっとした変更のためにバックエンドまで変更しなければならないことが 多々ある 3.
フィールド単位で参照の権限を設定したいが、似たような実装が毎回必要になる 4. ……etc なぜGraphQLにしたいか 移行したいので検証を実施した - Juniperで試しに実装してみる話 (Rust何もわからないvol.4) - 結果、やりたいことはできそう。
5 Juniper or async_graphqlで検討 差分は大きくなかったが以下が決め手になりasync_graphqlを使うことに - OneofObjectが使える - Inputで値が入ったEnumが使える -
Fieldの定義とGuardが柔軟に行えそう - Fieldごとに設定可能でResolver実行前に実行されるもの 技術選定の話
6 - crateをいくつかにわけて開発 - api - sql - usecase -
middleware - ……etc 元々どんな感じで作っていたか
7 - crateをいくつかにわけて開発 - api <- ここを部分的にgqlに移行 - sql -
usecase - middleware - ……etc どんな感じで移行するか
8 ざっくりと実装はこんなイメージ
9 移行していく 開発チームを一時的に機能開発組と移行組に分割して実施 移行できて嬉しいものから移行していった 結果、1週間と少しで主要な参照が移行完了。 以降、作成されるAPIはgqlになり順次作成・更新系を移行中。
10 運用に移って GraphQLにチーム全員が慣れているわけではないので、ちょくちょくつま づきは起きていますが、おおむね問題なく運用できています。 当初困っていたフロントエンドが複雑になる部分は無事解消されました。
便利だったものの話
12 FieldGuard こう定義して こうやって使う
13 なぜ便利だったかの話 不動産ドメインには多くの登場人物が存在します - ビルを保有する人 - ビルを管理する人 - 募集を出す人 -
営業をする人 - 部屋を借りたい人 - ……etc 同じ“ビル”を指していても全く同じ情報が全てのユーザに見えて良いわけで はありません。
14 なぜ便利だったかの話 ここでは簡単のために以下のユーザが存在していると仮定します - ビルの貸主 - 他社のビルは閲覧できない - テナント -
全てのビルを閲覧できるが見えない項目がある - 管理者 - 全て閲覧可能
15 なぜ便利だったかの話 このようなビルを考える
16 なぜ便利だったかの話 RESTでやっていた時…… -> 全部分けて定義する? -> Optionalな型にして返す?
17 なぜ便利だったかの話 見ても良い条件を満たさない場合Errを返すGuardをユーザごとに作成
18 なぜ便利だったかの話 このように表現可能になります。
19 なぜ便利だったかの話 1. 一見してどのフィールドが誰に公開されているのかわかる 2. 同一のロジックで処理が可能 3. ctxと引数を受けることができるので柔軟なGuardの記述が可能
20 Remote Enum レイヤーを跨ぐ構造体について依存を切るために詰め替えたりしますよね。 でも何度も impl From<~> ……するの結構大変ですよね。 特にenumのこれ
21 Remote Enum remote-enumを使うと実に楽になります。
22 できないこともある 値のあるEnumについては使えません。
23 値のあるEnumについてはどうするか パターン1: Unionを使う 全て値を持っている場合、Unionが使えます。 パターン2: 型を一部諦める 今のところこれは良い!という手段は特になし。
大変だったことの話
25 複雑なSQL操作でAcquireを使うと lifetime error になる これ
26 どういう時に起きるか acquireを要求している関数を複数呼んでいる関数があり
27 どういう時に起きるか それをLoaderで呼び出した場合に起きます
28 どうやって解決したか Acquireを要求していた箇所を MySqlConnectionに変更するととりあ えずCompileは通るようになります。 何がだめなのか……?
29 ちょっと調べてみた cargo-expandを使って 該当箇所をexpandすると……
30 ちょっと調べてみた 一部コメントアウトすると通る
31 ちょっと調べてみた どうやらnotesを引いてるところで こけてるみたい…… 結論わかんない ということがわかりました!
まとめ
33 まとめ 1. async_graphqlのGuardは便利だった。 2. LifetimeのErrorは難しい。sqlxを使うなら気をつけよう。
34 追記 折角なので、sqlx + async_graphqlの環境を作っておきました。 async_graphqlに興味が出た方はいじってみてください。 (あとあのErrorがわかる方の解説もお待ちしてます) https://github.com/savacan/rust-gql-sample
35 estie(エスティ) は オフィス不動産を デジタル化する会社です