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