126 lines
3.9 KiB
Go
126 lines
3.9 KiB
Go
package dbAccess
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"git.fjla.uk/owlboard/go-types/pkg/database"
|
|
"git.fjla.uk/owlboard/timetable-mgr/helpers"
|
|
"git.fjla.uk/owlboard/timetable-mgr/log"
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
"go.uber.org/zap"
|
|
)
|
|
|
|
const timetableCollection string = "timetable"
|
|
|
|
// CAUTION: Drops the collection named in collectionName
|
|
func DropCollection(collectionName string) error {
|
|
log.Msg.Info("Dropping collection", zap.String("Collection Name", collectionName))
|
|
database := MongoClient.Database(databaseName)
|
|
collection := database.Collection(collectionName)
|
|
|
|
err := collection.Drop(context.Background())
|
|
if err != nil {
|
|
log.Msg.Error("Error dropping collection", zap.String("Collection Name", collectionName), zap.Error(err))
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Checks the update time (unix timestamp) of the collection named in collectionName, uses 'type: collection' entries in the meta collection
|
|
func CheckUpdateTime(collectionName string) (int64, error) {
|
|
database := MongoClient.Database(databaseName)
|
|
collection := database.Collection(metaCollection)
|
|
filter := bson.D{
|
|
{Key: "target", Value: collectionName},
|
|
{Key: "type", Value: "collection"},
|
|
}
|
|
var result struct {
|
|
Updated int64 `bson:"updated"`
|
|
}
|
|
err := collection.FindOne(context.Background(), filter).Decode(&result)
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
return result.Updated, nil
|
|
}
|
|
|
|
// Sets a new update time (unix timestamp) of the collection named in collectionName. The update time is calculated within the function.
|
|
func SetUpdateTime(collectionName string) error {
|
|
log.Msg.Info("Setting update time", zap.String("collection", collectionName))
|
|
database := MongoClient.Database(databaseName)
|
|
collection := database.Collection("meta")
|
|
options := options.Update().SetUpsert(true)
|
|
updateTime := time.Now().Unix()
|
|
filter := bson.M{
|
|
"target": collectionName,
|
|
"type": "collection",
|
|
}
|
|
update := bson.M{
|
|
"$set": bson.M{
|
|
"updated": updateTime,
|
|
"updated_time": time.Now().In(time.UTC),
|
|
"target": collectionName,
|
|
"type": "collection",
|
|
},
|
|
}
|
|
_, err := collection.UpdateOne(context.Background(), filter, update, options)
|
|
|
|
if err != nil {
|
|
log.Msg.Error("Error setting update time", zap.String("collection", collectionName), zap.Error(err))
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// Pushes the current version of this application to the data base 'versions' collection.
|
|
// Currently uses the old name of mq-client
|
|
func PushVersionToDb() {
|
|
version := database.Version{
|
|
Target: "timetable-mgr",
|
|
Component: "timetable-mgr",
|
|
Version: helpers.Version,
|
|
}
|
|
versionSelector := database.VersionSelector{
|
|
Target: "timetable-mgr",
|
|
Component: "timetable-mgr",
|
|
}
|
|
opts := options.Update().SetUpsert(true)
|
|
coll := MongoClient.Database("owlboard").Collection("versions")
|
|
_, err := coll.UpdateOne(context.TODO(), versionSelector, bson.M{"$set": version}, opts)
|
|
if err != nil {
|
|
log.Msg.Warn("Unable to push version to database: " + err.Error())
|
|
} else {
|
|
log.Msg.Debug("Version up to date in Database")
|
|
}
|
|
}
|
|
|
|
// Puts one item of the type `database.Service` to the database, used by the VSTP package which receives services one at a time
|
|
func PutOneService(data database.Service) bool {
|
|
coll := MongoClient.Database(databaseName).Collection(timetableCollection)
|
|
_, err := coll.InsertOne(context.TODO(), data)
|
|
if err != nil {
|
|
log.Msg.Error("Unable to insert to database: " + err.Error())
|
|
return false
|
|
}
|
|
return true
|
|
}
|
|
|
|
// Deletes one service from the database.
|
|
func DeleteOneService(data database.DeleteQuery) bool {
|
|
coll := MongoClient.Database(databaseName).Collection(timetableCollection)
|
|
var filter = bson.D{
|
|
{Key: "trainUid", Value: data.TrainUid},
|
|
{Key: "stpIndicator", Value: data.StpIndicator},
|
|
{Key: "scheduleStartDate", Value: data.ScheduleStartDate},
|
|
}
|
|
_, err := coll.DeleteOne(context.TODO(), filter)
|
|
if err != nil {
|
|
log.Msg.Error("Unable to delete service: " + err.Error())
|
|
return false
|
|
}
|
|
return true
|
|
}
|