view calsync/mongoclient/cals_collection.go @ 50:dade5bbd02e3

refactor
author drewp@bigasterisk.com
date Mon, 19 Aug 2024 13:37:05 -0700
parents
children a9b720445bcf
line wrap: on
line source

package mongoclient

import (
	"log"

	"go.mongodb.org/mongo-driver/bson"
	"go.mongodb.org/mongo-driver/mongo/options"
)

// docs in calsCollection
type MongoCal struct {
	Url         string `bson:"_id"` // bigasterisk.com/...
	GoogleId    string `bson:"googleId"`
	Summary     string `bson:"summary"`
	Description string `bson:"description"`
}

func (c *MongoClient) GetAllCals() ([]MongoCal, error) {
	cur, err := c.calsCollection.Find(c.ctx, bson.D{})
	if err != nil {
		return nil, err
	}
	defer cur.Close(c.ctx)

	var cals []MongoCal
	for cur.Next(c.ctx) {
		var cal MongoCal
		if err := cur.Decode(&cal); err != nil {
			return nil, err
		}
		cals = append(cals, cal)
	}
	return cals, nil
}

func (c *MongoClient) GetOneCal(calId string) (MongoCal, error) {
	res := c.calsCollection.FindOne(c.ctx, bson.M{"_id": calId})
	var cal MongoCal
	err := res.Decode(&cal)
	return cal, err
}

func (c *MongoClient) UpsertOneCal(cal MongoCal) error {
	filter := bson.M{"_id": cal.Url}
	update := bson.M{"$set": cal}
	_, err := c.calsCollection.UpdateOne(c.ctx, filter, update,
		options.Update().SetUpsert(true))
	if err != nil {
		return err
	}
	return nil
}

func (c *MongoClient) DeleteCalsNotInSet(urlsToKeep map[string]bool) error {
	curs, err := c.calsCollection.Find(c.ctx, bson.M{})
	if err != nil {
		return err
	}
	defer curs.Close(c.ctx)

	for curs.Next(c.ctx) {
		var doc bson.M
		err = curs.Decode(&doc)
		if err != nil {
			return err
		}
		calUrl, ok := doc["_id"].(string)
		if !ok {
			continue
		}
		if !urlsToKeep[calUrl] {
			log.Println("  cleaning up", calUrl)
			_, err = c.calsCollection.DeleteOne(c.ctx, bson.M{"_id": doc["_id"]})
			if err != nil {
				return err
			}
		}
	}
	return curs.Err()
}