Search: Add uid:... search filter #1820
This commit is contained in:
parent
bf9a33383b
commit
2636255c95
|
@ -17,7 +17,7 @@ const (
|
|||
)
|
||||
|
||||
func PublishPhotoEvent(e EntityEvent, uid string, c *gin.Context) {
|
||||
f := form.SearchPhotos{ID: uid, Merged: true}
|
||||
f := form.SearchPhotos{UID: uid, Merged: true}
|
||||
result, _, err := search.Photos(f)
|
||||
|
||||
if err != nil {
|
||||
|
@ -30,7 +30,7 @@ func PublishPhotoEvent(e EntityEvent, uid string, c *gin.Context) {
|
|||
}
|
||||
|
||||
func PublishAlbumEvent(e EntityEvent, uid string, c *gin.Context) {
|
||||
f := form.SearchAlbums{ID: uid}
|
||||
f := form.SearchAlbums{UID: uid}
|
||||
result, err := search.Albums(f)
|
||||
|
||||
if err != nil {
|
||||
|
@ -43,7 +43,7 @@ func PublishAlbumEvent(e EntityEvent, uid string, c *gin.Context) {
|
|||
}
|
||||
|
||||
func PublishLabelEvent(e EntityEvent, uid string, c *gin.Context) {
|
||||
f := form.SearchLabels{ID: uid}
|
||||
f := form.SearchLabels{UID: uid}
|
||||
result, err := search.Labels(f)
|
||||
|
||||
if err != nil {
|
||||
|
@ -56,7 +56,7 @@ func PublishLabelEvent(e EntityEvent, uid string, c *gin.Context) {
|
|||
}
|
||||
|
||||
func PublishSubjectEvent(e EntityEvent, uid string, c *gin.Context) {
|
||||
f := form.SearchSubjects{ID: uid}
|
||||
f := form.SearchSubjects{UID: uid}
|
||||
result, err := search.Subjects(f)
|
||||
|
||||
if err != nil {
|
||||
|
|
|
@ -28,7 +28,7 @@ func GetFace(router *gin.RouterGroup) {
|
|||
return
|
||||
}
|
||||
|
||||
f := form.SearchFaces{ID: c.Param("id"), Markers: true}
|
||||
f := form.SearchFaces{UID: c.Param("id"), Markers: true}
|
||||
|
||||
if results, err := search.Faces(f); err != nil || len(results) < 1 {
|
||||
Abort(c, http.StatusNotFound, i18n.ErrFaceNotFound)
|
||||
|
|
|
@ -35,7 +35,7 @@ func SearchAlbums(router *gin.RouterGroup) {
|
|||
|
||||
// Guest permissions are limited to shared albums.
|
||||
if s.Guest() {
|
||||
f.ID = s.Shares.Join(txt.Or)
|
||||
f.UID = s.Shares.Join(txt.Or)
|
||||
}
|
||||
|
||||
result, err := search.Albums(f)
|
||||
|
|
|
@ -3,7 +3,7 @@ package form
|
|||
// SearchAlbums represents search form fields for "/api/v1/albums".
|
||||
type SearchAlbums struct {
|
||||
Query string `form:"q"`
|
||||
ID string `form:"id"`
|
||||
UID string `form:"uid"`
|
||||
Type string `form:"type"`
|
||||
Location string `form:"location"`
|
||||
Category string `form:"category"`
|
||||
|
|
|
@ -3,7 +3,7 @@ package form
|
|||
// SearchFaces represents search form fields for "/api/v1/faces".
|
||||
type SearchFaces struct {
|
||||
Query string `form:"q"`
|
||||
ID string `form:"id"`
|
||||
UID string `form:"uid"`
|
||||
Subject string `form:"subject"`
|
||||
Unknown string `form:"unknown"`
|
||||
Hidden string `form:"hidden"`
|
||||
|
|
|
@ -3,7 +3,7 @@ package form
|
|||
// SearchLabels represents search form fields for "/api/v1/labels".
|
||||
type SearchLabels struct {
|
||||
Query string `form:"q"`
|
||||
ID string `form:"id"`
|
||||
UID string `form:"uid"`
|
||||
Slug string `form:"slug"`
|
||||
Name string `form:"name"`
|
||||
All bool `form:"all"`
|
||||
|
|
|
@ -8,7 +8,7 @@ import (
|
|||
type SearchPhotos struct {
|
||||
Query string `form:"q"`
|
||||
Filter string `form:"filter"`
|
||||
ID string `form:"id"`
|
||||
UID string `form:"uid"`
|
||||
Type string `form:"type"`
|
||||
Path string `form:"path"`
|
||||
Folder string `form:"folder"` // Alias for Path
|
||||
|
|
|
@ -3,7 +3,7 @@ package form
|
|||
// SearchSubjects represents search form fields for "/api/v1/subjects".
|
||||
type SearchSubjects struct {
|
||||
Query string `form:"q"`
|
||||
ID string `form:"id"`
|
||||
UID string `form:"uid"`
|
||||
Type string `form:"type"`
|
||||
Name string `form:"name"`
|
||||
All bool `form:"all"`
|
||||
|
|
|
@ -94,7 +94,9 @@ func Unserialize(f SearchForm, q string) (result error) {
|
|||
if unicode.IsSpace(char) && !escaped {
|
||||
if isKeyValue {
|
||||
fieldName := strings.Title(string(key))
|
||||
field := formValues.FieldByName(fieldName)
|
||||
field := formValues.FieldByNameFunc(func(name string) bool {
|
||||
return strings.EqualFold(name, fieldName)
|
||||
})
|
||||
stringValue := string(value)
|
||||
|
||||
if field.CanSet() {
|
||||
|
|
|
@ -91,8 +91,8 @@ func Albums(f form.SearchAlbums) (results AlbumResults, err error) {
|
|||
s = s.Order("albums.album_favorite DESC, albums.album_title ASC, albums.album_uid DESC")
|
||||
}
|
||||
|
||||
if f.ID != "" {
|
||||
s = s.Where("albums.album_uid IN (?)", strings.Split(f.ID, txt.Or))
|
||||
if f.UID != "" {
|
||||
s = s.Where("albums.album_uid IN (?)", strings.Split(strings.ToLower(f.UID), txt.Or))
|
||||
|
||||
if result := s.Scan(&results); result.Error != nil {
|
||||
return results, result.Error
|
||||
|
|
|
@ -96,7 +96,7 @@ func TestAlbums(t *testing.T) {
|
|||
t.Run("search for existing ID", func(t *testing.T) {
|
||||
f := form.SearchAlbums{
|
||||
Query: "",
|
||||
ID: "at9lxuqxpogaaba7",
|
||||
UID: "at9lxuqxpogaaba7",
|
||||
Slug: "",
|
||||
Title: "",
|
||||
Favorite: false,
|
||||
|
|
|
@ -72,8 +72,8 @@ func Faces(f form.SearchFaces) (results FaceResults, err error) {
|
|||
}
|
||||
|
||||
// Find specific IDs?
|
||||
if f.ID != "" {
|
||||
s = s.Where(fmt.Sprintf("%s.id IN (?)", facesTable), strings.Split(strings.ToUpper(f.ID), txt.Or))
|
||||
if f.UID != "" {
|
||||
s = s.Where(fmt.Sprintf("%s.id IN (?)", facesTable), strings.Split(strings.ToUpper(f.UID), txt.Or))
|
||||
|
||||
if result := s.Scan(&results); result.Error != nil {
|
||||
return results, result.Error
|
||||
|
|
|
@ -26,7 +26,7 @@ func TestFaces(t *testing.T) {
|
|||
assert.LessOrEqual(t, 1, len(results))
|
||||
})
|
||||
t.Run("Find specific id", func(t *testing.T) {
|
||||
results, err := Faces(form.SearchFaces{ID: "PN6QO5INYTUSAATOFL43LL2ABAV5ACZK", Markers: true})
|
||||
results, err := Faces(form.SearchFaces{UID: "PN6QO5INYTUSAATOFL43LL2ABAV5ACZK", Markers: true})
|
||||
assert.NoError(t, err)
|
||||
t.Logf("Faces: %#v", results)
|
||||
assert.LessOrEqual(t, 1, len(results))
|
||||
|
|
|
@ -41,8 +41,8 @@ func Labels(f form.SearchLabels) (results []Label, err error) {
|
|||
s = s.Order("labels.label_favorite DESC, custom_slug ASC")
|
||||
}
|
||||
|
||||
if f.ID != "" {
|
||||
s = s.Where("labels.label_uid IN (?)", strings.Split(f.ID, txt.Or))
|
||||
if f.UID != "" {
|
||||
s = s.Where("labels.label_uid IN (?)", strings.Split(strings.ToLower(f.UID), txt.Or))
|
||||
|
||||
if result := s.Scan(&results); result.Error != nil {
|
||||
return results, result.Error
|
||||
|
|
|
@ -111,7 +111,7 @@ func TestLabels(t *testing.T) {
|
|||
t.Run("search for ID", func(t *testing.T) {
|
||||
f := form.SearchLabels{
|
||||
Query: "",
|
||||
ID: "lt9k3pw1wowuy3c4",
|
||||
UID: "lt9k3pw1wowuy3c4",
|
||||
Slug: "",
|
||||
Name: "",
|
||||
All: false,
|
||||
|
|
|
@ -93,22 +93,25 @@ func Photos(f form.SearchPhotos) (results PhotoResults, count int, err error) {
|
|||
s = s.Where("files.file_primary = 1")
|
||||
}
|
||||
|
||||
// Shortcut for known photo ids.
|
||||
if f.ID != "" {
|
||||
s = s.Where("photos.photo_uid IN (?)", strings.Split(f.ID, txt.Or))
|
||||
s = s.Order("files.file_primary DESC")
|
||||
if f.UID != "" {
|
||||
s = s.Where("photos.photo_uid IN (?)", strings.Split(strings.ToLower(f.UID), txt.Or))
|
||||
|
||||
if result := s.Scan(&results); result.Error != nil {
|
||||
return results, 0, result.Error
|
||||
// Take shortcut?
|
||||
if f.Album == "" && f.Albums == "" && f.Label == "" && f.Query == "" {
|
||||
s = s.Order("files.file_primary DESC")
|
||||
|
||||
if result := s.Scan(&results); result.Error != nil {
|
||||
return results, 0, result.Error
|
||||
}
|
||||
|
||||
log.Infof("photos: found %s for %s [%s]", english.Plural(len(results), "result", "results"), f.SerializeAll(), time.Since(start))
|
||||
|
||||
if f.Merged {
|
||||
return results.Merged()
|
||||
}
|
||||
|
||||
return results, len(results), nil
|
||||
}
|
||||
|
||||
log.Infof("photos: found %s for %s [%s]", english.Plural(len(results), "result", "results"), f.SerializeAll(), time.Since(start))
|
||||
|
||||
if f.Merged {
|
||||
return results.Merged()
|
||||
}
|
||||
|
||||
return results, len(results), nil
|
||||
}
|
||||
|
||||
// Filter by label, label category and keywords.
|
||||
|
|
|
@ -68,7 +68,7 @@ func TestPhotos(t *testing.T) {
|
|||
frm.Query = ""
|
||||
frm.Count = 5000
|
||||
frm.Offset = 0
|
||||
frm.ID = "pt9jtdre2lvl0yh7"
|
||||
frm.UID = "pt9jtdre2lvl0yh7"
|
||||
frm.Merged = true
|
||||
|
||||
photos, _, err := Photos(frm)
|
||||
|
@ -84,7 +84,7 @@ func TestPhotos(t *testing.T) {
|
|||
frm.Query = ""
|
||||
frm.Count = 5000
|
||||
frm.Offset = 0
|
||||
frm.ID = "pt9jtdre2lvl0yh7"
|
||||
frm.UID = "pt9jtdre2lvl0yh7"
|
||||
frm.Merged = false
|
||||
|
||||
photos, _, err := Photos(frm)
|
||||
|
|
|
@ -46,8 +46,8 @@ func Subjects(f form.SearchSubjects) (results SubjectResults, err error) {
|
|||
s = s.Order("subj_favorite DESC, subj_name")
|
||||
}
|
||||
|
||||
if f.ID != "" {
|
||||
s = s.Where(fmt.Sprintf("%s.subj_uid IN (?)", subjTable), strings.Split(f.ID, txt.Or))
|
||||
if f.UID != "" {
|
||||
s = s.Where(fmt.Sprintf("%s.subj_uid IN (?)", subjTable), strings.Split(strings.ToLower(f.UID), txt.Or))
|
||||
|
||||
if result := s.Scan(&results); result.Error != nil {
|
||||
return results, result.Error
|
||||
|
|
|
@ -77,7 +77,7 @@ func TestSubjects(t *testing.T) {
|
|||
assert.LessOrEqual(t, 1, len(results))
|
||||
})
|
||||
t.Run("search for ID", func(t *testing.T) {
|
||||
results, err := Subjects(form.SearchSubjects{Type: entity.SubjPerson, ID: "jqy3y652h8njw0sx"})
|
||||
results, err := Subjects(form.SearchSubjects{Type: entity.SubjPerson, UID: "jqy3y652h8njw0sx"})
|
||||
assert.NoError(t, err)
|
||||
//t.Logf("Subjects: %#v", results)
|
||||
assert.Equal(t, "Joe Biden", results[0].SubjName)
|
||||
|
|
Loading…
Reference in a new issue