From 3a6eda141f682251582d25a5f53da38b5c5fd50c Mon Sep 17 00:00:00 2001 From: Nikita Tokarchuk Date: Thu, 7 Feb 2019 23:38:06 +0100 Subject: [PATCH] Protected save --- mongox/common/saveone.go | 19 ++++++++++++++++++- 1 file changed, 18 insertions(+), 1 deletion(-) diff --git a/mongox/common/saveone.go b/mongox/common/saveone.go index 43f2263..cd4e5b1 100644 --- a/mongox/common/saveone.go +++ b/mongox/common/saveone.go @@ -5,7 +5,9 @@ import ( "github.com/mainnika/mongox-go-driver/mongox/base" "github.com/mainnika/mongox-go-driver/mongox/errors" "github.com/mongodb/mongo-go-driver/bson" + "github.com/mongodb/mongo-go-driver/bson/primitive" "github.com/mongodb/mongo-go-driver/mongo/options" + "time" ) // SaveOne saves a single source document to the database @@ -14,11 +16,26 @@ func SaveOne(db *mongox.Database, source interface{}) error { collection := db.GetCollectionOf(source) opts := options.FindOneAndReplace() id := base.GetID(source) + protected := base.GetProtection(source) + filter := bson.M{"_id": id} opts.SetUpsert(true) opts.SetReturnDocument(options.After) - result := collection.FindOneAndReplace(db.Context(), bson.M{"_id": id}, source, opts) + if protected != nil { + if protected.X.IsZero() { + filter["_x"] = primitive.M{"$exists": false} + filter["_v"] = primitive.M{"$exists": false} + } else { + filter["_x"] = protected.X + filter["_v"] = protected.V + } + + protected.X = primitive.NewObjectID() + protected.V = time.Now().Unix() + } + + result := collection.FindOneAndReplace(db.Context(), filter, source, opts) if result.Err() != nil { return errors.NotFoundErrorf("%s", result.Err()) }