Entities: Improve Stringer interface implementations for logging #4490

Signed-off-by: Michael Mayer <michael@photoprism.app>
This commit is contained in:
Michael Mayer 2024-08-29 10:35:18 +02:00
parent f6b5d03465
commit fc5d8cb9a9
14 changed files with 119 additions and 12 deletions

View file

@ -435,6 +435,10 @@ func (m *Album) BeforeCreate(scope *gorm.Scope) error {
// String returns the id or name as string.
func (m *Album) String() string {
if m == nil {
return "Album<nil>"
}
if m.AlbumSlug != "" {
return clean.Log(m.AlbumSlug)
}
@ -447,7 +451,7 @@ func (m *Album) String() string {
return clean.Log(m.AlbumUID)
}
return "[unknown album]"
return "*Album"
}
// IsMoment tests if the album is of type moment.

View file

@ -482,7 +482,7 @@ func TestAlbum_String(t *testing.T) {
AlbumType: AlbumManual,
AlbumTitle: "",
}
assert.Equal(t, "[unknown album]", album.String())
assert.Equal(t, "*Album", album.String())
})
}

View file

@ -542,6 +542,10 @@ func (m *User) SetUploadPath(dir string) *User {
// String returns an identifier that can be used in logs.
func (m *User) String() string {
if m == nil {
return "User<nil>"
}
if n := m.Username(); n != "" {
return clean.LogQuote(n)
} else if n = m.FullName(); n != "" {

View file

@ -143,6 +143,10 @@ func FirstOrCreateCamera(m *Camera) *Camera {
// String returns an identifier that can be used in logs.
func (m *Camera) String() string {
if m == nil {
return "Camera<nil>"
}
return clean.Log(m.CameraName)
}

View file

@ -142,6 +142,10 @@ func FirstOrCreateLens(m *Lens) *Lens {
// String returns an identifier that can be used in logs.
func (m *Lens) String() string {
if m == nil {
return "Lens<nil>"
}
return clean.Log(m.LensName)
}

View file

@ -255,5 +255,9 @@ func FindValidLinks(token, shared string) (found Links) {
// String returns a human-readable identifier for use in logs.
func (m *Link) String() string {
if m == nil {
return "Link<nil>"
}
return clean.Log(m.LinkUID)
}

View file

@ -358,7 +358,7 @@ func (m *Marker) SyncSubject(updateRelated bool) (err error) {
UpdateColumns(Map{"subj_uid": m.SubjUID, "subj_src": SrcAuto, "marker_review": false}).Error; err != nil {
return fmt.Errorf("%s (update related markers)", err)
} else if res.RowsAffected > 0 && m.face != nil {
log.Debugf("markers: matched %s with %s", subj.SubjName, m.FaceID)
log.Debugf("markers: matched %s with %s", subj, m.FaceID)
return m.face.RefreshPhotos()
}
@ -691,6 +691,21 @@ func (m *Marker) Uncertainty() int {
return 50
}
// String returns the id or name as string.
func (m *Marker) String() string {
if m == nil {
return "Marker<nil>"
}
if m.MarkerName != "" {
return m.MarkerName
} else if m.MarkerUID != "" {
return m.MarkerUID
}
return "*Marker"
}
// FindMarker returns an existing row if exists.
func FindMarker(markerUid string) *Marker {
if markerUid == "" {

View file

@ -1,6 +1,7 @@
package entity
import (
"fmt"
"testing"
"github.com/photoprism/photoprism/internal/form"
@ -662,3 +663,20 @@ func TestMarker_OverlapPercent(t *testing.T) {
assert.Equal(t, 0, m1.OverlapPercent(m3))
assert.Equal(t, 96, m1.OverlapPercent(m4))
}
func TestMarker_String(t *testing.T) {
t.Run("Nil", func(t *testing.T) {
var m *Marker
assert.Equal(t, "Marker<nil>", m.String())
assert.Equal(t, "Marker<nil>", fmt.Sprintf("%s", m))
})
t.Run("New", func(t *testing.T) {
m := &Marker{}
assert.Equal(t, "*Marker", m.String())
assert.Equal(t, "*Marker", fmt.Sprintf("%s", m))
})
t.Run("Name", func(t *testing.T) {
m := MarkerFixtures.Pointer("1000003-4")
assert.Equal(t, "Jens Mander", m.String())
})
}

View file

@ -142,5 +142,9 @@ func (m *Password) Empty() bool {
// String returns the BCrypt Password Hash.
func (m *Password) String() string {
if m == nil {
return ""
}
return m.Hash
}

View file

@ -239,6 +239,10 @@ func (m *Photo) GetUID() string {
// String returns the id or name as string.
func (m *Photo) String() string {
if m == nil {
return "Photo<nil>"
}
if m.PhotoName != "" {
return clean.Log(path.Join(m.PhotoPath, m.PhotoName))
} else if m.OriginalName != "" {
@ -249,7 +253,7 @@ func (m *Photo) String() string {
return fmt.Sprintf("id %d", m.ID)
}
return "(unknown)"
return "*Photo"
}
// FirstOrCreate fetches an existing row from the database or inserts a new one.

View file

@ -1,6 +1,7 @@
package entity
import (
"fmt"
"testing"
"time"
@ -329,17 +330,23 @@ func TestPhotos_UIDs(t *testing.T) {
}
func TestPhoto_String(t *testing.T) {
t.Run("ReturnOriginal", func(t *testing.T) {
photo := Photo{PhotoUID: "", PhotoName: "", OriginalName: "holidayOriginal"}
assert.Equal(t, "holidayOriginal", photo.String())
t.Run("Nil", func(t *testing.T) {
var m *Photo
assert.Equal(t, "Photo<nil>", m.String())
assert.Equal(t, "Photo<nil>", fmt.Sprintf("%s", m))
})
t.Run("Unknown", func(t *testing.T) {
photo := Photo{PhotoUID: "", PhotoName: "", OriginalName: ""}
assert.Equal(t, "(unknown)", photo.String())
t.Run("New", func(t *testing.T) {
m := &Photo{PhotoUID: "", PhotoName: "", OriginalName: ""}
assert.Equal(t, "*Photo", m.String())
assert.Equal(t, "*Photo", fmt.Sprintf("%s", m))
})
t.Run("Original", func(t *testing.T) {
m := Photo{PhotoUID: "", PhotoName: "", OriginalName: "holidayOriginal"}
assert.Equal(t, "holidayOriginal", m.String())
})
t.Run("UID", func(t *testing.T) {
photo := Photo{PhotoUID: "ps6sg6be2lvl0k53", PhotoName: "", OriginalName: ""}
assert.Equal(t, "uid ps6sg6be2lvl0k53", photo.String())
m := Photo{PhotoUID: "ps6sg6be2lvl0k53", PhotoName: "", OriginalName: ""}
assert.Equal(t, "uid ps6sg6be2lvl0k53", m.String())
})
}

View file

@ -60,6 +60,10 @@ func (m *Reaction) Emoji() react.Emoji {
// String returns the user reaction as string.
func (m *Reaction) String() string {
if m == nil {
return "Reaction<nil>"
}
return m.Reaction
}

View file

@ -530,3 +530,20 @@ func (m *Subject) MergeWith(other *Subject) error {
func (m *Subject) Links() Links {
return FindLinks("", m.SubjUID)
}
// String returns the id or name as string.
func (m *Subject) String() string {
if m == nil {
return "Subject<nil>"
}
if m.SubjName != "" {
return m.SubjName
} else if m.SubjSlug != "" {
return m.SubjSlug
} else if m.SubjUID != "" {
return m.SubjUID
}
return "*Subject"
}

View file

@ -1,6 +1,7 @@
package entity
import (
"fmt"
"testing"
"time"
@ -255,6 +256,23 @@ func TestSubject_Links(t *testing.T) {
})
}
func TestSubject_String(t *testing.T) {
t.Run("Nil", func(t *testing.T) {
var m *Subject
assert.Equal(t, "Subject<nil>", m.String())
assert.Equal(t, "Subject<nil>", fmt.Sprintf("%s", m))
})
t.Run("New", func(t *testing.T) {
m := &Subject{}
assert.Equal(t, "*Subject", m.String())
assert.Equal(t, "*Subject", fmt.Sprintf("%s", m))
})
t.Run("JohnDoe", func(t *testing.T) {
m := SubjectFixtures.Pointer("john-doe")
assert.Equal(t, "John Doe", m.String())
})
}
func TestSubject_Update(t *testing.T) {
t.Run("Success", func(t *testing.T) {
m := NewSubject("Update Me", SubjPerson, SrcAuto)