carpool-incentives/storage/mongodb.go

93 lines
2.4 KiB
Go

package storage
import (
"context"
"fmt"
"github.com/spf13/viper"
"go.mongodb.org/mongo-driver/bson"
"go.mongodb.org/mongo-driver/mongo"
"go.mongodb.org/mongo-driver/mongo/options"
)
type MongoDBStorage struct {
*mongo.Client
DbName string
Collections map[string]string
}
func NewMongoDBStorage(cfg *viper.Viper) (MongoDBStorage, error) {
var (
mongodb_uri = cfg.GetString("storage.db.mongodb.uri")
mongodb_host = cfg.GetString("storage.db.mongodb.host")
mongodb_port = cfg.GetString("storage.db.mongodb.port")
mongodb_dbname = cfg.GetString("storage.db.mongodb.db_name")
mongodb_incentives_subscriptions = cfg.GetString("storage.db.mongodb.collections.incentives_subscriptions")
mongodb_proofs = cfg.GetString("storage.db.mongodb.collections.proofs")
)
if mongodb_uri == "" {
mongodb_uri = fmt.Sprintf("mongodb://%s:%s/%s", mongodb_host, mongodb_port, mongodb_dbname)
}
client, err := mongo.NewClient(options.Client().ApplyURI(mongodb_uri))
if err != nil {
return MongoDBStorage{}, err
}
err = client.Connect(context.TODO())
if err != nil {
return MongoDBStorage{}, err
}
storage := MongoDBStorage{
Client: client,
DbName: mongodb_dbname,
Collections: map[string]string{
"incentives_subscriptions": mongodb_incentives_subscriptions,
"proofs": mongodb_proofs,
},
}
return storage, nil
}
func (s MongoDBStorage) GetUserSubscriptions(userid string) ([]IncentiveSubscription, error) {
collection := s.Client.Database(s.DbName).Collection(s.Collections["incentives_subscriptions"])
subscriptions := []IncentiveSubscription{}
findOptions := options.Find()
cur, err := collection.Find(context.TODO(), bson.M{"user_id": userid}, findOptions)
if err != nil {
return nil, err
}
for cur.Next(context.TODO()) {
var subscription IncentiveSubscription
if err := cur.Decode(&subscription); err != nil {
return subscriptions, err
}
subscriptions = append(subscriptions, subscription)
}
return subscriptions, nil
}
func (s MongoDBStorage) SubscribeIncentive(incentive_subscription IncentiveSubscription) error {
collection := s.Client.Database(s.DbName).Collection(s.Collections["incentives_subscriptions"])
if _, err := collection.InsertOne(context.TODO(), incentive_subscription); err != nil {
return err
}
return nil
}
func (psql MongoDBStorage) Migrate() error {
return nil
}