CloudFunctions for Firebase トリガー 関数 早見表

CloudFunctions for Firebaseの一つの利点は、他のFirebase サービスとの強力な連携です。
Functionの起動トリガーとして、各サービスのイベントを利用できます。
今回はサービスごとに多様にあるトリガーをまとめてみました。

ここで紹介したコードはこちらのGithubリポジトリにあります。
https://github.com/kawamataryo/firebase-functions-trigger-list

# Firestore 

## [#onCreate](https://firebase.google.com/docs/reference/functions/providers_firestore_.documentbuilder.html#on-create)

`document()`で指定したコレクションへの**ドキュメントの追加**をトリガーに関数が実行される。

```typescript
export const onCreate = functions.firestore
  .document("/users/{userId}")
  .onCreate(async (snapshot, context) => {
    // do anything
    console.log(`user ${context.params.userId} created.`);
  });
```

## [#onUpdate](https://firebase.google.com/docs/reference/functions/providers_firestore_.documentbuilder.html#on-update)

`document()`で指定したコレクションの**ドキュメントの更新**をトリガーに関数が実行される。


```typescript
export const onUpdate = functions.firestore
  .document("/users/{userId}")
  .onUpdate(async (change, context) => {
    // do anything
    console.log(`user ${context.params.userId} updated.`);
  });
```
## [#onDelete](https://firebase.google.com/docs/reference/functions/providers_firestore_.documentbuilder.html#on-delete)

`document()`で指定したコレクションからの**ドキュメントの削除**をトリガーに関数が実行される。


```typescript
export const onDelete = functions.firestore
  .document("/users/{userId}")
  .onDelete(async (snapshot, context) => {
    // do anything
    console.log(`user ${context.params.userId} deleted.`);
  });
```

## [#onWrite](https://firebase.google.com/docs/reference/functions/providers_firestore_.documentbuilder.html#on-write)

`document()`で指定したコレクションにて**ドキュメントの追加・更新・削除**をトリガーに関数が実行される。


```typescript
export const onWrite = functions.firestore
  .document("/users/{userId}")
  .onWrite(async (change, context) => {
    // do anything
    console.log(`user ${context.params.userId} wrote.`);
  });
```

# Firebase Authentication 

## [#onCreate](https://firebase.google.com/docs/reference/functions/providers_auth_.userbuilder.html#on-create)

Firebase Authenticationでの**ユーザー追加**をトリガーに関数が実行される。

```typescript
export const onCreate = functions.auth
  .user()
  .onCreate((userRecord, _context) => {
    // do anything
    console.log(`user ${userRecord.uid} created.`);
  });

```

## [#onDelete](https://firebase.google.com/docs/reference/functions/providers_auth_.userbuilder.html#on-delete)

Firebase Authenticationでの**ユーザー削除**をトリガーに関数が実行される。

```typescript
export const onDelete = functions.auth
  .user()
  .onDelete((userRecord, _context) => {
    // do anything
    console.log(`user ${userRecord.uid} deleted.`);
  });
```


# Firebase Analytics 
## [#onLog](https://firebase.google.com/docs/reference/functions/providers_analytics_.analyticseventbuilder.html#on-log)

`event()`で指定した**イベントの発生**をトリガーに関数が実行される。

```typescript
export const sampleEvent = functions.analytics
  .event("sample_event")
  .onLog((analyticsEvent, context) => {
    // do anything
    console.log(`Trigger ${analyticsEvent.name}.`);
  });
```

#  Remote Config 

## [#onUpdate](https://firebase.google.com/docs/reference/functions/providers_remoteconfig_.html#on-update)

**設定の更新**をトリガーに関数が実行される。

```typescript
export const onUpdate = functions.remoteConfig.onUpdate(
  (templateVersion, _context) => {
    // do anything
    console.log(`Remote config updated to ${templateVersion.versionNumber}`);
  }
);
```

# Cloud Storage

## [#onArchive](https://firebase.google.com/docs/reference/functions/providers_storage_.objectbuilder.html#onarchive)

オブジェクトのライブバージョンが**アーカイブバージョンになったこと**をトリガーに関数が実行される。

