From ac9b808a3e8c6d91ac62ccd10af1763bb01baf66 Mon Sep 17 00:00:00 2001 From: Nikita Tokarchuk Date: Thu, 7 Feb 2019 23:37:17 +0100 Subject: [PATCH] Protected delete --- mongox/common/deleteone.go | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/mongox/common/deleteone.go b/mongox/common/deleteone.go index d18cef8..8f72c8e 100644 --- a/mongox/common/deleteone.go +++ b/mongox/common/deleteone.go @@ -2,10 +2,13 @@ package common import ( "github.com/mainnika/mongox-go-driver/mongox" + "github.com/mainnika/mongox-go-driver/mongox/base" "github.com/mainnika/mongox-go-driver/mongox/errors" "github.com/mainnika/mongox-go-driver/mongox/query" + "github.com/mongodb/mongo-go-driver/bson/primitive" "github.com/mongodb/mongo-go-driver/mongo" "github.com/mongodb/mongo-go-driver/mongo/options" + "time" ) // DeleteOne removes a document from a database and then returns it into target @@ -14,9 +17,23 @@ func DeleteOne(db *mongox.Database, target interface{}, filters ...interface{}) collection := db.GetCollectionOf(target) opts := &options.FindOneAndDeleteOptions{} composed := query.Compose(filters...) + protected := base.GetProtection(target) opts.Sort = composed.Sorter() + if protected != nil { + if protected.X.IsZero() { + composed.And(primitive.M{"_x": primitive.M{"$exists": false}}) + composed.And(primitive.M{"_v": primitive.M{"$exists": false}}) + } else { + composed.And(primitive.M{"_x": protected.X}) + composed.And(primitive.M{"_v": protected.V}) + } + + protected.X = primitive.NewObjectID() + protected.V = time.Now().Unix() + } + result := collection.FindOneAndDelete(db.Context(), composed.M(), opts) if result.Err() != nil { return errors.InternalErrorf("can't create find one and delete result: %s", result.Err())