1
Fork 0
photoview/api/graphql/resolvers/search.go

76 lines
1.7 KiB
Go
Raw Normal View History

2020-03-05 11:53:42 +01:00
package resolvers
import (
"context"
"log"
"github.com/viktorstrate/photoview/api/graphql/auth"
"github.com/viktorstrate/photoview/api/graphql/models"
)
func (r *Resolver) Search(ctx context.Context, query string, _limitPhotos *int, _limitAlbums *int) (*models.SearchResult, error) {
user := auth.UserFromContext(ctx)
if user == nil {
return nil, auth.ErrUnauthorized
}
limitPhotos := 10
limitAlbums := 10
if _limitPhotos != nil {
limitPhotos = *_limitPhotos
}
if _limitAlbums != nil {
limitAlbums = *_limitAlbums
}
wildQuery := "%" + query + "%"
photoRows, err := r.Database.Query(`
SELECT photo.* FROM photo JOIN album ON photo.album_id = album.album_id
WHERE album.owner_id = ? AND photo.title LIKE ? OR photo.path LIKE ?
ORDER BY (
case when photo.title LIKE ? then 2
when photo.path LIKE ? then 1
end ) DESC
LIMIT ?
`, user.UserID, wildQuery, wildQuery, wildQuery, wildQuery, limitPhotos)
if err != nil {
log.Printf("ERROR: searching photos %s", err)
return nil, err
}
photos, err := models.NewPhotosFromRows(photoRows)
if err != nil {
return nil, err
}
albumRows, err := r.Database.Query(`
SELECT * FROM album
WHERE owner_id = ? AND title LIKE ? OR path LIKE ?
ORDER BY (
case when title LIKE ? then 2
when path LIKE ? then 1
end ) DESC
LIMIT ?
`, user.UserID, wildQuery, wildQuery, wildQuery, wildQuery, limitAlbums)
if err != nil {
log.Printf("ERROR: searching albums %s", err)
return nil, err
}
albums, err := models.NewAlbumsFromRows(albumRows)
if err != nil {
return nil, err
}
result := models.SearchResult{
Query: query,
Photos: photos,
Albums: albums,
}
return &result, nil
}