blob: 77ca6dd0c11c1d55d88d5657a41cccafb750cf6a [file] [log] [blame]
package status
import (
"context"
"time"
fs "cloud.google.com/go/firestore"
"go.skia.org/infra/go/firestore"
"go.skia.org/infra/go/skerr"
"go.skia.org/infra/go/util"
"golang.org/x/oauth2"
)
const (
// App name used for Firestore.
fsApp = "autoroll"
// Collection name for AutoRollStatus.
collectionStatus = "status"
// Firestore-related constants.
defaultAttempts = 3
defaultTimeout = 10 * time.Second
)
// FirestoreDB implements DB using Firestore.
type FirestoreDB struct {
client *firestore.Client
coll *fs.CollectionRef
exportDB DB
}
// NewFirestoreDBWithParams returns a FirestoreDB instance using the given params.
func NewFirestoreDBWithParams(ctx context.Context, project, namespace, instance string, ts oauth2.TokenSource) (*FirestoreDB, error) {
client, err := firestore.NewClient(ctx, project, namespace, instance, ts)
if err != nil {
return nil, skerr.Wrap(err)
}
return NewFirestoreDB(ctx, client)
}
// NewFirestoreDB returns a FirestoreDB instance using the given Client.
func NewFirestoreDB(ctx context.Context, client *firestore.Client) (*FirestoreDB, error) {
return &FirestoreDB{
client: client,
coll: client.Collection(collectionStatus),
}, nil
}
// Close the DB.
func (d *FirestoreDB) Close() error {
return skerr.Wrap(d.client.Close())
}
// Get implements DB.
func (d *FirestoreDB) Get(ctx context.Context, rollerID string) (*AutoRollStatus, error) {
ref := d.coll.Doc(rollerID)
doc, err := d.client.Get(ctx, ref, defaultAttempts, defaultTimeout)
if err != nil {
return nil, skerr.Wrapf(err, "retrieving config for %s", rollerID)
}
rv := new(AutoRollStatus)
if err := doc.DataTo(rv); err != nil {
return nil, skerr.Wrapf(err, "decoding config for %s", rollerID)
}
return rv, nil
}
// Set implements DB.
func (d *FirestoreDB) Set(ctx context.Context, rollerID string, st *AutoRollStatus) error {
ref := d.coll.Doc(rollerID)
if _, err := ref.Set(ctx, st); err != nil {
return skerr.Wrap(err)
}
if d.exportDB != nil && util.In(rollerID, exportRollers) {
exportStatus := &AutoRollStatus{
AutoRollMiniStatus: st.AutoRollMiniStatus,
}
if err := d.exportDB.Set(ctx, rollerID, exportStatus); err != nil {
return skerr.Wrap(err)
}
}
return nil
}
var _ DB = &FirestoreDB{}