Function update one now considers the protection key using the update operator

v2
Nikita Tokarchuk 3 years ago
parent c1ad7aea7d
commit 86397885e2
No known key found for this signature in database
GPG Key ID: DBFD964471BAE65C
  1. 17
      mongox/base/protection/key.go
  2. 15
      mongox/database/updateone.go
  3. 17
      mongox/query/compose.go

@ -3,6 +3,7 @@ package protection
import (
"time"
"github.com/modern-go/reflect2"
"go.mongodb.org/mongo-driver/bson/primitive"
)
@ -12,6 +13,22 @@ type Key struct {
V int64 `bson:"_v" json:"_v"`
}
// PutToDocument extends the doc with protection key values
func (k *Key) PutToDocument(doc primitive.M) {
if reflect2.IsNil(doc) {
return
}
if k.X.IsZero() {
doc["_x"] = primitive.M{"$exists": false}
doc["_v"] = primitive.M{"$exists": false}
} else {
doc["_x"] = k.X
doc["_v"] = k.V
}
}
// Restate creates a new protection key
func (k *Key) Restate() {
k.X = primitive.NewObjectID()

@ -1,6 +1,7 @@
package database
import (
"github.com/modern-go/reflect2"
"go.mongodb.org/mongo-driver/bson/primitive"
"go.mongodb.org/mongo-driver/mongo/options"
@ -32,13 +33,15 @@ func (d *Database) UpdateOne(target interface{}, filters ...interface{}) (err er
if !protected.X.IsZero() {
query.Push(composed, protected)
}
//updater = append(updater, primitive.M{
// "$set": primitive.M{
// "_x": primitive.NewObjectID(),
// "_v": time.Now().Unix(),
// },
//})
protected.Restate()
setCmd, _ := updaterDoc["$set"].(primitive.M)
if reflect2.IsNil(setCmd) {
setCmd = primitive.M{}
}
protected.PutToDocument(setCmd)
updaterDoc["$set"] = setCmd
}
defer func() {

@ -107,28 +107,19 @@ func applySkip(query *Query, filter interface{}) (ok bool) {
func applyProtection(query *Query, filter interface{}) (ok bool) {
var x *primitive.ObjectID
var v *int64
var keyDoc = primitive.M{}
switch filter := filter.(type) {
case protection.Key:
x = &filter.X
v = &filter.V
filter.PutToDocument(keyDoc)
case *protection.Key:
x = &filter.X
v = &filter.V
filter.PutToDocument(keyDoc)
default:
return false
}
if x.IsZero() {
query.And(primitive.M{"_x": primitive.M{"$exists": false}})
query.And(primitive.M{"_v": primitive.M{"$exists": false}})
} else {
query.And(primitive.M{"_x": *x})
query.And(primitive.M{"_v": *v})
}
query.And(keyDoc)
return true
}

Loading…
Cancel
Save