Skip to content

Commit

Permalink
added record.OriginalCopy() to return a record model copy with the or…
Browse files Browse the repository at this point in the history
…iginal/initial data
  • Loading branch information
ganigeorgiev committed Dec 2, 2022
1 parent d202814 commit 04018f9
Show file tree
Hide file tree
Showing 2 changed files with 43 additions and 0 deletions.
16 changes: 16 additions & 0 deletions models/record.go
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,8 @@ type Record struct {
ignoreEmailVisibility bool // whether to ignore the emailVisibility flag for auth collections
data map[string]any // any custom data in addition to the base model fields
expand map[string]any // expanded relations
loaded bool
originalData map[string]any // the original (aka. first loaded) model data
}

// NewRecord initializes a new empty Record model.
Expand Down Expand Up @@ -103,6 +105,15 @@ func (m *Record) Collection() *Collection {
return m.collection
}

// OriginalCopy returns a copy of the current record model populated
// with its original (aka. the initially loaded) data state.
func (m *Record) OriginalCopy() *Record {
newRecord := NewRecord(m.collection)
newRecord.Load(m.originalData)

return newRecord
}

// Expand returns a shallow copy of the record.expand data
// attached to the current Record model.
func (m *Record) Expand() map[string]any {
Expand Down Expand Up @@ -270,6 +281,11 @@ func (m *Record) FindFileFieldByFile(filename string) *schema.SchemaField {

// Load bulk loads the provided data into the current Record model.
func (m *Record) Load(data map[string]any) {
if !m.loaded {
m.loaded = true
m.originalData = data
}

for k, v := range data {
m.Set(k, v)
}
Expand Down
27 changes: 27 additions & 0 deletions models/record_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -331,6 +331,33 @@ func TestRecordCollection(t *testing.T) {
}
}

func TestRecordOriginalCopy(t *testing.T) {
m := models.NewRecord(&models.Collection{})
m.Load(map[string]any{"f": "123"})

// change the field
m.Set("f", "456")

if v := m.GetString("f"); v != "456" {
t.Fatalf("Expected f to be %q, got %q", "456", v)
}

if v := m.OriginalCopy().GetString("f"); v != "123" {
t.Fatalf("Expected the initial/original f to be %q, got %q", "123", v)
}

// Loading new data shouldn't affect the original state
m.Load(map[string]any{"f": "789"})

if v := m.GetString("f"); v != "789" {
t.Fatalf("Expected f to be %q, got %q", "789", v)
}

if v := m.OriginalCopy().GetString("f"); v != "123" {
t.Fatalf("Expected the initial/original f still to be %q, got %q", "123", v)
}
}

func TestRecordExpand(t *testing.T) {
collection := &models.Collection{}
m := models.NewRecord(collection)
Expand Down

0 comments on commit 04018f9

Please sign in to comment.