@@ -3,7 +3,9 @@ package main
33import (
44 "bytes"
55 "context"
6+ "encoding/csv"
67 "encoding/json"
8+ "errors"
79 "fmt"
810 "io"
911 "log"
@@ -13,6 +15,10 @@ import (
1315 "sync"
1416 "time"
1517
18+ "firebase.google.com/go/auth"
19+ "github.com/NdoleStudio/httpsms/pkg/telemetry"
20+ "google.golang.org/api/iterator"
21+
1622 "github.com/palantir/stacktrace"
1723
1824 "github.com/NdoleStudio/httpsms/pkg/di"
@@ -33,9 +39,47 @@ func main() {
3339 container := di .NewLiteContainer ()
3440 logger := container .Logger ()
3541
42+ authClient := container .FirebaseAuthClient ()
43+
44+ var users []* auth.ExportedUserRecord
45+ iter := authClient .Users (context .Background (), "" )
46+ for {
47+ user , err := iter .Next ()
48+ if errors .Is (err , iterator .Done ) {
49+ break
50+ }
51+ if err != nil {
52+ logger .Fatal (err )
53+ }
54+ users = append (users , user )
55+ }
56+
57+ logger .Info (fmt .Sprintf ("fetched %d users" , len (users )))
58+ exportUsers (logger , users )
59+
3660 logger .Info ("Starting experiments" )
3761}
3862
63+ func exportUsers (logger telemetry.Logger , users []* auth.ExportedUserRecord ) {
64+ records := [][]string {
65+ {"First name" , "Email address" , "External ID" },
66+ }
67+
68+ for _ , user := range users {
69+ records = append (records , []string {user .UserInfo .DisplayName , user .UserInfo .Email , user .UserInfo .UID })
70+ }
71+
72+ file , err := os .Create ("result.csv" )
73+ if err != nil {
74+ logger .Fatal (stacktrace .Propagate (err , "cannot create file" ))
75+ }
76+
77+ w := csv .NewWriter (file )
78+ if err = w .WriteAll (records ); err != nil {
79+ logger .Fatal (stacktrace .Propagate (err , "cannot write csv" ))
80+ }
81+ }
82+
3983func chunkBy [T any ](items []T , chunkSize int ) (chunks [][]T ) {
4084 for chunkSize < len (items ) {
4185 items , chunks = items [chunkSize :], append (chunks , items [0 :chunkSize :chunkSize ])
0 commit comments