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

クライアントポータルを支える技術 / Technologies supporting VQ Client Portal

dkita
May 20, 2019

クライアントポータルを支える技術 / Technologies supporting VQ Client Portal

visasQ Engineering Meetup #2 -ビザスクを支える技術-
クラフトビールを片手にビザスクの話をする会
https://visasq.connpass.com/event/128398/

dkita

May 20, 2019
Tweet

Other Decks in Technology

Transcript

  1. フルサポート形式 (VQ) クライアント リサーチ担当 案件担当 アドバイザー ⭕ ⭕ ⭕ ③リストアップ

    ②サーチ依頼 クライアント ポータル ⑤スポットコンサル ①案件依頼 ④面談調整 ④面談調整 依頼専用フォーム ビザスク
  2. 技術 App Engine Cloud SQL App Engine Cloud SQL クライアントポータル

    Cloud Functions Cloud Pub/Sub Cloud Scheduler ビザスク
  3. クエリ - 並べ替えとフィルタ • orderByKey()
 • orderByChild()
 • orderByValue()
 •

    limitToFirst()
 • limitToLast()
 • startAt()
 • endAt()
 • equalTo()
 × ❌ 複数条件での並べ替えやフィルタはできない

  4. データを冗長化する① { "rooms": { "roomA": { "users": { "0001": true

    } }, "roomB": { "users": { "0001": true } } }, "users": { "0001": { "name": "userA" } } } // rooms をすべて取得する const snapshot = await db.child(‘rooms’).once('value'); // roomsの件数文のループが発生する snapshot.forEach(async child => { const room = child.val(); if (‘0001’ in room.users) { // OK } }); ❌ rooms の件数に応じて処理数が膨れ上がる
 例) ユーザーが所属しているチャットルームを取得する
 

  5. データを冗長化する① { "userRooms": { "0001": { "rooms": { "roomA": true

    "roomB": true } } } } // rooms をすべて取得する const snapshot = await db.child(‘userRooms/0001/rooms’).once('value'); // OK const rooms = child.val(); ⭕ rooms の件数に依存しない
 例) ユーザーが所属しているチャットルームを取得する

  6. データを冗長化する②
 { “rooms”: { “room1”: { } }, “messages”: {

    “message1”: { “text”: “こんにちは” } }, "unreadMessages": { "room1": { "messages": { “message1”: true }, “count”: 1 } } } // 未読のある部屋を取得する const snapshot = await db.child('unreadMessages') .orderByChild('count') .startAt(1) .once('value'); ⭕ count 済みのデータも保存しておく
 例) 未読のあるチャットルームを取得する 

  7. ルールによるアクセス制御
 { "users": { "0001": { "name": "client" }, "0002":

    { "name": "staff" } } } 例) 自分のデータのみ読み込みを許可 
 { "rules": { "users": { "$uid": { ".read": "(auth != null && auth.uid == $uid)" } } } } ルール Who are you ? I’m ‘client’. I’m ‘staff’. ❌ 
 認証済み ユーザーIDが一致する
  8. ルールによるアクセス制御
 { "users": { "0001": { "name": "userA" }, "0002":

    { "name": "userB" } }, "userFollowers": { "0001": { "0002": true }, "0002": { "0001": true } } } 例) 他人のデータも読み込みを許可 
 { "rules": { "users": { "$uid": { ".read": "((auth != null && auth.uid == $uid) || root.child('userFollowers').child(auth.uid).child($uid).val( ) != null)" } } } } ルール I’m ‘client’. I’m ‘staff’. ⭕ 

  9. 自分のデータの読み込みを許可する { "rules": { "users": { "$uid": { ".read": "(auth

    != null && auth.uid == $uid)" } } } } isSignedIn() { auth != null } isCurrentUser(uid) { isSignedIn() && auth.uid == uid } path /users { read() { isCurrentUser(auth.uid) } write() { false } }
  10. 設計のポイント まとめ • 取り扱いやすいデータ構造にする
 • クエリのしやすさを重視する
 • ときには冗長化する (Cloud Functions

    に委譲する)
 • アクセス制御をしっかりと
 • 制御用のデータを定義する
 • Bolt Compiler を使う

  11. 今後 • 手動オペレーションの削減 • データ分析
 • Realtime Database -> Cloud

    Firestore へ • Cloud Functions を Node.js -> Go へ
 • ....
 MUST WANT