1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

cloud functionsのトリガーを実装してみる

Last updated at Posted at 2023-08-19

はじめに

最近firebaseにはまっているyappiです。
今回は、cloud functionsでトリガーについて、便利だなと思ったので、記事に残しておこうと思います。
firebase authってめちゃくちゃ便利で、よく使用するんですが、私は、authに登録したら、とりあえずfirestoreにもユーザ情報を登録しようみたいな流れになっちゃうんですね。
私だけなのか、あるあるなのか。。まぁそれはさておき。
いつもGoogle認証だけで実装していたりするんですが、Email/Passwordも追加する機会があり、その時にfunctionsを使った方が便利だなと思ったので、記事にまとめてみようかと思います!

なぜトリガーを使ったか?

私は普段、Next.js × firebaseで個人開発してまして、基本Google認証完了後、取得したユーザデータを使用して、firestoreにユーザ情報を格納するみたいな流れで実装をしてました。

/**
 * Googleアカウントでサインイン
 * @returns Promise<FirebaseResult>
 */
export const signInWithGoogle = async (): Promise<FirebaseResult> => {
  let result: FirebaseResult = { isSuccess: false, message: '' }
  const provider = new GoogleAuthProvider()
  try {
    const user = await signInWithPopup(auth, provider)
    const docRef = doc(db, 'users', user.user.uid)
    const docSnap = await getDoc(docRef)
    if (!docSnap.exists()) {
      setDoc(docRef, {
        uid: user.user.uid,
        username: user.user.displayName,
        email: user.user.email,
        photoURL: user.user.photoURL,
        createdAt: serverTimestamp(),
      })
    }
    if (user) {
      result = { isSuccess: true, message: 'ログインに成功しました' }
    }
  } catch (error) {
    result = { isSuccess: false, message: 'ログインに失敗しました' }
  }
  return result
}

しかし、Email/Password認証も追加で実装するとなると、これまでGoogle認証では取得できていた、displayNamephotoURLを取得できなくなることに気づきました。
そして、なんといっても、firestoreへの登録処理を再度実装しないといけないのと、ユーザの項目を追加しようかと考えたら、どっちにも追加しないといけないなぁとか、、(共通化するっていう手もあったな・・って書いてて思いました)

ということがあって、cloud functionsでトリガー作っちゃおう!functionsも勉強したかったし、ちょうどいい!ということで、authにユーザが登録されたら、これらの項目が追加されるように設定しました。

トリガーの実装

半分興味と勉強がてらと思ってトリガーを実装しようと思いましたが、displayNamephotoURLは取れないので、そこは妥協しました。
とりあえず、usernameは、Emailの@の前の部分を登録して、photoURLはユーザアイコンを使用している部分は、nullの場合は、デフォルトでアイコンが表示されるようにしておきました。

functionsの初期設定は、以前記事におこしたので、それを参考にしていただける幸いです。

コードの内容は以下になります。

/** Authにユーザが新規登録されたときに動作する処理  */
const registerUserTriggerFromAuth = functions
  .region('asia-northeast1')
  .auth.user()
  .onCreate(async (user) => {
    try {
      await usersColRef.doc(user.uid).set({
        uid: user.uid,
        username:
          user.displayName || user.email?.split('@')[0] || 'ユーザ名未設定',
        email: user.email,
        photoURL: user.photoURL || null,
        createdAt: admin.firestore.FieldValue.serverTimestamp(),
      })
      return
    } catch (error) {
      console.error(error)
      return
    }
  })

authにユーザが登録されたら動作する関数は、onCreate()です。
これで、Google認証またはEmail/Password認証どちらで新規登録しても同じようにfirestoreにユーザ情報が登録されます!ちょっと便利になった気がします。
最近はこのトリガーを使って、自分のサービスにユーザが新規登録されたら、メールが飛ぶように設定しました。
わざわざfirebaseを開かずとも、ユーザが増えていることを確認することができます!
(そんなに利用ユーザがいないので、functionsの使用量もそこまで気になりませんが、、良いのか悪いのか・・汗)

終わりに

今回は、cloud functionsのトリガーについて記事をまとめました。
次回は、お問合せ内容を登録したら、メールで通知がいくようなトリガーや頻度を設定したバッチ処理など、cloud functionsを使用した処理についてまとめていきたいと思います。

この記事が何かの役に立てると幸いです。間違い等ございましたら、ご指摘等、お願いします。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?