※ バケットで[オブジェクトのバージョニング](https://cloud.google.com/storage/docs/object-versioning?hl=ja)が有効になっている場合にのみ送信

```typescript
export const onArchive = functions.storage
  .object()
  .onArchive((_objectMetadata, _context) => {
    // do anything
    console.log("storage archived");
  });
```

## [#onDelete](https://firebase.google.com/docs/reference/functions/providers_storage_.objectbuilder.html#on-delete)

オブジェクトの**更新、削除**をトリガーに関数が実行される。
※ バケットで[オブジェクトのバージョニング](https://cloud.google.com/storage/docs/object-versioning?hl=ja)が有効になっている場合、onDeleteではなく`onArchive`が実行される。（たぶん）

```typescript
export const onDelete = functions.storage
  .object()
  .onDelete((_objectMetadata, _context) => {
    // do anything
    console.log("storage deleted");
  });
```

## [#onFinalize](https://firebase.google.com/docs/reference/functions/providers_storage_.objectbuilder.html#on-finalize)

バケットで**新しいオブジェクトが正常に作成されたこと**をトリガーに関数が実行される。

※ 既存のオブジェクトをコピーまたは再作成した場合にも実行される
※ アップロードが失敗した場合は実行されない

```typescript
export const onFinalize = functions.storage
  .object()
  .onFinalize((_objectMetadata, _context) => {
    // do anything
    console.log("storage finalized");
  });
```

## [#onMetadataUpdate](https://firebase.google.com/docs/reference/functions/providers_storage_.objectbuilder.html#on-metadata-update)

オブジェクトの**メタデータが更新されたこと**をトリガーに関数が実行される。

```typescript
export const onMetadataUpdate = functions.storage
  .object()
  .onMetadataUpdate((_objectMetadata, _context) => {
    // do anything
    console.log("storage metadata updated");
  });
```

# Clashlytics

## [#onNew](https://firebase.google.com/docs/reference/functions/providers_crashlytics_.issuebuilder.html#on-new)

新しいissueが発生したことをトリガーに関数が実行される。

```typescript
export const onNew = functions.crashlytics
  .issue()
  .onNew(async (issue, _context) => {
    // do anything
    console.log(`New issue has occurred. ${issue.issueTitle}`);
  });

```

## [#onRegressed](https://firebase.google.com/docs/reference/functions/providers_crashlytics_.issuebuilder.html#on-regressed)

一度クローズしたissueが再度発生したことをトリガーに関数が実行される。

```typescript
export const onRegressed = functions.crashlytics
  .issue()
  .onRegressed(async (issue, _context) => {
    // do anything
    console.log(`Regressed has occurred. ${issue.issueTitle}`);
  });
```

## [#onVelocityAlert](https://firebase.google.com/docs/reference/functions/providers_crashlytics_.issuebuilder.html#on-velocity-alert)

設定したvelocityでAlertの発生をトリガーに関数が実行される。

```typescript
export const onVelocityAlert = functions.crashlytics
  .issue()
  .onVelocityAlert(async (issue, _context) => {
    // do anything
    console.log(`Velocity alert. ${issue.issueTitle}`);
  });
```

# Test Lab

## [#onComplete](https://firebase.google.com/docs/reference/functions/providers_testlab_.testmatrixbuilder.html#oncomplete)

**TestMatrix が完了したこと**をトリガーに関数が実行される。

```typescript
export const onComplete = functions.testLab
  .testMatrix()
  .onComplete((testMatrix, _context) => {
    // do anything
    console.log(`${testMatrix.testMatrixId} is complete`);
  });
```


# 参考

*  [Cloud Firestore トリガー](https://firebase.google.com/docs/functions/firestore-events) 
*  [Remote Config トリガー](https://firebase.google.com/docs/functions/rc-events) 
*  [Firebase Authentication トリガー](https://firebase.google.com/docs/functions/auth-events) 
*  [Google アナリティクス トリガー](https://firebase.google.com/docs/functions/analytics-events) 
*  [Crashlytics トリガー](https://firebase.google.com/docs/functions/crashlytics-events) 
*  [Cloud Storage トリガー](https://firebase.google.com/docs/functions/gcp-storage-events)