Skip to content

Instantly share code, notes, and snippets.

@dipeshdulal
Created October 16, 2020 11:35
Show Gist options
  • Save dipeshdulal/017fc58c176d91c769a1bd8cf39f5880 to your computer and use it in GitHub Desktop.
Save dipeshdulal/017fc58c176d91c769a1bd8cf39f5880 to your computer and use it in GitHub Desktop.
Listen to changes in firestore

To authorize firebase:

  ctx := context.Background()

	opt := option.WithCredentialsFile("./serviceAccountKey.json")
	app, err := firebase.NewApp(ctx, nil, opt)
	if err != nil {
		log.Fatalf("Error %v \n", err)
	}

	client, err := app.Firestore(ctx)
	if err != nil {
		log.Fatalf("Error %v \n", err)
	}

To get the messages collections:

  iter := client.Collection("messages").Snapshots(ctx)
	if err != nil {
		log.Fatalf("Error %v \n", err)
	}
	defer iter.Stop()

	now := time.Now()

To listen for firestore changes:

   for {
		doc, err := iter.Next()
		if err != nil {
			if err == iterator.Done {
				break
			}
			log.Fatalf("Error %v \n", err)
		}
		for _, change := range doc.Changes {
			switch change.Kind {
			case firestore.DocumentAdded:
				if change.Doc.CreateTime.After(now) {
					log.Println("Document Added", change.Doc.Data())
				}
			case firestore.DocumentModified:
				if change.Doc.UpdateTime.After(now) {
					log.Println("Document modified", change.Doc.Data())
				}
			case firestore.DocumentRemoved:
				log.Println("Document removed", change.Doc.Data())
			}
		}
	}
package main
import (
"context"
"log"
"time"
"cloud.google.com/go/firestore"
firebase "firebase.google.com/go"
"google.golang.org/api/iterator"
"google.golang.org/api/option"
)
func main() {
ctx := context.Background()
opt := option.WithCredentialsFile("./serviceAccountKey.json")
app, err := firebase.NewApp(ctx, nil, opt)
if err != nil {
log.Fatalf("Error %v \n", err)
}
client, err := app.Firestore(ctx)
if err != nil {
log.Fatalf("Error %v \n", err)
}
iter := client.Collection("messages").Snapshots(ctx)
if err != nil {
log.Fatalf("Error %v \n", err)
}
defer iter.Stop()
now := time.Now()
for {
doc, err := iter.Next()
if err != nil {
if err == iterator.Done {
break
}
log.Fatalf("Error %v \n", err)
}
for _, change := range doc.Changes {
switch change.Kind {
case firestore.DocumentAdded:
if change.Doc.CreateTime.After(now) {
log.Println("Document Added", change.Doc.Data())
}
case firestore.DocumentModified:
if change.Doc.UpdateTime.After(now) {
log.Println("Document modified", change.Doc.Data())
}
case firestore.DocumentRemoved:
log.Println("Document removed", change.Doc.Data())
}
}
}
log.Printf("App created: %v \n", app)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment