From bb37212be74073b9fc36850572dc10d4a930f609 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E2=98=99=E2=97=A6=20The=20Tablet=20=E2=9D=80=20GamerGirla?=
 =?UTF-8?q?ndCo=20=E2=97=A6=E2=9D=A7?= <i.am.the.tablet@proton.me>
Date: Wed, 26 Mar 2025 23:25:44 -0400
Subject: [PATCH] fix `doSave` calls to check if the document's ID is a zero
 value

---
 document.go |  6 ++++--
 util.go     | 21 +++++++++++++++++++++
 2 files changed, 25 insertions(+), 2 deletions(-)

diff --git a/document.go b/document.go
index 7824d25..b76d561 100644
--- a/document.go
+++ b/document.go
@@ -96,13 +96,15 @@ func (d *Document) Save() error {
 	if val.Kind() == reflect.Slice {
 		for i := 0; i < val.Len(); i++ {
 			cur := val.Index(i)
-			if err := doSave(d.model.getColl(), !d.exists, cur.Interface()); err != nil {
+			asHId := asId(cur.Interface())
+			if err := doSave(d.model.getColl(), !d.exists && reflect.ValueOf(asHId.Id()).IsZero(), cur.Interface()); err != nil {
 				return err
 			}
 		}
 		return nil
 	} else {
-		return doSave(d.model.getColl(), !d.exists, d.self)
+		asHId := asId(val.Interface())
+		return doSave(d.model.getColl(), !d.exists && reflect.ValueOf(asHId.Id()).IsZero(), d.self)
 	}
 }
 
diff --git a/util.go b/util.go
index 9cd910a..fff292d 100644
--- a/util.go
+++ b/util.go
@@ -39,6 +39,27 @@ func valueOf(i interface{}) reflect.Value {
 	return v
 }
 
+func asId(i interface{}) HasID {
+	v := reflect.ValueOf(i)
+	var asHasId HasID
+	var ok bool
+	switch v.Kind() {
+	case reflect.Struct:
+		v = reflect.New(reflect.PointerTo(v.Type()))
+		fallthrough
+	case reflect.Pointer:
+		asHasId, ok = v.Interface().(HasID)
+		if ok {
+			return asHasId
+		} else {
+			panic("value does not implemenet `HasId`!")
+		}
+	default:
+		break
+	}
+	return asHasId
+}
+
 func coerceInt(input reflect.Value, dst reflect.Value) interface{} {
 	if input.Type().Kind() == reflect.Pointer {
 		input = input.Elem()