|
|
|
@ -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()) |
|
|
|
|
} |
|
|
|
|