parent
f3b8874c4d
commit
557788255e
@ -0,0 +1,43 @@ |
||||
package common |
||||
|
||||
import ( |
||||
"github.com/mainnika/mongox-go-driver/mongox" |
||||
"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" |
||||
) |
||||
|
||||
// SaveOne saves a single source document to the database
|
||||
func SaveOne(db *mongox.Database, source interface{}) error { |
||||
|
||||
collection := db.GetCollectionOf(source) |
||||
opts := &options.FindOneAndReplaceOptions{} |
||||
|
||||
opts.SetUpsert(true) |
||||
opts.SetReturnDocument(options.After) |
||||
|
||||
var id interface{} |
||||
|
||||
switch doc := source.(type) { |
||||
case mongox.BaseObjectID: |
||||
id = doc.GetID() |
||||
if id == primitive.NilObjectID { |
||||
id = primitive.NewObjectID() |
||||
} |
||||
case mongox.BaseString: |
||||
id = doc.GetID() |
||||
if id == "" { |
||||
panic(errors.Malformedf("source contains malformed document, %v", source)) |
||||
} |
||||
default: |
||||
panic(errors.Malformedf("source contains malformed document, %v", source)) |
||||
} |
||||
|
||||
result := collection.FindOneAndReplace(db.Context(), bson.M{"_id": id}, source, opts) |
||||
if result.Err() != nil { |
||||
return errors.NotFoundErrorf("%s", result.Err()) |
||||
} |
||||
|
||||
return result.Decode(source) |
||||
} |
Loading…
Reference in new issue